认识LUT(1)
1赞能得到CrazyBingo的赠书,甚是高兴啊。虽然书还没有到,还是还算是先来写篇学习心得。了表新意。
学习FPGA,书上看到关于FPGA的结构,就说FPGA是由查找表和触发器来构成,LUT就相当于一个ram,通过输入的值决定输出的值。
以前自己水平低,不怎么了解,对于verilog代码,综合工具是怎么把代码转换到查找表上去。今天突发奇想,用ISE工具研究了一下,用的是spartan6的器件。Spartan6查找表是6输入。
考虑如下代码:
module lut_ceshi( input a, input b, output reg d ); always@(*) begin if(a) d = b; else d = 0; end endmodule
实现的电路其实就是一个与门。综合后,查看综合资源使用报告:
可以看出,使用了一个LUT,3个IO Buffers。
因为输入输出端口有3个,所以这里使用3个IO Buffers,两个输入buffer,一个输出buffer。
看下生成的工艺图。可看出lut2实现了与门的功能。打开lut2结构,可以看到:
从这就可以看出了,真值表的输入有2个,输出是根据功能定义预先计算的。由与门功能,当输入都为1的时候,输出为1,否则都是输出0.因此软件首先会预先计算电路输出,然后填入真值表输出中。
这里,就可以看出,lut相当于是真值表实现。对输入的信号,预先计算逻辑的输出,然后将输出存在结果中。这样,通过不同的输入信号,就可以得出相对应的输出。相当于就是一个选择器,通过不同的输入,选择怎么的输出输出。因为是LUT6,所以LUT最多只能支持6输入逻辑。这里只用到2个输入,所以是LUT2。
在改改代码:
module lut_ceshi( input a, input b, input c, output reg d ); always@(*) begin if(a) d = b&c; else d = b|c; end endmodule
有三个输入。综合后,看资源报告:
使用了一个LUT,4个IO buffer。因为输入输出有4个,所以使用4个IO buffer。
可以发现,这里还是只用了一个LUT,只不过是LUT3。
查看工艺图:
图中,可以看出结构。用LUT3实现了所要的功能。打开LUT3,查看:
可以看到,这时候的真值表的输入有三个,输出是根据功能定义预先计算的。这个大家可以去写写电路的真值表对比看看。
可看出,FPGA软件,对组合逻辑电路,先预先计算不同输入对应的输出,然后将输出存在LUT的输出 中。这样,每次输入到达,输出就会有对应的输出数据。因为是LUT6结构,所以只要输入在1到6输入之 间,都只会用1个LUT资源。如果超过了6输入,会用LUT级联来实现功能。
综上可看出,LUT是实现组合逻辑的。因为LUT的输出只决定于输入,同时,也可以知道,有多少个输出,就会有多少个LUT。因为每个LUT只有一个输出。
用如下代码验证:
module LUT_test( input [1:0]a,b,d, output reg [1:0] c ); always@(*) begin if(a) c = b&d; else c = b|d; end endmodule
由于输出是两位,所以所用LUT资源为2个。综合看综合报告:
从报告,也可以看出,是使用了2个LUT,而且是LUT4。
所以,LUT可以实现任意输入的组合逻辑电路。每个输出会使用一个LUT。当超过6输入后,会多一个LUT级联。两级LUT级联,最多只能实现11输入的组合逻辑电路,所以当输入超过11后,又会级联。。。。。
这种分析,是没有考虑到优化的情况下。学数字电路的时候,组合逻辑是可以化简的,因为软件在进行预先计算输出的时候,会进行化简,这个时候,就会发现,其实是使用不了这么多的LUT,因此这时候的LUT个数会少于我们计算出来的值。
比如对于一个7输入,7输出的组合逻辑电路:
由于有7个输出,因此需要7个LUT。
输入7大于输入6,因此需要两级LUT级联来实现。所以总共需要14个LUT。
但是综合后,看报告,会发现LUT个数少于14个,这就是因为软件有对输入组合进行化简。
所以,LUT简化了组合逻辑电路的设计,只需要预先计算输出值,然后将输出值保存在LUT中。而且这样,也保证了,不管组合逻辑多复杂,从输入到输出的延时时间是一样的,都是LUT的延时。这个就和数字IC设计不一样了,因为在数字IC中,综合出来的电路是以门级表示,当门级级联越多,输出延时就越大。