0-1学习FPGA之底层资源——LUT
目录
碎碎念!
开这个专栏是为了重新巩固基础,温故而知新,顺便查漏补缺弥补之前的知识漏洞~内容会尽量写的清晰,0基础的小伙伴也能看懂,欢迎交流~如有问题请艾特我^ w ^
1. 什么是LUT?
LUT(look-up table)就是查找表,是FPGA中实现组合逻辑功能的基本单元。可以看做一个小SRAM,存储逻辑真值表,输入看做地址线,读取出对应的逻辑输出结果。(后面有举例)
LUT有LUT1、LUT2、LUT3、LUT4、LUT5、LUT6。分别指代的输入口的数量,输入口可以作为地址去读写"RAM"内的数据。譬如LUT4,代表4个输入地址Bit,可以读写总共0000~1111,也就是0~15个地址的bit数据。


图1.1 LUT4真值表
不同的LUT之间可以级联,LUT1可以和LUT1~6级联,一般来说LUT层级不要超过6,否则可能有时序问题,若LUT层级超过6就需要中间插入寄存器、降低频率的方式改善时序。
通过设置LUT的初始值来实现逻辑,譬如实现2bit的A,B是否相等,可以这样安排输入:I3=A[1]、I2=A[0]、I1=B[1]、I0=B[0],若输入出现有A=B的情况,就在该输入地址对应的位置上写入1。
A=B有以下情况:0000、1111也就是在0地址和15地址上写入1,其余为0,初始值应该设置为16'b1000_0001代码例化:
LUT4 #(
.INIT(16'b1000001) // Logic function
)
LUT4_inst (
.O(O), // 1-bit output: LUT
.I0(B[0]), // 1-bit input: LUT
.I1(B[1]), // 1-bit input: LUT
.I2(A[0]), // 1-bit input: LUT
.I3(A[1]) // 1-bit input: LUT
);
当输入为0000/1111时输出为1,A=B。
2. LUT 与传统逻辑门的对比
传统逻辑门为与或非等逻辑门,EDA工具首先将逻辑综合为门级电路,也就是RTL级通过与或非逻辑门搭建的电路,最后综合为LUT,为什么FPGA选择使用LUT查找表而不是直接选择通过门电路实现逻辑呢?这是一个很有意思的问题~我也去网上搜寻了这个问题,找到两个觉得很不错的回答,能满足我现在的疑问~以下是链接:
为什么FPGA使用LUT而不是传统的逻辑门?-腾讯云开发者社区-腾讯云
我总结一下,第一个是从性能的角度解释:倘若使用门电路,每个逻辑门都有不同的时延,那么在一段组合逻辑中门逻辑越多,时延越长,为满足时序要求,不得不延长周期,整个系统的速度很容易有瓶颈。
而使用LUT则可以很好解决延时,无论多少逻辑门,只要输入位宽确定,就能确定组合逻辑中LUT的层级(级联的数量),LUT可以看成SRAM,内部早已写好逻辑输出结果,所以只要逻辑运行时给到输入,就能越过门电路的延时直接读取到输出结果。
第二个从FPGA的底层原理入手:FPGA(Field Programmable Gate Array)为现场可编程门阵列,是一种半定制电路,解决了定制电路的不足,又克服了原有可编程器件门电路有限的缺点。 FPGA可以反复烧写,它实现组合逻辑的基本结构不可能像ASIC那样通过固定的与非门来完成,而只能采用一种易于反复配置的结构,也就是LUT查找表。LUT本质是SRAM,里面的初始值可以包含各种与或非门级电路的逻辑,因此FPGA可以做到不需要改变电路就可以重复改变逻辑。很神奇
~
3. LUT可以怎么用?
LUT一般来说有两种SLICEL、SLICEM。SLICEL的LUT只能用于实现组合逻辑,SLICEM的LUT有时钟输入口,可以实现数据存储、组合逻辑,内部结构比SLICEL的LUT更复杂。
3.1 实现组合逻辑
如第1点中的例子所示,通过改变初始值实现组合逻辑;
3.2 搭建LUT_RAM(分布式RAM)
FPGA中最多的就是LUT,在数据量不是很大的时候可以直接使用LUT搭建分布式RAM,节省BRAM。1个BRAM至少为18Kbit,倘若一些少量的存储需求就要花费一个BRAM实在浪费,BRAM在FPGA中资源有限。并且LUT搭建的分布式RAM读写为0周期,也能节省时间。
LUT_RAM都有IP可以直接用,具体使用看对应板卡的IP手册。
3.3 移位寄存器
除了寄存器外,通过级联多个LUT(SLICEM)可以实现多位宽的移位寄存器。SLICEM里的LUT带CLK时钟输入口,一个LUT6可以作为32位的移位寄存器。时间有点晚了,后续我再具体写这个如何实现,并补充SLICEL、SLICEM的LUT的区别~~^ w ^