tag 标签: fpga,加法器

相关博文
  • 热度 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