lcytms 发表于 2017-4-6 23:43:35

16位超前进位加法器CLA的FPGA实现
其调用的子模块无需修改,沿用即可。

module cla16_adder (a, b, cin, s, cout); //顶层模块

        input a, b;
        input cin;
       
        output s;
        output cout;

        wire gg, gp, gc;                //
        wire ggg, ggp;        //

        bitslice4 b0 (a[ 3: 0], b[ 3: 0], gc, s[ 3: 0], gp, gg);
        bitslice4 b1 (a[ 7: 4], b[ 7: 4], gc, s[ 7: 4], gp, gg);
        bitslice4 b2 (a, b, gc, s, gp, gg);
        bitslice4 b3 (a, b, gc, s, gp, gg);
       
        cla4 c0 (gp, gg, cin, gc, ggp, ggg);
        assign cout = ggg | (ggp & cin);

endmodule

lcytms 发表于 2017-4-6 23:45:01

编写cla16_adder的testbench。
编写cla16_adder_tb.v代码如下。

`timescale 1ns/1ps

module cla16_adder_tb;

        reg a, b;
        reg cin;
       
        wire s;
        wire cout;
       
        cla16_adder dut(.a(a), .b(b), .cin(cin), .s(s), .cout(cout));
       
        integer i;

        initial begin
                a = 0; b = 0; cin = 0;
               
                for (i=0; i<65536; i=i+1) begin
                        #10 a = i; b = i; cin = 0;
                        #10 a = i; b = i; cin = 1;
                end
       
                for (i=0; i<65536; i=i+1) begin
                        #10 a = i; b = i; cin = 0;
                        #10 a = i; b = i; cin = 1;
                end

                #200 $stop;
        end

endmodule

lcytms 发表于 2017-4-6 23:48:40

设置好仿真之后,cla16_adder仿真结果如下图。

lcytms 发表于 2017-4-6 23:54:47

32位超前进位加法器CLA的FPGA实现
其调用的子模块无需修改,沿用即可。

module cla32_adder (a, b, cin, s, cout); //顶层模块

        input a, b;
        input cin;
       
        output s;
        output cout;

        wire gg, gp, gc; //
        wire ggg, ggp, ggc; //
        wire gggg, gggp; //

        //first level
        bitslice4 b0(a[ 3: 0], b[ 3: 0], gc, s[ 3: 0], gp, gg);
        bitslice4 b1(a[ 7: 4], b[ 7: 4], gc, s[ 7: 4], gp, gg);
        bitslice4 b2(a, b, gc, s, gp, gg);
        bitslice4 b3(a, b, gc, s, gp, gg);
        bitslice4 b4(a, b, gc, s, gp, gg);
        bitslice4 b5(a, b, gc, s, gp, gg);
        bitslice4 b6(a, b, gc, s, gp, gg);
        bitslice4 b7(a, b, gc, s, gp, gg);

        //second level
        cla4 c0 (gp, gg, ggc, gc, ggp, ggg);
        cla4 c1 (gp, gg, ggc, gc, ggp, ggg);

        assign ggp = 2'b11;
        assign ggg = 2'b00;

        //third level
        cla4 c2 (ggp, ggg, cin, ggc, gggp, gggg);
        assign cout = gggg | (gggp & cin);

endmodule

lcytms 发表于 2017-4-6 23:57:42

32位超前进位加法器CLA的FPGA实现架构图如下。
注意观察图中红线部分的进位信号走向。

lcytms 发表于 2017-4-7 00:02:31

64位甚至更高位数的依次类推。

小结:
        通过查阅资料,借鉴了各方的一个叙述,综合出自认为比较清楚的超前进位加法器CLA及其FPGA实现的介绍。
        原理方面,有待继续深入领悟。
        也请大神们不吝赐教,多谢多谢!
        谈及超前进位加法器CLA有感而发,匆匆整理成文,谨供参考。

lcytms 发表于 2017-4-7 15:41:34

关于真值表的补充说明

参考信息:http://tekkamanninja.blog.chinaunix.net/uid-24875436-id-3328681.html

附图如下。

lcytms 发表于 2017-4-7 15:44:21

根据真值表可知二进制加法与十进制加法一样,进位值是逢二进一。
而和值则是上级进位值跟被加数跟加数总和模二的余数。
根据卡诺图化简得到S与Ci+1的全加器电路为:

小舍YZ 发表于 2017-4-20 14:02:00

赞 ,,,,,,谢谢分享。。。。。。。:)

fpga_wuhan 发表于 2017-4-22 09:42:02

前进位加法器CLA及其FPGA实现
页: 1 [2] 3 4 5
查看完整版本: 漫谈超前进位加法器CLA及其FPGA实现