FPGA中底层结构最重要两个东西LUT(查找表)和FF(触发器),今天我们先说LUT,看完这章内容,你能收获什么?
1. 理解LUT是什么?有什么用?其与门电路的区别是什么?
2. 理解我们写的RTL代码,如何映射到FPGA底层LUT
废话不多说,给大家讲下基础概念:
在7系列前,FPGA中使用LUT4(4输入LUT),而7系列后使用LUT6(6输入LUT)6个输入端口一共有2^6=64种输入,所以可以把LUT6看成一个容量为64的ROM。
我以一个最简单的Verilog代码以及综合后的门电路为例,所有输入均为1时输出才为1。
我们知道当我们用Verilog描述完电路逻辑后,扔给vivado编译器进行RTL门级电路分析和综合,电路就自动转化成映射到FPGA底层结构单元,也就是LUT和FF这些。为什么转化成门级电路后还要再综合成LUT呢?
说到这,我们拿LUT与门电路相比,优势在哪里?我们对比下,门电路图中data_out2的两个输入的输入时间肯定是不相等,因为I0要先经过data_out3,经过的门电路越多,延时就越大,最终导致整个系统速度上不去,但如果用LUT,就不会发生这种问题,原因请接着往下看。
接着再综合一下,看到该代码在FPGA底层最终电路的样子
在Tcl窗口输入write_verilog -force lut.v,查看该v文件网表结构,我们可以看到LUT的原语(原语可以理解成FPGA中最底层的模块)其中我们注意的是该LUT6原语的INIT值,64bit的INIT值只有最高位是1,其他均为0,这就是我们当初设计时想要的,只有所有输入均为1时输出才为1,其他均为0,该值代表是我们逻辑表达式真值表的结果,这便是LUT与数电中真值表的关系,FPGA用LUT这种结构来实现各种各样的门电路,我们通过修改INIT值,既可以与门电路一一映射。还记得文章最开始我说,LUT的本质就是64bit的ROM,采用LUT这种底层结构,由于FPGA上电进行配置时,就已经给每个LUT赋值好,将所有可能的逻辑值都存起来,需要用的时候再查找直接输出对应结果,大大提高灵活性和资源利用率,这也是FPGA快的主要原因。
该代码总消耗1个LUT和7个IOB
在实际开发中,如果采用多个LUT6级联来实现,当输入位数过多,即组合逻辑复杂时,则会造成级联的LUT6过多,逻辑级数变大大,其结果是通常会造成组合逻辑延时多大,导致时序紧张,因此,在设计中,我们一般采用插入FF的方法来切割组合逻辑,防止级数偶合,使得每一段的逻辑级数都不过于长,从而优化时序。