weiqi7777

认识LUT(1)

1
阅读(5038)

        能得到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

实现的电路其实就是一个与门。综合后,查看综合资源使用报告:

clip_image002[4]

可以看出,使用了一个LUT,3个IO Buffers。

因为输入输出端口有3个,所以这里使用3个IO Buffers,两个输入buffer,一个输出buffer。

clip_image004[4]

看下生成的工艺图。可看出lut2实现了与门的功能。打开lut2结构,可以看到:

clip_image006[4]

        从这就可以看出了,真值表的输入有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

有三个输入。综合后,看资源报告:

clip_image008[4]

使用了一个LUT,4个IO buffer。因为输入输出有4个,所以使用4个IO buffer。

可以发现,这里还是只用了一个LUT,只不过是LUT3。

查看工艺图:

clip_image010[4]

图中,可以看出结构。用LUT3实现了所要的功能。打开LUT3,查看:

clip_image012[4]

        可以看到,这时候的真值表的输入有三个,输出是根据功能定义预先计算的。这个大家可以去写写电路的真值表对比看看。

                  可看出,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个。综合看综合报告:

clip_image014[4]

        从报告,也可以看出,是使用了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中,综合出来的电路是以门级表示,当门级级联越多,输出延时就越大。