博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
先行进位加法器
阅读量:6307 次
发布时间:2019-06-22

本文共 2138 字,大约阅读时间需要 7 分钟。

    串行进位加法器需要一级一级的进位,进位延迟很大。先行进位加法器(也叫超前进位加法器)可以有效的减少进位延迟。

    设二进制加法器的第i位输入为Xi, Yi, 输出为Si, 进位输入为Ci,进位输出为Ci+1

则有

         Si = XiYiCi

      Ci+1  = Xi·Yi + Xi·Ci + Yi·Ci = Xi·Yi + (Xi + Yi)·Ci

Gi = Xi·Yi,     Pi = Xi+Yi

Ci+1  = Gi + Pi·Ci

XiYi都为1时,Gi = 1,产生进位Ci+1 = 1

XiYi有一个为1时,Pi = 1,传递进位Ci+1 = Ci

    因此Gi 定义为进位产生信号,Pi定义为进位传递信号。Gi的优先级比Pi高,也就是说:当Gi = 1时(当然此时也有 Pi = 1 ),无条件产生进位,而不管Ci是多少;

Gi=0Pi=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 + P0·C0=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

Cout=C4

    由此可以看出,各级的进位彼此独立产生,只与输入数据和Cin有关,将各级间的进位级联传播给去掉了,因此减小了进位产生的延迟。

    每个等式与只有三级延迟的电路对应,第一级延迟对应进位产生信号和进位传递信号,后两级延迟对应上面的积之和,这可由Synplify综合后的RTL电路看到。

同时由真值表可以简单的得出第i位的和为:

            Si = XiYiCi = (Xi·Yi)(Xi+Yi)Ci = GiPiCi

    根据上面的式子便可以设计出超前进位加法器。按照《数字系统设计与Verilog HDL》中的方法,用Verilog编写了4位超前进位加法器,代码如下:

module add_ahead(a,b,sum,cin,cout     ); input [3:0] a,b; input cin; output [3:0] sum; output cout; wire c1,c2,c3;//各级进位输出 wire [3:0] g,p; //产生第 0 位的本位值和进位输出 assign g[0]= a[0]& b[0]; assign p[0]= a[0]| b[0]; assign sum[0]= g[0]^p[0]^cin; assign c1=g[0]|(p[0]&cin); //产生第 1 位的本位值和进位输出 assign g[1]= a[1]& b[1]; assign p[1]= a[1]| b[1]; assign sum[1]= g[1]^p[1]^c1; assign c2=g[1]|(p[1]&c1); //产生第 2 位的本位值和进位输出 assign g[2]= a[2]& b[2]; assign p[2]= a[2]| b[2]; assign sum[2]= g[2]^p[2]^c2; assign c3=g[2]|(p[2]&c2); //产生第 3 位(最高位)的本位值和进位输出 assign g[3]= a[3]& b[3]; assign p[3]= a[3]| b[3]; assign sum[3]= g[3]^p[3]^c3; assign cout=g[3]|(p[3]&c3); endmodule

    这段代码在实现c2,c3,cout的时候,仍然用了前一级的进位,我开始以为综合器会自动展开,但是用Synplify综合后发现,每一位的进位仍然与前一位的进位输出有关。于是将上面计算c2,c3,cout的代码用上面展开后的公式实现,如下:

assign c2=g[1]|(p[1]&g[0])|(p[1]&p[0]&cin); assign c3=g[2]|(p[2]&g[1])|(p[2]&p[1]&g[0])|(p[2]&p[1]&p[0]&cin); assign cout=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);

    再用Synplify综合,发现c1,c2,c3,cout都只与初始进位和输出数据有关,各级进位间不存在进位延迟了。

    修改后的程度用Modelsim仿真结果正确。

转载于:https://www.cnblogs.com/haigege/archive/2011/09/30/2196275.html

你可能感兴趣的文章
学习知识应该像织网一样去学习——“网状学习法”
查看>>
Hadoop集群完全分布式安装
查看>>
QString,char,string之间赋值
查看>>
我的友情链接
查看>>
Nginx+mysql+php-fpm负载均衡配置实例
查看>>
shell脚本操作mysql数据库 (部份参考)
查看>>
MySql之基于ssl安全连接的主从复制
查看>>
informix的逻辑日志和物理日志分析
查看>>
VMware.Workstation Linux与windows实现文件夹共享
查看>>
ARM inlinehook小结
查看>>
wordpress admin https + nginx反向代理配置
查看>>
管理/var/spool/clientmqueue/下的大文件
查看>>
HTML学习笔记1—HTML基础
查看>>
mysql dba系统学习(20)mysql存储引擎MyISAM
查看>>
centos 5.5 64 php imagick 模块错误处理记录
查看>>
apache中文url日志分析--php十六进制字符串转换
查看>>
Ansible--playbook介绍
查看>>
浅谈代理
查看>>
php创建桌面快捷方式实现方法
查看>>
基于jquery实现的超酷动画源码
查看>>