FPGA结构与片上资源

0.总览

可编程逻辑单元CLB(Configurable Logic Block)、可编程I/O单元和布线资源构成了FPGA内部三大主要资源。

本文以Xilinx 7系列FPGA为例进行FPGA结构和片上资源讲解,其采用28nm工艺节点。

1.可配置逻辑块CLB

可配置的逻辑块(CLB)是主要的逻辑资源,用于实现时序和组合逻辑电路

可配置逻辑单元(CLB)在 FPGA 中最为丰富,由两个 SLICE 组成。由于 SLICE 有 SLICEL(L:Logic)和 SLICEM(M:Memory)之分,因此 CLB 可分为 CLBLL 和 CLBLM 两类。

一个CLB包含两个SLICE:2个SLICEL或者1个SLICEL+一个SLICEM。

SLICEL和SLICEM内部都包含4个6输入查找表(Look-Up-Table,LUT6)、3个数据选择器(MUX)、1个进位链(Carry Chain)和8个触发器(Flip-Flop)。
在这里插入图片描述

1.1 6输入查找表(LUT6)

查找表Look-up Table,本质上就是1个6输入,64深度的ROM (SLICEM中的则是RAM,因为可读)。通过将所有结果保存在其内部,使用时通过由输入构建的地址线对其进行查找,从而实现6输入的函数逻辑。需要注意的是SLICEM中的查找表,除了读功能外还具备写功能,这就使得其内部的LUT由一个ROM变成了一个RAM,这也是其实现移位寄存器功能和分布式DRAM功能的原因。

虽然SLICEL和SLICEM的结构组成一样,但两者更细化的结构上略有不同,区别在于LUT6上(如下图所示),从而导致LUT6的功能有所不同(如下表格所示)。
在这里插入图片描述

LUT功能 SLICEL SLICEM
逻辑函数发生器
ROM
分布式RAM
移位寄存器

逻辑函数发生器:用作逻辑函数发生器时,查找表就扮演着真值表的角色,真值表的内容可在Vivado中查看。

ROM:不论是 SLICEL 还是 SLICEM,他们的 LUT6 都可以作为 ROM 使用,配置为 64x1(占用 1 个 LUT6,64 代表深度,1 代表宽度)、128x1(占用 2 个 LUT6)和 256(占用 4 个 LUT6)的 ROM。

分布式RAM: SLICEM中的查找表可配置为RAM ( Random Access Memory),称为分布式RAM。其中 RAM 的写操作为同步,而读操作是异步的,即与时钟信号无关。如果要实现同步读操作,则要额外占用一个触发器,从而增加了意识时钟的延迟(Latency),但提升了系统的性能。这就解释了为什么我们实现RAM同步读写的时候,读出输出要延迟一个 clk。对于布式存储单元(RAM和ROM),Vivado 提供了相应的IP: Distributed Memory Generator

移位寄存器:SLICEM 中的 LUT 还可以配置为移位寄存器,每个 LUT6 可实现深度为 32 的移位寄存器,(注意:只能左移)。这样,每个LUT可以将串行数据延迟1到32个时钟周期。移位输入D(LUT DI1脚)和移位输出Q31 (LUT MC31脚)可以进行级联,以形成更大的移位寄存器。一个SLICEM的4个LUT6级且同一个 SLICEM 中的 LUT6(4个)可级联实现 128 深度的移位寄存器。移位寄存器的典型应用是延迟补偿和同步FIFO。需要注意的是,这里的移位寄存器均没有复位端,这是因为LUT6本身不支持复位。一旦代码描述中使用了复位,无论是同步复位还是异步复位,都会导致移位寄存器采用触发器级联的方式实现。

1.2 选择器(MUX)

SLICE 中的三个 MUX(Multiplexer)两个F7MUX:F7AMUX,F7BMUX +一个 F8MUX。可以和 LUT6 联合共同实现更大的MUX。

一个 LUT6 可实现 4 选 1 的 MUX。

