文章目录

一、CLB资源简介二、LUT查找表资源(SLICEM、SLICEL)三、LUT资源3.1 LUT资源工作原理3.2 LUT资源内部结构3.3 LUT功能的拓展3.4 LUT硬件原语

一、CLB资源简介

  Xilinx 7的FPGA可编程逻辑资源为CLB(Configurable Logic Block)   下图白色高亮为CLB资源:   在Xilinx的FPGA中,这样的CLB资源有很多个,组成可编程逻辑阵列;   我们看到在CLB资源中,还有两个区域如下图:   这些资源统称为SLICE,一个CLB中有两个SLICE,当然这两个SLICE片在名字与功能上也是有区别的;   绿色(SLICEM),黄色(SLICEL)   SLICEM的功能更偏向与组成DRAM(Distributed RAM,分布式RAM),SLICEL更偏向实现组合逻辑;   每一个SLICE中,有以下的资源,4个LUT(Look Up Table,查找表)、3个MUX(多路选择器)、1个CARRY(进位单元)和8个DFF(触发器);   其中一个SLICE中的MUX共3个,有2个是F7MUX(7输入多路选择器)1个是F8MUX(8输入多路选择器);   通过SLICE片中各个单元的组合、SLICE与SLICE之间的组合和CLB之间的组合,我们就能实现各种功能;

二、LUT查找表资源(SLICEM、SLICEL)

  LUT(Look Up Table)资源是FPGA中比较重要的一个资源,LUT资源也是构建组合逻辑的基本单元,可以说LUT资源越多,我们能够实现的功能就越复杂;   在FPGA中的LUT分为两种,分别是SLICEM中的LUT和SLICEL中的LUT; SLICEM中的LUT资源如下: SLICEL中的LUT资源如下:   这两种LUT资源之间最直观的区别是前者比后者多出了更多信号线;   这是因为SLICEM中的LUT资源多了移位逻辑,它既可以当作普通的LUT使用,也可以通过多块LUT组合成分布式RAM或ROM(Distributed RAM/ROM);

三、LUT资源

3.1 LUT资源工作原理

  通过LUT资源我们可以实现不同组合逻辑,这是因为LUT本质上就是一个小RAM,我们以查找表资源来讲,这里的表其实就是实现的组合逻辑的真值表,而这个真值表则存储于LUT中;   例:通过LUT2实现A&B逻辑 真值表:   我们将上面真值表中的A与B看做地址线,O看做RAM中的初值;   则LUT2资源如下:   LUT2的初始化值为4’b1000(十六进制:0x08)   当A = 1’b1 B = 1’b1 时,则此时寻址的是RAM的最高位,也就是1;

3.2 LUT资源内部结构

  在3.1节中,我们提到LUT本身就是一个RAM,以3.1节中LUT2的例子,其内部结构的简化图如下:

  最左侧为提前写入LUT资源的数据配置;   通过上述例子,我们还能拓展出LUT4、LUT6的结构图;

3.3 LUT功能的拓展

  在FPGA中,若仅通过配置LUT资源的配置,是很难实现更多复杂应用的,因为LUT资源的功能有限,此时就需要一些其他资源来与LUT配合,拓展LUT资源的功能;

  上图是Xilinx家FPGA的SLICE内部结构,我们主要观察上图中,LUT6的输出,其分别接到了MUX、CARRY上,当然也可以将LUT资源直接输出;   这些信号最终在CLICE输出的MUX上汇总;

  通过这一操作,我们可以拓展LUT6的功能,如通过两个LUT6与一个MUX实现LUT7,或者LUT6与CARRY组合,实现计算等等;   以下给出在工具进行综合后,MUX8与LUT6组合的实现(绿色)

3.4 LUT硬件原语

  在大多数情况下,我们只需用Verilog描述好电路逻辑,然后将其丢给编译器,进行分析综合,编译器就能自动将电路转换好,我们无需关注LUT资源的分配;但在某些情况下,我们需要直接例化LUT资源时,需要用到硬件原语;   以Xilinx的FPGA中LUT6资源为例,其原语如下:

LUT6 #(

.INIT(64'h0000000000000000) // Logic function

)

LUT6_inst (

.O(O), // 1-bit output: LUT

.I0(I0), // 1-bit input: LUT

.I1(I1), // 1-bit input: LUT

.I2(I2), // 1-bit input: LUT

.I3(I3), // 1-bit input: LUT

.I4(I4), // 1-bit input: LUT

.I5(I5) // 1-bit input: LUT

);

INIT: 提前写入LUT6的值; I0~I5: LUT6寻址线; O: LUT6寻址输出; 真值表: 例:例化LUT6实现与非门(~(a&b))   根据与非门,我们得到以下真值表   假设我们把LUT6的I0作为信号b,I1作为信号a,I2~I5作为保留位(默认为1),则真值表可以拓展为; 则需要初始化的值为   第60位:1’b1   第61位:1’b1   第62位:1’b1   第63位:1’b0 最终INIT值为64’h7000000000000000 则Verilog如下:

module nand(

input wire a,

input wire b,

output wire o

);

LUT6 #(

.INIT(64'h7000000000000000) // Logic function

)

LUT6_inst0 (

.O(o), // 1-bit output: LUT

.I0(b), // 1-bit input: LUT

.I1(a), // 1-bit input: LUT

.I2(1'b1), // 1-bit input: LUT

.I3(1'b1), // 1-bit input: LUT

.I4(1'b1), // 1-bit input: LUT

.I5(1'b1) // 1-bit input: LUT

);

endmodule

推荐链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。