基本概念
LUT显示查找表(Look-Up-Table)
本质上就是一个SRAM。它把数据事先写入RAM后,每当输入一个信号就等于输入一个地址进行查表,找出地址对应的内容,然后输出。
目前主流FPGA都采用了基于SRAM工艺的查找表结构,也有一些军品和宇航级FPGA采用Flash或者熔丝与反熔丝工艺的查找表结 构。通过烧写文件预存(这一步在我们用bit文件配置FPGA时实现)改变查找表内容的方法来实现对FPGA的重复配置。
组成层次
每个CLB包含两个slices,每个slices由4个(A,B,C,D)6输入LUT和8个寄存器组成(中间应该还有一些选择器、与非门、或非门之类的东西)
同一CLB中的两片slices没有直接的线路连接,分属于两个不同的列。每列拥有独立的快速进位链资源。
放一个slices的内部图
slice分为两种类型 SLICEL, SLICEM
(1)SLICEL可用于产生逻辑,算术,ROM。
(2)SLICEM除以上作用外还可配置成分布式RAM或32位的移位寄存器。每个CLB可包含两个SLICEL或者一个SLICEL与一个SLICEM.
分布式RAM
SLICEM可以配置成分布式RAM,一个SLICEM可以配置成以下容量的RAM
应用
(1)组合逻辑函数
N个输入的查找表可以实现任意N个输入变量的组合逻辑函数
实际上,LUT具有更快的执行速度和更大的规模。
- 不同输入数量选择
7系列的FPGA的LUT有6个输入端口(A1-6),然后有两个输出端口(O5,O6)。下图是SLICE里面的LUT。
4输入查找表可以看成是具有4位地址1位数据的存储器,能够存储16bit数据,这也是LUT能被用于组建分布式RAM的原因。
如果要构成一个6输入1输出MUX,可以通过两片4输入查找表级联,也可直接用一片完整的6输入查找表,两片4输入的查找表的存储容量是32,而一片完整的6输入查找表的存储容量是64;若使用6输入查找表(存储容量为64)实现4输入(存储容量为16)的逻辑功能,则浪费了75%的存储容量。也就是说,采用较少输入的查找表实现较多输入查找表的功能,在面积上有更高的利用率。
但是呢如果LUT采用的是2输入的呢,那样岂不是更好吗,不是的,因为对于多输入的信号处理的时候,就需要有多个LUT的级联来实现,而级联有不可避免的会导致延时过分,导致时序不满足。因此在实际的FPGA产品中多采用的是4输入或者6输入的LUT。
(2)构成RAM
SLICEM可以配置成分布式RAM,一个SLICEM可以配置成以下容量的RAM
多bit的情况需要增加相应倍数的LUT进行并联。
分布式RAM和 BLOCK RAM的选择遵循以下方法:
- 小于或等于64bit容量的的都用分布式实现
- 深度在64~128之间的,若无额外的block可用分布式RAM。 要求异步读取就使用分布式RAM。数据宽度大于16时用block ram.
- 分布式RAM有比block ram更好的时序性能。 分布式RAM在逻辑资源CLB中。而BLOCK RAM则在专门的存储器列中,会产生较大的布线延迟,布局也受制约。
(3)Shift Register
SLICEM中的LUT能在不使用触发器的情况下设置成32bit的移位寄存器, 4个LUT可级联成128bit的移位寄存器。并且能够进行SLICEM间的级联形成更大规模的移位寄存器。
(4)Multiplexers
一个LUT可配置成4:1MUX.
两个LUT可配置成最多8:1 MUX
四个LUT可配置成16个MUX
通过代码进行综合
eg1
module testlatch
(
input a,
input b,
output reg q
);
always @(a or b)
if(a == 1'b1)
q = b;
endmodule
在always (*)的情况下,如果if 或者cace 不完整的话,会综合出latch,导致不稳定。’
eg2
module testlatch
(
input a,
input b,
output reg q
);
always @(a or b)
if(a == 1'b1)
q = b;
else
q = a;
endmodule
梯形的选择器” ,其实就是由LUT构成的!
eg3
module testlatch
(
input CLK,
input a,
input b,
output reg q
);
always @(posedge CLK)
if(a == 1'b1)
q = b;
endmodule
在always (posedge CLK)的情况下,综合出的是reg,即使if,或者case不完整,也不会综合出latch。
ref