SLICE 中的 F7MUX(F7AMUX 和 F7BMUX)的输入数据来自于相邻的两个 LUT6 的 O6 端口。每个SLICE中都有2个MUXF7,其输入只能为LUT6的输出,而输出只能接到MUXF8;每个SLICE中都有1个MUXF8,其输入只能为MUXF7的输出。

一个 F7MUX 和相邻的两个 LUT6 可实现一个 8 选 1 的 MUX。因此,一个 SLICE 可实现 2 个 8 选 1 的 MUX。

4 个 LUT6、F7AMUX、F7BMUX 和 F8MUX 可实现一个 16 选 1 的 MUX。因此,一个 SLICE 可实现一个 16 选 1 的 MUX。

1.3 进位链(Carry Chain)

进位链用于实现加法和减法运行。它内部实际还包含 4 个 MUX 和 4 个 2 输入异或门(XOR)。每个CLB Slice都有一个专用的加法器CARRY4, 可以实现两个4bit数的加减法运算。CARRY4是一种超前进位的加法器(或者说减法器),是FPGA内部用来实现加减法运算的基本运算单元,但同时也可以实现一些其他的函数功能。

1.4 触发器(Flip-Flop)

每个 SLICE 中有 8 个触发器

Slice中的存储单元便是我们前面提到的寄存器FF,FF是实现时序逻辑最基本的单元。需要注意的是,这 8 个触发器可分为两大类:4 个只能配置为边沿敏感的 D 触发器(Flip-Flop)和 4 个即可配置为边沿敏感的 D 触发器又可配置为电平敏感的锁存器(Flop & Latch)。但后四个一旦被配置为锁存器后,则前4个触发器也不能使用了,会造成一定的资源浪费。

当后者被用作锁存器的时候,前者将无法使用。

当这8个触发器都用作D触发器时,他们的控制端口包括使能端CE、置位/复位端口S/R和时钟端口CLK是对应共享的,也就是就是说共用的。{CE,S/R,CLK}称为触发器的控制集。显然,在具体的设计中,控制集种类越少越好,这样可以提高触发器的利用率。那么怎样减少控制集种类呢?我的理解是:

  • 减少时钟种类,即频率越少越好;
  • 统一规范的设计逻辑,如复位。

S/R端口可配置为同步/异步置位或同步/异步复位,且高有效,因此可形成4种D触发器,如下表所示。

原语(Primitive) 功能描述 原语(Primitive) 功能描述
FDCE 同步使能,异步复位 FDRE 同步使能,同步复位
FDPE 同步使能,异步置位 FDSE 同步使能,同步置位

在我们的常规设计中,FDCE和FDPE占了绝大多数。

说到高有效,让我想起了一个大家习以为常,但很少深究的问题:为什么一开始接触FPGA的时候,都告诉我们低电平复位?后来查了一些资料,有说从功耗、噪声可靠性方面考虑等等,但是偶然看到Xilinx和Altera两家芯片的触发器不一样!如下图所示,Xilinx的触发器是高电平复位,而Altera的触发器时低电平复位。所以这也是需要考虑的一点吗?
在这里插入图片描述

2.可编程I/O单元

7系列FPGA的输人输出(I/O)进行了优化,用来在物理级和逻辑级上满足不同的要求,这些要求包括:高速存储器、网络、视频平板和传感器接口,高速的ADC/DAC连接,以及传统接口。7系列FPGA使用了Xilinx统一的I/O结构。
物理I/O能力和结构提供了一个I/O标准范围、端接和节省能量模式。每个I/O组的I/O数量、它们相对应的时钟、新的I/O资源的放置,以及I/O在FPGA晶圆上的排列都是同等重要的。此外,详细的I/O绑定逻辑功能,比如输人/输出延迟和串行化/解串行化功能,对于所支持的I/O应用是非常关键的。所添加的最新功能结构,比如移相器,PLL和I/O FIFO完整接口特性,支持最高性能的DDR3.及其他存储器接口。下图给出了基本的I/O结构和与新I/O相关的模块。
在这里插入图片描述

