基本概念

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的内部图

lua中如何找表中的是表的元素 lua表查找机制_级联


lua中如何找表中的是表的元素 lua表查找机制_移位寄存器_02

lua中如何找表中的是表的元素 lua表查找机制_存储容量_03


slice分为两种类型 SLICEL, SLICEM

(1)SLICEL可用于产生逻辑,算术,ROM。

(2)SLICEM除以上作用外还可配置成分布式RAM或32位的移位寄存器。每个CLB可包含两个SLICEL或者一个SLICEL与一个SLICEM.

分布式RAM
SLICEM可以配置成分布式RAM,一个SLICEM可以配置成以下容量的RAM

应用

(1)组合逻辑函数

N个输入的查找表可以实现任意N个输入变量的组合逻辑函数

lua中如何找表中的是表的元素 lua表查找机制_移位寄存器_04


实际上,LUT具有更快的执行速度和更大的规模。

  • 不同输入数量选择

7系列的FPGA的LUT有6个输入端口(A1-6),然后有两个输出端口(O5,O6)。下图是SLICE里面的LUT。

lua中如何找表中的是表的元素 lua表查找机制_移位寄存器_05

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

lua中如何找表中的是表的元素 lua表查找机制_存储容量_06


多bit的情况需要增加相应倍数的LUT进行并联。

分布式RAM和 BLOCK RAM的选择遵循以下方法:

  1. 小于或等于64bit容量的的都用分布式实现
  2. 深度在64~128之间的,若无额外的block可用分布式RAM。 要求异步读取就使用分布式RAM。数据宽度大于16时用block ram.
  3. 分布式RAM有比block ram更好的时序性能。 分布式RAM在逻辑资源CLB中。而BLOCK RAM则在专门的存储器列中,会产生较大的布线延迟,布局也受制约。

(3)Shift Register

SLICEM中的LUT能在不使用触发器的情况下设置成32bit的移位寄存器, 4个LUT可级联成128bit的移位寄存器。并且能够进行SLICEM间的级联形成更大规模的移位寄存器。

lua中如何找表中的是表的元素 lua表查找机制_存储容量_07

(4)Multiplexers

一个LUT可配置成4:1MUX.

两个LUT可配置成最多8:1 MUX

   四个LUT可配置成16个MUX

lua中如何找表中的是表的元素 lua表查找机制_存储容量_08

通过代码进行综合

eg1

module testlatch
(
	input a,
	input b,
	output reg q
);

	always @(a or b)
		if(a == 1'b1)
			q = b;
	
endmodule

lua中如何找表中的是表的元素 lua表查找机制_lua中如何找表中的是表的元素_09


在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

lua中如何找表中的是表的元素 lua表查找机制_存储容量_10


梯形的选择器” ,其实就是由LUT构成的!

lua中如何找表中的是表的元素 lua表查找机制_lua中如何找表中的是表的元素_11

lua中如何找表中的是表的元素 lua表查找机制_存储容量_12

lua中如何找表中的是表的元素 lua表查找机制_级联_13

eg3

module testlatch
(
	input CLK,
	input a,
	input b,
	output reg q
);

	always @(posedge CLK)
		if(a == 1'b1)
			q = b;

endmodule

lua中如何找表中的是表的元素 lua表查找机制_存储容量_14


在always (posedge CLK)的情况下,综合出的是reg,即使if,或者case不完整,也不会综合出latch。

ref