本文首先对 ASIC 和 FPGA 进行了一个对比,然后介绍了 FPGA 的基本结构,最后解释了 FPGA 实现可编程的基本原理。
ASIC vs. FPGA
这里先给出 ASIC 和 FPGA 的优缺点
ASIC | FPGA | |
---|---|---|
优点 | 性能优越 可靠性高 大批量下单位成本低 |
开发初期无投入资金壁垒 设计工具使用方便,设计简单快速 产品原型机开发时间短 管脚定义灵活,便于PCB布板 随时进行硬件功能设计修改 |
缺点 | 开发周期长:设计工具及设计流程复杂,快速进入市场的压力大 功能固定,不利修改和扩展 NRE费用高 设计工具及开发人员昂贵 |
单位成本高 可靠性低/功耗大 性能低 |
用途 | 设计规模大,复杂度高的芯片 成熟度高,产量大的产品 |
要求快速迭代或者小批量产品 作为ASIC的算法验证加速 |
FPGA 基本结构
基本介绍 | |
---|---|
可配置逻辑块 (Configurable Logic Block, CLB) | 主要的逻辑资源,可用于实现组合逻辑、时序逻辑和存储单元,具体后面再介绍 |
可编程 I/O 模块 (Programmable I/O Block, IOB) | 芯片与外部的接口,用于不同电气特性输入/输出信号的驱动和匹配,具体后面再介绍 |
可编程互连 (Programmable Interconnect) | 用于 CLB 之间或 CLB 和 IOB 之间进行互连,具体后面再介绍 |
配置存储器 (Configuration Memory) | 通过写配置存储器实现系统功能,如CLB实现的逻辑、CLB之间的互连、CLB和IOB之间互连,用户不可见,具体后面再介绍 |
Block RAM | 增加片上存储资源,通过IP核方式调用,可用于实现单端口RAM、双端口RAM、FIFO等 |
专用 DSP 模块 | 如加法器、乘法器、累加器 |
嵌入式处理核 | 软核和硬核,Xilinx 的 ZYNQ系列上就集成了 ARM 硬核 |
外设接口 | PCI-E接口、Ethernet结构等 |
FPGA 基本原理
下面是 CLB、IOB、Programmable Interconnect 和 Configuration Memory 的一个示意图,这四者共同实现了 FPGA 可编程的特点。
CLB 是 FPGA 的主要逻辑资源,可用于实现组合逻辑、时序逻辑和存储单元。
IOB 是芯片与外部的接口,可以提供输入输出信号
通过往配置存储器中写入不同的内容,可以实现CLB的逻辑、CLB之间的互连、CLB和IOB之间互连,从而实现不同的功能。配置存储器对用户来说是不可见的。
每个 CLB 由 1 个或 2 个 Slices 组成,Slices 有 SliceL 和 SliceM 这两种类型,下图是一个 SliceL 的结构图,其主要由查找表LUT、进位链和存储元素三部分组成。
查找表(LUT)
实现组合逻辑
对于一个 n n n 输入的逻辑运算,不管是与、或、非运算还是异或运算,输入最多只有 2 n 2^n 2n 种组合情况,因此最多只可能存在 2 n 2^n 2n 种结果,如果事先将相应的结果存放于一个存储单元,就相当于实现了组合逻辑运算电路的功能,下图是使用一个三输入的LUT来实现 y = ( a & b ) ∣ ! c y=(a\&b)|!c y=(a&b)∣!c 的示意图
Xilinx 7系列的FPGA采用6-输入LUT结构,可以实现任意6-输入逻辑功能(比如,4选1的多路选择器)
如果要实现更多输入的逻辑功能,就需要将多个LUT合在一起使用,这时候就需要用到多路选择器进行连接,我们从下面的 Slices 结构图可以看到有三个多路选择器将4个LUT拼接起来,可以实现任意8-输入的逻辑功能或者16选1的多路选择器
为什么4个6输入的LUT只能实现任意8-输入的逻辑功能?可以这么理解,想要实现任意 n n n-输入的逻辑功能,那就需要 2 n 2^n 2n 个存储单元,由于4个6输入的LUT只有 4 ⋅ 2 6 = 2 8 4\cdot 2^6=2^8 4⋅26=28 个存储单元,因此只能实现任意8-输入的逻辑功能。举一个例子进一步解释,比如输入信号为 [ 7 : 0 ] input [7:0]\text{ input} [7:0] input,可以令 AX 和 CX 等于 input [ 6 ] \text{input}[6] input[6](AX和CX是选择信号,详情见上面的 Slices 结构图),令 BX 等于 input[7] \text{input[7]} input[7],令这 4 个 LUT 的输入均为 input[5:0] \text{input[5:0]} input[5:0], 4 个 LUT 的存储单元中依次写入 input \text{input} input 等于 8’b00xxxxxx、8’b01xxxxxx、8’b10xxxxxx 和 8’b11xxxxxx时的结果
为什么4个6输入的LUT可以实现16选1的多路选择器?1个LUT可以实现1个4选1的多路选择器,4个LUT便可以实现4个4选1的多路选择器,4个由LUT实现的4选1的多路选择器,再加上上图中圈出来的3个2选1的多路选择器,便可以实现16选1的多路选择器
实现DRAM
上面讲的都是 SliceL,SliceM的不同点在于,它的LUT提供了写端口,包括写地址、写使能和写数据,所以我们可以访问 LUT 的存储单元,从而将 LUT 作为 RAM 使用,如下图所示
基于LUT实现的RAM,称之为 DRAM(Distributed Random Access Memory)
BRAM 和 DRAM 的区别如下:
- Block RAM是内嵌的专用RAM,而Distributed RAM需要消耗珍贵的逻辑资源(SLICEM)组成
- Block RAM具有更高的时序性能,而Distributed RAM由于分布在不同的位置,延迟较大
- Distributed RAM的使用更灵活
- 较大容量的存储部件,用Block RAM
- 零星小容量的存储部件,用Distributed RAM
进位链
用于实现超前进位加法,代码中的加法逻辑会使用进位链实现,用于提高加法器、减法器和比较器的速度
一个CARRY4模块支持4位加法,其原理图如下所示
通过级联可以支持更多位宽的加法
存储元素
其结构如下所示,这部分用于实现触发器或者锁存器,配合 LUT 和进位链可以实现时序电路
一个6-输入的LUT最多可以生成8个触发器,可以是同步复位或者异步复位,有关类型如下表所示文章来源:https://www.toymoban.com/news/detail-829981.html
复位类型 | 原语 | 行为 |
异步复位 | FDCE | 复位后Q输出0 |
FDPE | 复位后Q输出1 | |
同步复位 | FDRE | 复位后Q输出0 |
FDSE | 复位后Q输出1 |
一个6-输入的LUT最多可以生成4个锁存器,异步复位,有关类型如下表所示文章来源地址https://www.toymoban.com/news/detail-829981.html
复位类型 | 原语 | 行为 |
异步复位 | LDCE | 复位后Q输出0 |
LDPE | 复位后Q输出1 |
到了这里,关于FPGA原理介绍 (CLB, LUT, 进位链, 存储元素, RAM)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!