众所周知,1+1=2,对于较小位数的加法,大家都可以在瞬间报出结果,但是如果比较大呢?
13242345609745021+24234123421=?我们就需要一些运算时间来计算出结果。当然如果您是最强大脑选手,可能也能立刻报出答案。对于这种“最强大脑”选手,我们在FPGA中对应的就是性能,我们选择成本更高的fpga比如您一开始使用的是cyclone I,现在换成了cyclone V系列产品,那么运算速度就自然会提高。
我们现在的想法就是想在同一个芯片上,减小运算的延时,从而提高系统的工作频率,而不是通过改变器件。
回想一下我们小学课上学的竖式加法运算
我们想得到第k位的最终结果,就需要知道第k位的加数,被加数,以及是否进位,那么进位又需要上一位的加数,被加数,进位数..以此类推直到第一位。这就是所谓的行波加法器了。
module add_4 (
input [3:0]a,
input [3:0]b,
input c_in,
output [3:0] sum,
output c_out
);
wire [3:0] c_tmp; full_adder i0 ( a[0], b[0], c_in, sum[0], c_tmp[0]);
full_adder i1 ( a[1], b[1], c_tmp[0], sum[1], c_tmp[1] );
full_adder i2 ( a[2], b[2], c_tmp[1], sum[2], c_tmp[2] );
full_adder i3 ( a[3], b[3], c_tmp[2], sum[3], c_tmp[3] );
assign c_out = c_tmp[3];
endmodule
这是我从网上找到的一张图片,大概就是四个全加器级联,怎么个级联方法呢,就是把他们的低位进位输出连接到高位进位输入。关于全加器,如果大家不会的话,还是先翻翻verilog书吧,建议还是先把基础打好,因为这可以说是十分基本的内容了,任何一本verilog的书上肯定都会有的,我在这里主要介绍的是他的加强版超前进位加法器。
事实上,这个加法器需要9个门的传输延时,(第一个加法器需要三个,其他都是两个),于是我们想有没有一种方法可以快一点,让这个传输门的个数少一些呢,当然是可以的。这就是我要介绍的超前进位加法器了。
大家可以先自己想想,对于一个四位加法器来说,我们如何可以立刻知道第k位的进位值呢?因为如果我们知道了该位的进位值,就仅需要一个全加器也就是3个门延时就能得到了结果了,这无疑是令人兴奋的。
对于一个全加器我们知道
Si =Ai ^ Bi^ Ci-1
Ci = AiBi + AiCi-1 + BiCi-1=AiBi + (Ai+Bi)Ci-1

Gi=Ai*Bi ; Pi=Ai+Bi 代入Ci =AiBi + (Ai+Bi)Ci-1
得 Ci=Gi+Gi*Ci-1

