一点xilinx fpga 板上结构的知识点,记录下来。主要参考《基于FPGA的数字信号处理》一书第八章。
LUT和Slice
- zynq-7000中使用的查找表(Look Up Table,LUT)是6位的,其中包含一个5位的LUT。(6位需要的SRAM空间是2^6=64bit,5位是32bit。这应该也是为什么需要一个LUT5来构成LUT6了。)
- LUT可以作为RAM和ROM,逻辑输入作为地址线,内存作为ROM或者RAM,见How does a LUT work, why is it used?。其中SLICEL(slice logic)只能作为ROM,而SLICEM(slice memory)可以作为ROM和分布式的RAM。
LUT功能 | SLICEL | SLICEM |
---|---|---|
逻辑函数发生器 | √ | √ |
ROM | √ | √ |
分布式RAM | √ | |
移位寄存器 | √ |
- 作为RAM也可以有多种类型,各种需要不同数量的LUT。
- SLICEM中1个LUT6可配置为1个32bit的移位寄存器,逻辑输入端口作为时钟周期延时数,所以在Xilinx FPGA中实现FIFO的功能,可采用Block RAM的方式,也可采用LUT的方式。
- 一个LUT6可实现4选1的MUX (数据4位,地址2位)。
- 一个F7MUX和相邻的两个LUT6可实现一个8选1的MUX。因此,一个SLICE可实现2个8选1的MUX。
- 4个LUT6、F7AMUX、F7BMUX和F8MUX可实现一个16选1的MUX。因此,一个SLICE可实现一个16选1的MUX
DSP:基本功能是做乘法运算
- zynq中的DSP(Digital Signal Processing)部分是由DSP48E1组成的,组成基本结构如图:
- 由五部分构成:
- 对外端口
- 预加器(pre-adder)
- 乘法器(MULT)
- 逻辑运算单元(ALU)
- 模式检测电路
- 对外端口有:
- 操作数输入输出端口
- 模式配置端口
- 级联端口
- 简化结构图为:
- 单指令多数据模式即SIMD ( Single Instruction, Multiple Data)。它使得48bit的ALU可配置为4个 12bit的ALU (执行加法、减法或位逻辑运算)或者2个24bit的ALU。
- 采用VHDL或Verilog代码描述时,乘法、乘加/乘减和乘累加运算会被自动映射为 DSP48E1,而加法、减法和累加运算默认情况下釆用常规逻辑资源实现。若也希望它们被映 射为DSP48E1,则需要通过综合属性use_dsp48对其进行约束。
- 应用:
- 48bit累加运算(比加法器多一个寄存器用来存取前面加过的数据,寄存器是需要时钟驱动的。)
- 2输入48bit数据相加之后累加
- 96bit加法、减法运算(需要级联)
- 96bit累加运算(需要级联)
- 乘累加运算(两个输入数据相乘并对乘积结果累加):
- 复数乘法运算
BRAM (Block RAM)
- 块RAM (根据地址写入和输出)
- Block RAM (BRAM)在FPGA设计中扮演着一个重要的角色即数据存储或缓存
- zynq中每个BRAM达到了 36Kb,由两个18Kb BRAM拼接而成.
- BRAM在不牺牲很大带宽的前提下,提供了更大的储存密度。带宽的牺牲主要在于每个周期BRAM只有1-2个入口可以被接通(对应单端口和双端口)。
- 利用BRAM实现逻辑运算功能本质上而言是将BRAM配置为ROM,它就像一个大的 查找表(LUT)。
- 对一些固定的数据进行存储,这就需要用到 ROM,可存在BRAM里。
单端口RAM、伪双端口RAM,双端口RAM和FIFO
- 单端口RAM(Single-Port RAM)
- 输入只有一组数据线和一组地址线
- 只有一个时钟
- 读写共用地址线
- 所以一个时钟周期只能读或者只能写。
- 伪双端口RAM(Simple Dual-Port RAM)
- 输入有一组数据线,两组地址线。
- 两个时钟。
- 一个端口只读,另一个端口只写,但写入和读取的时钟可以不同,且位宽比可以不是1:1
- 双端口RAM(True Dual-Port RAM)
- 输入有两组地址线和两组数据线
- 两个时钟
- 两个端口都有读写的功能。
- FIFO (First-in, first-out)
- 一个端口只读,另一个端口只写。
- 先入先出,没有地址线
- 上述三种RAM都可以寻址,FIFO不能寻址。