verilog 实现32位加法器(超前进位)
一、功能概述:
先行进位加法器是对普通的全加器进行改良而设计成的并行加法器,主要是针对普通全加器串联时互相进位产生的延迟进行了改良。超前进位加法器是通过增加了一个不是十分复杂的逻辑电路来做到这点的。
设二进制加法器第i
位为Ai,Bi
,输出为Si
,进位输入为Ci
,进位输出为Ci+1
,则有:
Si = Ai⊕Bi⊕Ci
(1-1)Ci+1 = Ai·Bi+ Ai·Ci+ Bi·Ci = Ai·Bi+(Ai+Bi)·Ci
(1-2)
令Gi = Ai·Bi
, Pi = Ai+Bi
,则Ci+1 = Gi+ Pi·Ci
- 当
Ai
和Bi
都为1时,Gi = 1
, 产生进位Ci+1 = 1
- 当
Ai
和Bi
有一个为1时,Pi = 1
,传递进位Ci+1 = Ci
因此Gi
定义为进位产生信号,Pi
定义为进位传递信号。Gi
的优先级比Pi
高,也就是说:当Gi=1
时(当然此时也有Pi=1
),无条件产生进位,而不管Ci
是多少;当Gi=0
而Pi=1
时,进位输出为Ci
,跟Ci
之前的逻辑有关。
下面推导4位超前进位加法器。设4位加数和被加数为A
和B
,进位输入为Cin
,进位输出为Cout
,对于第i
位的进位产生Gi = Ai·Bi
,进位传递Pi = Ai+Bi , i=0,1,2,3
。于是这各级进位输出,递归的展开Ci
,有:
C0 = Cin
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
(1-3)Cout = C4
由此可以看出,各级的进位彼此独立产生,只与输入数据Ai、Bi
和Cin
有关,将各级间的进位级联传播给去掉了,因此减小了进位产生的延迟。每个等式与只有三级延迟的电路对应,第一级延迟对应进位产生信号和进位传递信号,后两级延迟对应上面的积之和。
实现上述逻辑表达式 (1-3) 的电路称为超前进位部件(Carry Lookahead Unit),也称为CLA部件。通过这种进位方式实现的加法器称为超前进位加法器。因为各个进位是并行产生的,所以是一种并行进位加法器。
从公式 (1-3) 可知,更多位数的CLA部件只会增加逻辑门的输入端个数,而不会增加门的级数,因此,如果采用超前进位方式实现更多位的加法器,从理论上讲,门延迟不变。但是由于CLA部件中连线数量和输入端个数的增多,使得电路中需要具有大驱动信号和大扇入门,这会大大增加门的延迟,起不到提高电路性能的作用。因此更多位数的加法器可通过4位CLA部件和4位超前进位加法器来实现,如下图所示。
将式 (1-3) 中进位C4
的逻辑方程改写为:C4 = Gm0 + Pm0·C0
(1-4)
C4
表示4位加法器的进位输出,Pm0、Gm0
分别表示4位加法器的进位传递输出和进位产生输出,分别为:
Pm0 = P3·P2·P1·P0
Gm0 = G3 + P3·G2 + P3·P2·G1 + P3·P2·P1·G0
将式 (1-4) 应用于4个4位先行进位加法器,则有:
C4 = Gm0 + Pm0·C0
C8 = Gm1 + Pm1·C4 = Gm1 + Pm1·Gm0 + Pm1·Pm0·C0
C12 = Gm2 + Pm2·C8 = Gm2 + Pm2·Gm1 + Pm2·Pm1·Gm0 + Pm2·Pm1·Pm0·C0
C16=Gm3+Pm3·C12=Gm3+Pm3·Gm2+Pm3·Pm2·Gm1+Pm3·Pm2·Pm1·Gm0+Pm3·Pm2·Pm1·Pm0·C0
(1-5)
比较式 (1-3) 和式 (1-5),可以看出这两组进位逻辑表达式是类似的。不过式 (1-3) 表示的是组内进位,式 (1-5) 表示的是组间的进位。实现逻辑方程组 (1-5) 的电路称为成组先行进位部件。
二、verilog代码实现
1、一位全加器
//一位全加器
module adder(X,Y,Cin,F,Cout);input X,Y,Cin;output F,Cout;assign F = X ^ Y ^ Cin;assign Cout = (X ^ Y) & Cin | X & Y;
endmodule
2、4位CLA部件
/******************4位CLA部件************************/
module CLA(c0,c1,c2,c3,c4,p1,p2,p3,p4,g1,g2,g3,g4);input c0,g1,g2,g3,g4,p1,p2,p3,p4;output c1,c2,c3,c4;assign c1 = g1 ^ (p1 & c0),c2 = g2 ^ (p2 & g1) ^ (p2 & p1 & c0),c3 = g3 ^ (p3 & g2) ^ (p3 & p2 & g1) ^ (p3 & p2 & p1 & c0),c4 = g4^(p4&g3)^(p4&p3&g2)^(p4&p3&p2&g1)^(p4&p3&p2&p1&c0);endmodule
3、4位并行进位加法器
//四位并行进位加法器
module adder_4(x,y,c0,c4,F,Gm,Pm);input [4:1] x;input [4:1] y;input c0;output c4,Gm,Pm;output [4:1] F;wire p1,p2,p3,p4,g1,g2,g3,g4;wire c1,c2,c3;adder adder1(.X(x[1]),.Y(y[1]),.Cin(c0),.F(F[1]),.Cout());adder adder2(.X(x[2]),.Y(y[2]),.Cin(c1),.F(F[2]),.Cout()); adder adder3(.X(x[3]),.Y(y[3]),.Cin(c2),.F(F[3]),.Cout());adder adder4(.X(x[4]),.Y(y[4]),.Cin(c3),.F(F[4]),.Cout()); CLA CLA(.c0(c0),.c1(c1),.c2(c2),.c3(c3),.c4(c4),.p1(p1),.p2(p2),.p3(p3),.p4(p4),.g1(g1),.g2(g2),.g3(g3),.g4(g4));assign p1 = x[1] ^ y[1], p2 = x[2] ^ y[2],p3 = x[3] ^ y[3],p4 = x[4] ^ y[4];assign g1 = x[1] & y[1],g2 = x[2] & y[2],g3 = x[3] & y[3],g4 = x[4] & y[4];assign Pm = p1 & p2 & p3 & p4,Gm = g4 ^ (p4 & g3) ^ (p4 & p3 & g2) ^ (p4 & p3 & p2 & g1);endmodule
4、16位CLA部件
//16位CLA部件
module CLA_16(A,B,c0,S,px,gx);input [16:1] A;input [16:1] B;input c0;output gx,px;output [16:1] S;wire c4,c8,c12;wire Pm1,Gm1,Pm2,Gm2,Pm3,Gm3,Pm4,Gm4;adder_4 adder1(.x(A[4:1]),.y(B[4:1]),.c0(c0),.c4(),.F(S[4:1]),.Gm(Gm1),.Pm(Pm1));adder_4 adder2(.x(A[8:5]),.y(B[8:5]),.c0(c4),.c4(),.F(S[8:5]),.Gm(Gm2),.Pm(Pm2));adder_4 adder3(.x(A[12:9]),.y(B[12:9]),.c0(c8),.c4(),.F(S[12:9]),.Gm(Gm3),.Pm(Pm3));adder_4 adder4(.x(A[16:13]),.y(B[16:13]),.c0(c12),.c4(),.F(S[16:13]),.Gm(Gm4),.Pm(Pm4));assign c4 = Gm1 ^ (Pm1 & c0),c8 = Gm2 ^ (Pm2 & Gm1) ^ (Pm2 & Pm1 & c0),c12 = Gm3 ^ (Pm3 & Gm2) ^ (Pm3 & Pm2 & Gm1) ^ (Pm3 & Pm2 & Pm1 & c0);assign px = Pm1 & Pm2 & Pm3 & Pm4,gx = Gm4 ^ (Pm4 & Gm3) ^ (Pm4 & Pm3 & Gm2) ^ (Pm4 & Pm3 & Pm2 & Gm1);endmodule
5、32位并行进位加法器顶层模块
//32位并行进位加法器顶层模块
module adder32(A,B,S,C32);input [32:1] A;input [32:1] B;output [32:1] S;output C32;wire px1,gx1,px2,gx2;wire c16;CLA_16 CLA1(.A(A[16:1]),.B(B[16:1]),.c0(0),.S(S[16:1]),.px(px1),.gx(gx1));CLA_16 CLA2(.A(A[32:17]),.B(B[32:17]),.c0(c16),.S(S[32:17]),.px(px2),.gx(gx2));assign c16 = gx1 ^ (px1 && 0), //c0 = 0C32 = gx2 ^ (px2 && c16);endmodule
三、仿真程序与结果
`timescale 1ns/1ns
module adder32_tb;reg [32:1] A;reg [32:1] B;wire [32:1] S;wire c32;adder32 adder32(.A(A),.B(B),.S(S),.C32(c32));initial beginA = 32'd0; B = 32'd0;#5; A = 32'd 456; B = 32'd234;#5; A = 32'd 245; B = 32'd678;$stop; end
endmodule
verilog 实现32位加法器(超前进位)相关推荐
- 【计算机组成原理 数字逻辑 Verilog】32位加法器的实现:支持整数的加减运算
目录 0 前言 0.1 使用环境 0.2 知识点 0.3 注意事项 1 建模:1位加法器 1.1 构建基础模型 1.1.1 一位加法器 1.1.1.1 科技黑箱:外部端口与功能 1.1.1.2 揭秘黑 ...
- 【Verilog】32位单精度浮点数比较大小
参考链接 32位单精度浮点数的IEEE表示法 问题描述 在使用Verilog编写模块时,有时会需要进行多个浮点数中取最大/最小值的操作,而Vivado中提供的floating-point IP核并 ...
- 超前进位加法器 verilog代码
超前进位加法器(Carry LookAhead Adder) 设计思想 由于行波进位加法器具有明显的延迟,从图中可以看出延迟主要是由进位传播链引起的,因此如何可以快速得到每一位的进位信号是加速计算的关 ...
- Verilog中的加法器(半加器,全加器,串行、超前进位加法器)
加法器为半加器和全加器: 半加器:不考虑低位向高位的进位.2输入,2输出. 全加器:考虑低位向高位的进位.3输入(多了进位输入C),2输出. Verilog代码如下: module half_add( ...
- 串行进位加法器和超前进位加法器代码实现及性能对比
写在前面:要了解超前进位加法器的实现机制,参考超前进位加法器-郭天祥 代码实现 串行进位加法器 代码 adder_4bits.v module adder_4bits(a,b,cin,cout,sum ...
- 4位加法器的设计代码verilog_HDLBits:在线学习Verilog(六 · Problem 25-29)
本系列文章将和读者一起巡礼数字逻辑在线学习网站 HDLBits 的教程与习题,并附上解答和一些作者个人的理解,相信无论是想 7 分钟精通 Verilog,还是对 Verilog 和数电知识查漏补缺的同 ...
- 超前进位加法器(较为详细讲解)
先谈谈超前进位加法器设计的初衷. 我们从数电书学到的最基本的加法器的结构是下图这样的: 从图中很好理解加法器的组成. 一位的加法器直接卡诺图既可以画出来. 但是这样的结构有什么缺点?最直接的就是第4号 ...
- 超前进位加法器实验报告_超前进位加法器
首先画出2位全加器的真值表与卡诺图 根据真值表可知二进制加法与十进制加法一样,进位值是逢二进一.而和值则是上级进位值跟被加数跟加数总和模二的余数.根据卡诺图化简得到S与Ci+1的全加器电路为: 多位加 ...
- 计算机组成原理快速加法器与32位ALU设计实验报告(8位可控加减法电路设计、CLA182四位先行进位电路设计、4位快速加法器设计、16位快速加法器设计、32位快速加法器设计)
实验二 快速加法器与32位ALU设计实验 本次实验,进行了五个实验,分别是8位可控加减法电路设计.CLA182四位先行进位电路设计.4位快速加法器设计.16位快速加法器设计.32位快速加法器设计.这次 ...
最新文章
- 如何用python计算工资-手把手用Python教你分析运筹学薪资状况
- 我是如何使用python控制迅雷自动下载电影的?
- Mybatis 关键组件(注意各组件的最佳作用域)
- python 求连线相似度_Python分析《都挺好》中的人物关系,苏大强与蔡根花是真爱?...
- unity 删除子节点_【Unity文档】Realtime GI介绍(一)
- datagrip中运行sql语句
- 【UOJ#33】【UR #2】树上GCD(长链剖分/根号分类讨论)
- Tomcat 内存调大
- mysql 清空或删除表数据后,控制表自增列值的方法
- process is bad
- Java二叉树的建立
- 计算机管理工具怎么设置,电脑音频管理器怎么设置,教你电脑音频管理器怎么设置...
- 程序员如何向领导提涨薪加薪
- 2019年年末给我自己的一个总结---发现自己其实外表平静,内心狂野哈哈哈哈哈
- Latex 插入的图片紧跟当前文字
- 苹果CMS绑定分类失败,刷新就丢失!
- 输出1~999999的水仙花数
- 用Scrapy和Selenium爬取动态数据
- Code for VeLO 1: Training Versatile Learned Optimizers by Scaling Up
- 无线测温装置在变压器中的设计与应用
热门文章
- 一台服务器控制上百个抖音账号,怎么批量管理上百个抖音,抖音mcn一键高效运营软件...
- 使用Python的Cufflinks库创建三维散点图
- 【Javascript】获取当前网站协议,域名,完整域名.
- 通过ip查看主机名 通过主机名查看ip
- linux的systemctl命令介绍
- 以“开放同行评议”推动学术发展
- 【matlab】拟合直线的方法
- 《算法竞赛入门经典(第2版)》——学习记录
- 【学习笔记】dij 费用流 + 势能函数
- C语言模拟实现:atoi函数