系列文章目录:FPGA原理与结构(0)——目录与传送门
目录
一、查找表(LUT)概述
二、LUT的性能权衡
1、面积效率
2、速度问题
3、权衡结果
三、LUT的组成与应用
1、LUT的组成
2、LUT的应用
3、LUT应用拓展
本文参考xilinx官方手册ug474:ug474
LUT是CLB的重要组成部分,是FPGA中的重要资源,人们经常会说FPGA是基于查找表的可编程逻辑器件。其实所谓FPGA,也就是由最基本的三个要素构成的:(1)实现逻辑电路所需要的可编程逻辑要素(2)提供对外接口的可编程输入/输出要素(3)连接以上两种要素的可编程布线要素。然后在此基础上再嵌入其他硬件电路模块,如DSP,嵌入式内存,时钟所用的PLL/DLL,包括如今火热的嵌入式芯片构成soc等。LUT在FPGA中就是上述第一个要素(实现逻辑电路)的核心参与者。
数电是学习FPGA的基础,数电又可以分成组合逻辑电路和时序逻辑电路。组合逻辑的前提是布尔逻辑,在电路上的体现就是逻辑门,理论上我们可以用逻辑门来实现任意的组合逻辑。而在FPGA中,我们就用LUT来取代了逻辑门的作用。我们把逻辑门构成的组合逻辑电路抽象成一个黑盒电路,现在我们知道了它所有的输入情况对应的输出(真值表),需要用一个器件来代替这个电路。对电路原件熟悉的人应该不难意识到,我们可以用一个存储器件来实现,把所有的输入作为存储器件的地址,把输出存储在对应的地址中,就完美取代了上述的电路功能。这就是我们的LUT,所以可以说LUT的本质就是一个RAM(可读可写,也有的是不可写的,相当于ROM)。
但是我们为什么要进行这样的替换呢,使用逻辑门一样能实现相应的功能,也更加符合大家学习数电时最初的认知。设想一下如果FPGA里面不是LUT而是各式各样的门电路,那么即便我们在器件做了很多门,却有可能,导致最终的利用率十分的低下。因为在实际应用情况不确定的情况下,我们根本不可能知道用与门,或门,非门还是别的门单元,也不可能不知道会有多少位的输入,多少位的输出。最终将导致器件规模巨大,不具有灵活性。但是使用LUT就恰恰相反,LUT可以用来替代各种门,以及它们的结合,因此用LUT作为FPGA的基本单元可以确保更多的LUT可以用上,来达到提高利用率的目的。同时对于门级电路来说,彼此之间的连线也会使得EDA工具产生大的负担。可以说是LUT的应用,才使得FPGA有别于传统的可编程逻辑器件,逐渐成为如今时代的主流。
我们在vivado中编写一个简单的组合逻辑来测试LUT的功能。
module logic(
(*IO_BUFFER_TYPE="NONE"*) input din1,
(*IO_BUFFER_TYPE="NONE"*) input din2,
(*IO_BUFFER_TYPE="NONE"*) input din3,
(*IO_BUFFER_TYPE="NONE"*) input din4,
(*IO_BUFFER_TYPE="NONE"*) input din5,
(*IO_BUFFER_TYPE="NONE"*) input din6,
(*IO_BUFFER_TYPE="NONE"*) output dout);
assign dout = din1 & din2 & din3 & din4 & din5 & din6;
endmodule
得到的综合结果如下:
可以看到这里的综合结果就是使用了一个LUT6(6输入的LUT)来实现了我们的逻辑功能。LUT中对应的INIT值也就是我们的真值表对应的值,输出逻辑与我们的设计一致,下为真值表(不全)。
也可以从LUT的verilog原语来理解,INIT就是对应的真值表的值,O为输出,其他信号为对应的输入:
// LUT6: 6-input Look-Up Table with general output
// Artix-7
// Xilinx HDL Language Template, version 2018.3
LUT6 #(
.INIT(64'h0000000000000000) // Specify LUT Contents
) LUT6_inst (
.O(O), // LUT general output
.I0(I0), // LUT input
.I1(I1), // LUT input
.I2(I2), // LUT input
.I3(I3), // LUT input
.I4(I4), // LUT input
.I5(I5) // LUT input
);
// End of LUT6_inst instantiation
在如今的主流FPGA中,基本采用的都是6输入的LUT,为什么不是7输入或者5输入(其实是可配置实现的)呢,这是由于性能权衡方面的考虑。这部分内容的学习对于我们FPGA应用者来说作用并不大,不感兴趣的读者可以直接跳过。
在早期FPGA的逻辑块结构中有些只包含查找表,但是大部分的逻辑块的基本元素都包含BLE(Basic Logic Element,基本逻辑单元),如下图:
BLE由实现组合逻辑的LUT,实现时序逻辑的触发器FF以及数据选择器构成。数据选择器在存储单元M0的控制下决定直接是输出查找表的值还是输出FF中存储的值。
在确定逻辑块的结构的时候,存在面积效率,速度等相关的权衡。
面积效率用来衡量FPGA上实现的电路是否充分利用了逻辑块资源。在考虑面积效率时,需要对以下两点进行权衡:
(1)如果增加每个逻辑块的功能,就可以以更少的逻辑块实现电路。
(2)但逻辑块自身的面积和输入/输出数量会变大,所以可重复逻辑模块的面积就增大了。
对于逻辑块的功能影响最大的就是LUT的大小了。因为k输入的查找表(k-LUT)可以实现任意k输入的函数,较大的LUT有利于减少逻辑块的使用,但是,k-LUT需要个配置存储单元,因此逻辑块自身的面积就会增大。并且增加逻辑块的输入/输出引脚会导致布线面积增大,因此每个可重复逻辑模块的面积就增大。而FPGA的总面积是通过“逻辑块数单位可重复逻辑模块面积”计算的,因此查找表的大小与面积效率之间存在权衡关系。简单说就是你不能期望一个模块既具有强大的功能又有着小巧的面积,必须在两者之间找到一个平衡。
速度上也受到以下两个方面的影响:
(1)如果增加每个逻辑块的功能,所实现的电路的逻辑深度(logic depth)就更小。
(2)但同时也会增加逻辑块自身的内部延迟。
逻辑深度是指通过关键路径的逻辑块数量,它在FPGA设计过程环节中的技术映射(technology mapping)过程中决定。降低逻辑深度可以有效减少布线,从而提高电路速度。但是,增加逻辑块功能的同时就会增加内部的延迟,那么降低逻辑深度的效果就会大大折扣。所以查找表的大小与速度也存在权衡关系。简单说就是你不能期望外部延迟小的情况下,内部延迟也小。
对于性能测试来说,除了产品本身的性能情况以外,评测的标准不同也会导致结果的不同。20世纪90年代,曾有研究对查找表的输入数量进行架构探索,结论表明4输出查找表最为高效。事实上在商用FPGA中,xilinx公司的Virtex 4和Altera 公司的Stratix 之前一直都使用4-LUT。
文献:E.Ahmed,J.Rose.The Effect of LUT and Cluster Size on Deep-Submicron FPGA Performance and Density.IEEE Trans. Very Large Scale Integration(VLSI) Systems,2014,12(3)
基于CMOS 0.18um 1.8V制造对FPGA架构进行了评测。结果表明,查找表输入数等于5或者6时面积和速度方面的性能最好。因此,最近的商用FPGA倾向于采用6-LUT。
xilinx公司的7系类FPGA中使用的是6-LUT,每个LUT有六个独立的输入(A1-A6),两个独立的输出(O5-O6)。一个Slice中的四个LUT分别以A,B,C,D编号。从组成结构来说,一个6-LUT由两个5-LUT组成和一个数据选择器组成。
这样的一个6-LUT可以被配置为:
(1)一个任意6输入的布尔逻辑函数
(2)两个任意5输入的布尔逻辑函数(需要这两个函数共享输入,即输入相同)
(3)两个任意3或2或更少输入的布尔逻辑函数
当具有6个输入时:使用I0-I5作为输入,使用O6作为输出(O5不使用)。
当具有5个输入时:使用I0-I4作为输入,使用O5,O6作为输出,I5拉高(强制O6代表上面一个5-LUT的结果)。
通过LUT的传播延迟与所实现的函数无关。
单个的6-LUT有时候还是不能满足设计者的应用需求,所以LUT之间的拓展就至关重要:
我们主要观察图中的MUXF7和MUXF8。除了基本的lut外,slice还包含三个多路选择器(F7AMUX、F7BMUX和F8MUX)。这些多路选择器用于组合4个函数生成器,以提供任何slice中7或8个输入的任何函数。
F7AMUX: 用于从LUT A和B生成7个输入函数
F7BMUX: 用于从LUT C和D生成7个输入函数
F8MUX: 用于组合所有LUT生成8个输入函数。
具有八个以上输入的函数可以使用多个slice来实现。在CLB中,slice之间没有直接连接以形成大于8个输入的函数生成器。
但是级联的LUT越多,潜在的组合逻辑时延就越严重,对于系统时延的要求就越苛刻,一般采用寄存器来同步后再将结果输出,以确保输出结果正确。