集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
楼主: lcytms

漫谈超前进位加法器CLA及其FPGA实现

[复制链接]
 楼主| lcytms 发表于 2017-4-6 23:43:35 | 显示全部楼层
16位超前进位加法器CLA的FPGA实现
其调用的子模块无需修改,沿用即可。

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

        input [15:0] a, b;
        input cin;
       
        output [15:0] s;
        output cout;

        wire [3:0] gg, gp, gc;                //
        wire ggg, ggp;        //

        bitslice4 b0 (a[ 3: 0], b[ 3: 0], gc[0], s[ 3: 0], gp[0], gg[0]);
        bitslice4 b1 (a[ 7: 4], b[ 7: 4], gc[1], s[ 7: 4], gp[1], gg[1]);
        bitslice4 b2 (a[11: 8], b[11: 8], gc[2], s[11: 8], gp[2], gg[2]);
        bitslice4 b3 (a[15:12], b[15:12], gc[3], s[15:12], gp[3], gg[3]);
       
        cla4 c0 (gp[3:0], gg[3:0], cin, gc[3:0], 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 [15:0] a, b;
        reg cin;
       
        wire [15:0] 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仿真结果如下图。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2017-4-6 23:54:47 | 显示全部楼层
32位超前进位加法器CLA的FPGA实现
其调用的子模块无需修改,沿用即可。

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

        input [31:0] a, b;
        input cin;
       
        output [31:0] s;
        output cout;

        wire[7:0] gg, gp, gc; //
        wire[3:0] ggg, ggp, ggc; //
        wire gggg, gggp; //

        //first level
        bitslice4 b0(a[ 3: 0], b[ 3: 0], gc[0], s[ 3: 0], gp[0], gg[0]);
        bitslice4 b1(a[ 7: 4], b[ 7: 4], gc[1], s[ 7: 4], gp[1], gg[1]);
        bitslice4 b2(a[11: 8], b[11: 8], gc[2], s[11: 8], gp[2], gg[2]);
        bitslice4 b3(a[15:12], b[15:12], gc[3], s[15:12], gp[3], gg[3]);
        bitslice4 b4(a[19:16], b[19:16], gc[4], s[19:16], gp[4], gg[4]);
        bitslice4 b5(a[23:20], b[23:20], gc[5], s[23:20], gp[5], gg[5]);
        bitslice4 b6(a[27:24], b[27:24], gc[6], s[27:24], gp[6], gg[6]);
        bitslice4 b7(a[31:28], b[31:28], gc[7], s[31:28], gp[7], gg[7]);

        //second level
        cla4 c0 (gp[3:0], gg[3:0], ggc[0], gc[3:0], ggp[0], ggg[0]);
        cla4 c1 (gp[7:4], gg[7:4], ggc[1], gc[7:4], ggp[1], ggg[1]);

        assign ggp[3:2] = 2'b11;
        assign ggg[3:2] = 2'b00;

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

endmodule
 楼主| lcytms 发表于 2017-4-6 23:57:42 | 显示全部楼层
32位超前进位加法器CLA的FPGA实现架构图如下。
注意观察图中红线部分的进位信号走向。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2017-4-7 00:02:31 | 显示全部楼层
64位甚至更高位数的依次类推。

小结:
        通过查阅资料,借鉴了各方的一个叙述,综合出自认为比较清楚的超前进位加法器CLA及其FPGA实现的介绍。
        原理方面,有待继续深入领悟。
        也请大神们不吝赐教,多谢多谢!
        谈及超前进位加法器CLA有感而发,匆匆整理成文,谨供参考。
 楼主| lcytms 发表于 2017-4-7 15:41:34 | 显示全部楼层
关于真值表的补充说明

参考信息:http://tekkamanninja.blog.chinau ... 436-id-3328681.html

附图如下。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2017-4-7 15:44:21 | 显示全部楼层
根据真值表可知二进制加法与十进制加法一样,进位值是逢二进一。
而和值则是上级进位值跟被加数跟加数总和模二的余数。
根据卡诺图化简得到S与Ci+1的全加器电路为:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
小舍YZ 发表于 2017-4-20 14:02:00 | 显示全部楼层
赞 ,,,,,,谢谢分享。。。。。。。
fpga_wuhan 发表于 2017-4-22 09:42:02 | 显示全部楼层
前进位加法器CLA及其FPGA实现
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2024-11-23 14:58 , Processed in 0.069930 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表