C0 = C_in
C1=G0 + P0·C0
C2=G1 + P1·C1 = G1 + P1·G0 + P1·P0 ▪C0
C3=G2 + P2·C2 = G2 + P2·G1 + P2·P1·G0 + P2·P1·P0·C0
C4=G3 + P3·C3 = G3 + P3·G2 + P3·P2·G1 + P3·P2·P1·G0 + P3·P2·P1·P0·C0
C_out=C4
现在我们只需要三个门就可以实现四位加法运算了!
module ahead_adder4
(
input cin,
input [3:0]A,
input [3:0]B,
input [3:0]G,
input [3:0]P,
output  [3:0]S,
output   cout
);wire [3:0]C;assign C[0]= G[0] | (cin&P[0]);
assign C[1]= G[1] | (P[1]&G[0]) | (P[1]&P[0]&cin);
assign C[2]= G[2] | (P[2]&G[1]) | (P[2]&P[1]&G[0]) | (P[2]&P[1]&P[0]&cin);
assign C[3]= G[3] | (P[3]&G[2]) | (P[3]&P[2]&G[1]) | (P[3]&P[2]&P[1]&G[0]) | (P[3]&P[2]&P[1]&P[0]&cin);assign S[0]=A[0]^B[0]^cin;
assign S[1]=A[1]^B[1]^C[0];
assign S[2]=A[2]^B[2]^C[1];
assign S[3]=A[3]^B[3]^C[2];
assign cout=C[3];endmodule
那么问题来了,如何实现16位超前进位加法器呢!?
有一种办法是将4个4位超前进位加法器级联,但实际上这是一种超前+行波的方式,并不是最快的组合!
事实上我们可以根据16位加数和被加数直接写出这四个超前进位加法器的进位值,这样即实现了超前进位的超前进位加法器!
代码如下:
module ahead_adder
(
input [15:0]A,
input [15:0]B,
input CIN,
output reg [15:0]S,
output reg cout
);wire [15:0]G=A&B;
wire [15:0]P=A|B;
reg [3:0]cin;
wire cout1;task ahead_adder4;input cin;
input [3:0]A;
input [3:0]B;
input [3:0]G;
input [3:0]P;
output  reg [3:0]S;
output  reg cout;
reg [3:0]C;
begin
C[0]= G[0] | (cin&P[0]);
C[1]= G[1] | (P[1]&G[0]) | (P[1]&P[0]&cin);
C[2]= G[2] | (P[2]&G[1]) | (P[2]&P[1]&G[0]) | (P[2]&P[1]&P[0]&cin);
C[3]= G[3] | (P[3]&G[2]) | (P[3]&P[2]&G[1]) | (P[3]&P[2]&P[1]&G[0]) | (P[3]&P[2]&P[1]&P[0]&cin);S[0]=A[0]^B[0]^cin;
S[1]=A[1]^B[1]^C[0];
S[2]=A[2]^B[2]^C[1];
S[3]=A[3]^B[3]^C[2];
cout=C[3];
end
endtask
task ahead_carry;input cin;
input [15:0]G;
input [15:0]P;
output reg [3:0]cout;
reg [3:0]G2;
reg [3:0]P2;
beginG2[0]=G[3] | P[3]&G[2] | P[3]&P[2]&G[1] | P[3]&P[2]&P[1]&G[0];
G2[1]=G[7] | P[7]&G[6] | P[7]&P[6]&G[5] | P[7]&P[6]&P[5]&G[4];
G2[2]=G[11] | P[11]&G[10] | P[11]&P[10]&G[9] | P[11]&P[10]&P[9]&G[8];
G2[3]=G[15] | P[15]&G[14] | P[15]&P[14]&G[13] | P[15]&P[14]&P[13]&G[12];P2[0]=P[3]&P[2]&P[1]&P[0];
P2[1]=P[7]&P[6]&P[5]&P[4];
P2[2]=P[11]&P[10]&P[9]&P[8];
P2[3]=P[15]&P[14]&P[13]&P[12];cout[0]=G2[0] | (cin&P2[0]);
cout[1]=G2[1] | (P2[1]&G2[0]) | (P2[1]&P2[0]&cin);
cout[2]=G2[2] | (P2[2]&G2[1]) | (P2[2]&P2[1]&G2[0]) | (P2[2]&P2[1]&P2[0]&cin);
cout[3]=G2[3] | (P2[3]&G2[2]) | (P2[3]&P2[2]&G2[1]) | (P2[3]&P2[2]&P2[1]&G2[0]) | (P2[3]&P2[2]&P2[1]&P2[0]&cin);
end
endtaskalways@(*)
beginahead_carry(CIN,G[15:0],P[15:0],cin[3:0]);ahead_adder4 (CIN,A[3:0],B[3:0],G[3:0],P[3:0],S[3:0],cout1);//因为进位值实际上已经被算出来了,所以这个cout1就没有实际意义ahead_adder4 (cin[0],A[7:4],B[7:4],G[7:4],P[7:4],S[7:4],cout1);ahead_adder4 (cin[1],A[11:8],B[11:8],G[11:8],P[11:8],S[11:8],cout1);ahead_adder4 (cin[2],A[15:12],B[15:12],G[15:12],P[15:12],S[15:12],cout);//但是这个cout有实际意义,因为超前进位算出的是四个adder的低位进位值,没有算最后一个的高位进位,所以要保留
end
endmodule