2.1 I/O物理级

在物理级上,I/O要求支持一个范围的驱动电压(或电平)和驱动强度,以及接收功能接口的不同I/O标准。I/O也支持不同的输人/输出端接特性,它可以动态地确认和移除。
7系列的结构有两种类型的I/O:

(1)高性能(High Performance)I/O,在组中称为HP I/O组;
(2)宽范围(High Range,HR)I/O(支持宽范围的I/O标准),在组中称为HR I/O组。

所有的I/O类型都是基于Virtex-6的结构,但是扩展了功能和所支持的电压范围。这两种I/O类型被绑定到一个有50个I/O的整个I/O组。Artix-7 FPGA只有3.3V的HR I/O组,Virtex-7和Kintex FPGA既有HP I/O组,也有HR I/O组。下面详细介绍HP I/O和HP I/O组。下图给出了Kintex-7XC7K160T的I/O组和CMT的布局结构图。
在这里插入图片描述
用于存储器接口的I/O电源主要有3个元件:
(1)DCI:用于匹配PCB布线的阻抗。
(2)参考输人接收器:用于调整I/O电压到核电压。
(3)IDELAY:用于同步信号到时钟。

2.2 I/O逻辑级

所有的I/O都能被配置成组合或者寄存方式。所有的输入/输出支持双数据率(double data rate, DDR)模式。任何一个输人和一些输出可以通过编程IDEALY和ODELAY进行延迟。
每个I/O 块包含一个可编程的绝对延迟原语IDELAY2。IDELAY可以连接到ILOGICE2/ISERDESE2或者ILOGICE3/ISERDESE2模块。
每个HP I/O组包含一个可编程绝对延迟原语称为ODELAY2(HR I/O组不可用)。

很多应用连接了高速、位串行的I/O,以及FPGA内低速并行操作的逻辑。这就要求在I/O结构内有一个串行化器和解串行化器。每个I/O引脚包含8位IOSERDES,能执行串行-并行或并行-串行转换。
7系列内用于精确实现ISERDES的原语是ISERDESE2,精确实现OSERDES的原语是OSERDESE2。

3.布线资源

互联是FPGA内用于连接功能元件,比如IOB、CLB、DSP和BRAM,输人和输出信号通路的可编程网络。互联也称为布线,被分段用于最优的连接。
7系列FPGA CLB在FPGA内以规则的阵列排列。如图所示,每个到开关矩阵的连接用来访问通用的布线资源。
在这里插入图片描述

FPGA内部定义了不同类型的布线,这些布线通过长度来定义。较长的路径元素对于较长的距离来说速度更快。互联类型有快速连接、单连接、双连接和四连接。

  1. 快速连接:快速连接将模块的输出布线回模块的输入。与较大的CLB一起,快速连接为较简单的功能提供了高性能布线。
  2. 单连接:单连接用于在垂直和水平方向上,布线到相邻的单元。
  3. 双连接:双连接在所有4个方向上,水平和垂直连接到所有其他的单元和对角线相邻的单元。
  4. 四连接:四连接在水平和垂直方向,每隔4个CLB连接一个或者对角线连接到两行和两列的距离的单元。与前几代的单通道长线相比,四连接线具有更好的灵活性。
    在这里插入图片描述

4.其他资源介绍

《Xilinx FPGA设计权威指南》2.2 FPGA原理及结构
在这里插入图片描述
《FPGA深度解析》第2章 FPGA结构与片上资源
在这里插入图片描述

5.Vivado中资源查看步骤

资源总览

上方选择Window-Device,打开Device布局图可以看到FPGA的内部结构资源。
在这里插入图片描述

结构名称查看

放大后点击具体结构可在左侧Site Properties中看到具体的结构名称等信息。

CLB

在这里插入图片描述

SLICE

在这里插入图片描述

I/O

在这里插入图片描述

GTX

在这里插入图片描述

BRAM

