当前遇到LUT资源利用过度问题,看一下CLB组成,再去优化资源。
CLB结构
CLB能实现什么?
1CLB = 2Slice, 两个slice不直接相连,每个slice是一列,有各自的进位链;Each CLB can contain two SLICEL or a SLICEL and a SLICEM
1slice = 4LUT6 + 8FF
LUT
7系列FPGA的LUT可以配置为2种:
第1种是:LUT6:6个input和1个output。
第2种是:2个LUT5,有2个独立的输出,但是要求这两个LUT的输入地址和逻辑完全一致。
1个slice有4个LUT6,分别编号为ABCD。
6个输入的函数只需使用1个LUT6。
7个输入的函数只需使用2个LUT6。
8个输入的函数只需使用4个LUT6。
所以为了节省资源尽量使用<=6个输入。
LUT 在Slice中的位置
从下图可以看出:
LUT.O6
1.可以直接输出到本个slice的外面信号是A。
2.可以与BLUT.O6、CLUT.O6,DLUT.O6进行MUX。
3.可以连接到异或门。
4.可以当进位逻辑多路复用器的选择信号。
5.可以给FF.D
LUT.O5
1.可以直接输出到本个slice的外面信号是AMUX。
2.可以进入进位链。
3.可以给FF.D
LUT5
本以为例化两个相同的LUT5会使用O6和O5,结果并不是,而是直接通过线一分二。
LUT5_module lut5_inst0 (.i_lut5 ( i_lut5 ), .o_lut5( o_lut5_0 ) );
LUT5_module lut5_inst1 (.i_lut5 ( i_lut5 ), .o_lut5( o_lut5_1 ) );
module LUT5_module(
input [4:0] i_lut5 ,
output o_lut5
);
assign o_lut5 = &i_lut5 ;
// LUT5_module lut5_inst (.i_lut5 ( ), .o_lut5( ) );
endmodule
LUT6
结论:确实占用了1个LUT6资源
module LUT6_module(
input [5:0] i_lut6 ,
output o_lut6
);
assign o_lut6 = &i_lut6 ;
// LUT6_module lut6_inst (.i_lut6 ( ), .o_lut6( ) );
endmodule
LUT7
并没有使用F7AMUX,而是两个不同的CLB,不知道为什么?
LUT7_module lut7_inst (.i_lut7 ( i_lut7 ), .o_lut7( o_lut7 ) );
module LUT7_module(
input [6:0] i_lut7 ,
output o_lut7
);
assign o_lut7 = &i_lut7 ;
// LUT7_module lut7_inst (.i_lut7 ( ), .o_lut7( ) );
endmodule
LUT8
和LUT7一样,也不是在通一个CLB
module LUT8_module(
input [7:0] i_lut8 ,
output o_lut8
);
assign o_lut8 = &i_lut8 ;
// LUT8_module lut8_inst (.i_lut8 ( ), .o_lut8( ) );
endmodule
MUX
少用大的选择器
4:1 multiplexers using one LUT
Four 4:1 MUXes per slice
8:1 multiplexers using two LUTs
Two 8:1 MUXes per slice
16:1 multiplexers using four LUTs
One 16:1 MUX per slice