FPGA 系列文章
- 如果你想学习有关FPGA的专业术语,可以参考这一篇:《FPGA专业术语介绍》
- 最近由于工作比较忙文章更新频率比较慢,争取逐渐恢复ヽ(ˋ▽ˊ)ノ
文章目录
一、DRAM(分布式随机存取存储器)是什么
一句话概括,在FPGA中,DRAM指用LUT实现的分布式随机存取存储器。
《FPGA结构:LUT(查找表)和 MUX(多路选择器)介绍》的 " LUT(查找表)是什么 " 章节中曾经提到,LUT本质上是一个RAM,具有写功能的LUT能够作为存储器使用。由于一个6-LUT的真值表大小为64bit,其可以用于存储64bit的数据。
以下是一个具有写功能的6-LUT的示意图:
其中:
- DI代表数据端口。
- A6:A1代表读地址端口。
- W6:W1代表写地址端口。
- WEN代表写使能端口。
具有写功能的,4个以内的6-LUT能够组成以下的分布式RAM:
RAM | 端口配置 | 原语 | 6-LUT数量 |
---|---|---|---|
32 x 1-bit | 单端口 | RAM32x1S | 1 |
32 x 1-bit | 双端口 | RAM32x1D | 2 |
32 x 2-bit | 四端口 | RAM32M | 4 |
32 x 6-bit | 简化双端口 | RAM32M | 4 |
64 x 1-bit | 单端口 | RAM64x1S | 1 |
64 x 1-bit | 双端口 | RAM64x1D | 2 |
64 x 1-bit | 四端口 | RAM64M | 4 |
64 x 3-bit | 简化双端口 | RAM64M | 4 |
128 x 1-bit | 单端口 | RAM128x1S | 2 |
128 x 1-bit | 双端口 | RAM128x1D | 4 |
256 x 1-bit | 四端口 | RAM256x1S | 4 |
表格中端口配置的含义如下:
单端口:
-
具有一个用于同步写入和异步读取的通用地址端口。
-
读取和写入地址共享同一地址总线。
双端口:
-
具有一个用于同步写入和异步读取的端口。
-
第一个输入连接到第一个RAM的共享的读和写端口地址,以及第二个RAM的共享的写端口地址。
-
具有一个用于异步读取的端口。
-
第二个输入连接到第二个RAM的只读端口地址。
简单的双端口:
-
具有一个用于同步写入的端口(写入端口没有数据输出/读取端口)。
-
具有一个用于异步读取的端口。
四端口:
-
具有一个用于同步写入和异步读取的端口。
-
具有用于异步读取的三个端口。
以官方文档中具有双端口的RAM64x1D为例子:
其中,A[5:0]可以用于两个RAM的同步写,DRPA[5:0]仅可以用于下面RAM的异步读,同步读可以通过配置FF的方式实现。
剩下的分布式RAM由于篇幅原因就不进行详细的讲解了,如果好奇的话可以查阅UG474官方文档。
BRAM和DRAM的区别?
BRAM是FPGA中定制的RAM资源,与DRAM主要存在两个区别:
- BRAM一定是时序逻辑输出,因为它的地址输入端口有一组寄存器。而DRAM可以是纯组合逻辑输出(给出地址后直接输出数据)。
- BRAM有较大的存储空间,而DRAM是由LUT拼出来的。这使得DRAM在牺牲LUT资源的基础上增加了灵活性。
二、CLB(可编程逻辑功能块)是什么
一句话概括,在FPGA中,CLB(可编程逻辑功能块)指能够配置实现特定的逻辑功能的一种基本单元。它可以由两个SLICEL组成,也可以由SLICEL+SLICEM组成。
想理解CLB,就需要理解其中关键的组成部分SLICE。Xilinx工具使用X和Y表示每一个SLICE的位置,SLICE在CLB中的摆放示意图如下:
SLICEM的结构图如下:
SLICEL的结构图如下:
结构图中可以看到,SLICEM和SLICEL均由LUT(查找表),MUX(多路选择器),CARRY LOGIC(进位逻辑)和LATCH/FF(存储单元)构成,可以结合之前的文章加以理解:
LUT(查找表)
是否具备写功能是SLICEM和SLICEL的关键区别点。SLICEM中的LUT具有写功能,而SLICEL中的LUT不具有写功能。
MUX(多路选择器)
SLICEM和SLICEL中的MUX具有四个功能:
-
与红框中的LUT组合构成更高位数的多路选择器,这一点在《FPGA结构:LUT(查找表)和 MUX(多路选择器)介绍》的 " 6-LUT"章节中有涉及。
-
与红框中具有写功能的LUT组合构成移位寄存器,这一点可以参考《浅谈XILINX FPGA CLB单元 之 移位寄存器(移位寄存器、SRLC32E、SRL16E》),之后会专门写文章介绍。
-
作为进位逻辑的组成部分,这一点在下文会涉及。
-
将LUT与CARRY LOGIC,CARRY LOGIC与LATCH/FF分隔开来, 使得CARRY LOGIC与LATCH/FF既可以由外部的AX,BX,CX,DX驱动,也可以由来自左边电路的输出驱动,以下是CARRY LOGIC中的一个MUX:
这个MUX主要用于在左边LUTA的输出信号和外部的AX信号之间进行选择,但实际上左边电路的输出还有很多,这里不再赘述。
CARRY LOGIC(进位逻辑)
放大一下上图中的棕色部分:
从最下面的进位逻辑开始,每个进位逻辑都会把它的高位输出(进位)传给上一级,并把它的低位传给右边的电路。以《FPGA原理与结构》中给出的单个进位逻辑为例子:
以下为该电路的真值表:
输入1(ln0) | 输入2(ln1) | 进位(Cin) | 高位输出(Cout) | 低位输出(Sum) |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 0 | 1 |
0 | 1 | 0 | 0 | 1 |
1 | 0 | 0 | 0 | 1 |
1 | 1 | 0 | 1 | 0 |
1 | 0 | 1 | 1 | 0 |
0 | 1 | 1 | 1 | 0 |
1 | 1 | 1 | 1 | 1 |
这里补充说明一下超前进位加法器的概念,对于上文的进位逻辑,由于每一级都需要等到上一级输出结果再开始计算,因此级数很高时会出现组合逻辑延时过长的情况。为了解决该问题,有人提出了超前进位加法器的概念,超前进位加法器能够并行计算每一个进位的电路,但其能够进行计算的位宽也固定。由于无法预先获知特定应用下具体实现的加法器的位宽,FPGA中并未将超前进位加法器作为基本单元,超前进位加法器更多被ASIC应用。想要了解的小伙伴可以参考这篇文章:《数电——超前进位加法器》
LATCH / FF(存储单元)
放大一下上图的绿色部分:
可以看到,每一个SLICE中都包含八个存储单元,其中的四个可以配置为LATCH/FF,另外四个只能配置为FF。LATCH与FF的区别可以参考这一篇文章:《FPGA结构:LATCH(锁存器)和 FF(触发器)介绍》
参考文档
(UG474官方文档)7 Series FPGAs Configurable Logic Block
如何理解FPGA的配置状态字寄存器Status Register
FPGA User Guide 之 Xilinx CLB (一)