Hoki

DSP in FPGA : 加法器

0
阅读(3145)

专题二:加法器

加法运算在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中有2Slice,而每个Slice中有4LUTLUT2个输出:O6O5,图3Slice中进位链为每个LUT分配了一个选择器MUX和异或门XOR构成的进位逻辑,并且4个从下到上纵向排列;CIN为下端进位输入,COUT输出给上端的进位,用于连接多个Slice间的进位,这样就保证实现位宽加大的加法器也能快速进位。

图3

module adder_test( input clk, input rst, input [15:0] a, input [15:0] b, input ci, output reg [15:0] sum, output reg co ); always@(posedge clk) if(rst) begin co<=1'b0; sum<=16'd0; end else {co,sum}<=a + b + ci; endmodule

FPGA中有了专用的快速进位链,在编写代码时就无需采用如超前进位这样的方式了,可采用常规的全加器进位结构,如下代码所示为16位加法器:

经过综合、实现后,在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

Baidu
map