热度 17
2012-8-22 09:23
4095 次阅读|
4 个评论
专题二:加法器 加法运算在FPGA设计中经常使用,其中常用的加法器有全加器和半加器,一个基本的N位二进制加法可由N个全加器构成,每个加法器的表达式如下: 由上式可得进位c的逻辑相比于加法结果位s逻辑较复杂,因此设计延迟较短的进位逻辑成了关键,目前有很多进位相关技术,如串行进位、超前进位等。如图1所示为串行进位方式的加法器,图2所示为超前进位方式的加法器。 图1 串行进位相应Verilog HDL代码: assign c0=(a0 b0) | ((a0 | b0) cin); assign c1=(a1 b1) | ((a1 | b1) c0); 图2 超前进位相应Verilog HDL代码: assign p0 = a0 | b0; assign g0 = a0 b0; assign p1 = a1 | b1; assign g1 = a1 b1; assign c0 = g0 | (p0 cin); assign c1 = g1 | (p1 g0) | (p1 p0 cin); 按速度和面积原则,串行进位以面积为原则,而超前进位以速度为原则。 加法器几乎是每个FPGA设计中必备的,因此专门为加法器设计一个快速的进位链是很有必要的,实际上FPGA厂商也是这么做的,以Xilinx 7系列FPGA为例。如图3所示为其Slice中的进位链结构,在 Xilinx 7系列FPGA使用之CLB探索 中介绍过在CLB中有2个Slice,而每个Slice中有4个LUT,LUT有2个输出:O 6 和O 5 ,图3中Slice中进位链为每个LUT分配了一个选择器MUX和异或门XOR构成的进位逻辑,并且4个从下到上纵向排列;CIN为下端进位输入,COUT输出给上端的进位,用于连接多个Slice间的进位,这样就保证实现位宽加大的加法器也能快速进位。 图3 FPGA中有了专用的快速进位链,在编写代码时就无需采用如超前进位这样的方式了,可采用常规的全加器进位结构,如下代码所示为16位加法器: module adder_test( input clk, input rst, input a, input b, input ci, output reg sum, output reg co ); always@(posedge clk) if(rst) begin co=1'b0; sum=16'd0; end else {co,sum}=a + b + ci; endmodule 经过综合、实现后,在Xilinx FPGA Editer工具中可以查看加法器的具体布线图,如图4、5所示,由图4可得15位加法器可由4个Slice实现,每个Slice实现4个全加器,2个Slice间用一条进位链连接;而其它进位都在Slice里面,如图5所示,由一个LUT和为其分配地MUX、XOR进位结构就可实现一个全加器。 图4 图5 通过Post-Map Static Timing分析得到Min period limit: 1.408ns (710.227MHz) (Tbcper_I(Fmax)),其中进位逻辑延时非常之小,主要的布线延迟都在I/O和逻辑之间。 另外从图4仔细观察可以发现在蓝色Slice旁还有一个灰色的Slice未使用,此灰色Slice是与蓝色Slice同在一个CLB中的另一个Slice,为什么会有这种结构?这还是因为CLB的结构,上文中说过在一个Slice内部进位链是纵向的,而在Slice外部如图6所示,也是纵向的,同处于一个CLB中的2个横向排列的Slice并没有进位链,这样就保证了所有进位链统一的纵向性,是进位链延时达到最小。 图6