在这里插入图片描述

DSP48

在这里插入图片描述
等等。

布线资源查看

布线BEL则不实现逻辑功能,而只用来实现布线功能。要看到布线EBL,首先需要把模式改成Routing Resource这个选项勾上:
在这里插入图片描述

放大界面看可以看到布线BEL(Basic Element of Logic):可以看到在原来的SLICE块基础上多了互联线和一些布线选择块
在这里插入图片描述

接下来随便选择一个布线BEL, 把鼠标悬停在它上面就会出现一些基本信息,如果点击选中它则会在左下角出现更详细的信息,比如它的输入/输出管脚分别连接到哪里,它属于哪个时钟区域,它是什么类型的BEL等等。
在这里插入图片描述

Switch Box可以理解成一个“中转站“ ,附近的各种资源的输出都到这里完成转接,所以这个布线BEL的输出可能是来自相邻的FF,也可能是来自相邻的LUT,具体都根据实际的RTL代码来决定。
布线BEL用来实现各种输入的选取,从而实现底层资源间的灵活互联!正是有了这些布线资源和布线BEL, FPGA才可以做到这么灵活。
在这里插入图片描述

真值表查看

综合后LUT真值表的查看。
在这里插入图片描述

时钟区域查看

时钟区域是Xilinx FPGA对时钟的一种划分结构,它把整个芯片根据不同的IO BANK内的所有资源和连线都划定到不同的各个时钟区域下,这样对在同一时钟区域下的时钟信号就方便管理,同时也方便各种时钟资源走线和互联。
在这里插入图片描述

综合后打开Clock Regions可以看到时钟区域和Bank划分。IO BANK和时钟区域不是一一对应的。
在这里插入图片描述

参考资料

CLB部分参考:

《Vivado从此开始》第1章FPGA技术分析

从底层结构开始学习FPGA(0)----FPGA的硬件架构层次(BEL Site Tile FSR SLR Device)

从底层结构开始学习FPGA(1)----可配置逻辑块CLB(Configurable Logic Block)

FPGA基础学习(7) – 内部结构之CLB

LUT部分补充:

从底层结构开始学习FPGA(2)----LUT查找表

其他部分参考:

《FPGA深度解析》第2章 FPGA结构与片上资源

《Xilinx FPGA设计权威指南》2.2 FPGA原理及结构

官方文档:

7 Series FPGAs Configurable Logic Block User Guide (UG474)

相关推荐

  1. 单板计算机(SBC)-系统(SOC)嵌入式C++和FPGA(VHDL)

    2024-03-29 15:40:06       57 阅读
  2. FPGA时钟资源设计方法——Xilinx(Vivado)

    2024-03-29 15:40:06       48 阅读
  3. FPGA 时钟资源

    2024-03-29 15:40:06       56 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-29 15:40:06       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-29 15:40:06       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-29 15:40:06       87 阅读
  4. Python语言-面向对象

    2024-03-29 15:40:06       96 阅读

热门阅读

  1. 【案例·查】判断SQL字段是否为空

    2024-03-29 15:40:06       38 阅读
  2. android pdf框架-10,相册浏览

    2024-03-29 15:40:06       42 阅读
  3. scala01

    2024-03-29 15:40:06       41 阅读
  4. 06 mybatis </sql>

    2024-03-29 15:40:06       30 阅读
  5. SQL注入 (一)

    2024-03-29 15:40:06       39 阅读
  6. 初学C语言

    2024-03-29 15:40:06       41 阅读
  7. 如何安装OceanBase的OBD

    2024-03-29 15:40:06       78 阅读
  8. OceanBase 重启方法

    2024-03-29 15:40:06       51 阅读
  9. 使用 js制作轮播样式

    2024-03-29 15:40:06       36 阅读
  10. python-pytorch关于next和iter使用时没有效果的笔记

    2024-03-29 15:40:06       38 阅读
  11. Vue侦听器(Watch)深度分析

    2024-03-29 15:40:06       42 阅读