verilog 4位16位任意位超前进位加法器相关推荐

  1. Verilog快速入门(8)—— 4bit超前进位加法器电路

    Verilog快速入门 (1) 四选一多路器 (2)异步复位的串联T触发器 (3)奇偶校验 (4)移位运算与乘法 (5)位拆分与运算 (6)使用子模块实现三输入数的大小比较 (7)4位数值比较器电路 ...

  2. Verilog实现超前进位加法器

    在CPU等对性能要求较高的电路中,一般都会采用超前进位加法器,因为超前进位加法器的延时相对来说比较小.下面讲述超前进位加法器的原理: 我们知道,一个三输入,二输出的全加器,其逻辑关系为 S=A⊕B⊕C ...

  3. 串行进位加法器与超前进位加法器 verilog

    文章目录 串行进位加法器 半加器 全加器 任意位数串行进位加法器 tb 4bit超前进位加法器 Reference 串行进位加法器 半加器 module half_adder (input in1,i ...

  4. 超前进位加法器实验报告_16位超前进位加法器实验报告

    一.实验目的 设计.验证并优化 16 位超前进位加法器的逻辑功能. 二.实验原理 1 . 1 位全加器原理 全加器的求和输出信号和进位信号,定义为输入变量 A . B . C 的两种组合布尔函 数: ...

  5. 32位进位选择加法器_超前进位加法器amp;行波进位加法器

    超前进位加法器&行波进位加法器 八位超前进位加法器 原理 设计文件 综合电路 测试文件 仿真波形 八位行波进位加法器 原理 设计文件 测试文件 仿真波形 总结 八位超前进位加法器 原理 有学弟 ...

  6. 4位先行进位加法器_行波进位/超前进位加法器详解

    行波进位加法器是串行执行的,其高位的运算要依赖低位的进位,所以当输入数据的位数较多时,会形成很大的延迟并可能成为芯片的关键路径. 采用超前进位加法器(也叫先行进位加法器)可以有效减小这种延迟.下面介绍 ...

  7. 原码一位乘法器设计_数字IC校招基础知识点复习(七)——超前进位加法器、Wallace树、Booth乘法器...

    1.超前进位加法器 看了一些面经,提到会让你用基础的门搭加法器,因此首先得熟悉半加器,全加器等最基础的加法器才能理解之后的超前进位加法器,树型加法器等复杂的加法器. 半加器的输入为a,b,输出为结果s ...

  8. 串行进位加法器和超前进位加法器代码实现及性能对比

    写在前面:要了解超前进位加法器的实现机制,参考超前进位加法器-郭天祥 代码实现 串行进位加法器 代码 adder_4bits.v module adder_4bits(a,b,cin,cout,sum ...

  9. 超前进位加法器 verilog代码

    超前进位加法器(Carry LookAhead Adder) 设计思想 由于行波进位加法器具有明显的延迟,从图中可以看出延迟主要是由进位传播链引起的,因此如何可以快速得到每一位的进位信号是加速计算的关 ...

最新文章

  1. 哈哈,我的博客开通啦,欢迎光临~~~~~~~~~~~~
  2. java方法里执行两条sql_Java如何在数据库上执行多个SQL命令?
  3. 【python3的学习之路七】函数
  4. Asp.net使用代码修改配置文件的节点值
  5. 大创idea2018-03-30
  6. Bootstrap 环境安装
  7. Booting Android: bootloaders, fastboot and boot images
  8. mysql空洞数据,Mysql 表空间和 数据页空洞
  9. 深入理解DOM节点关系
  10. 二叉树相关知识及求深度的代码实现
  11. vivo手机系统升级后没有服务器,为什么安卓手机升级到了12GB还没有iPhone 4GB运行快呢?...
  12. 安全中心登录_放心使用instagram需要做到的5个信息安全设置
  13. c#定时备份mysql数据库_C# 定时备份数据库工具源码下载
  14. Unix 下获得 root权限
  15. Nugine: Rust 性能调优
  16. Floyd-Warshall算法过程中矩阵计算方法—十字交叉法
  17. 出现—passwd:Authentication token manipulation error—错误的解决办法
  18. js对象嵌套数组_使用角管过滤嵌套数组和对象的数组并突出显示结果
  19. 一个好强的mm写给男朋友的绝交信
  20. 论文画图——eps格式的图

热门文章

  1. Neo4j 操作与 py2neo 用法
  2. 派森python教程_Python系列教程一Python入门(一)
  3. 计算机类说课优秀模板,全国“xx杯”计算机类教师说课大赛一等奖作品说课精品模板(一).ppt...
  4. c语言中extem的作用,extern是什么意思?C语言中extern用法全解
  5. linux 查看网页命令行,命令行浏览网页命令
  6. 数据收集-抓包与反爬
  7. 首都电子商务平台和软件环境的建设
  8. 贝叶斯方法的思想基础
  9. 机器人学笔记(改进)
  10. 从整车控制器VCU模型入门simulink(4)