基于Verilog HDL的超前进位全加器设计

       通常我们所使用的加法器一般是串行进位,将从输入的ci逐位进位地传递到最高位的进位输出co,由于电路是有延迟的,这样的长途旅行是需要时间的,所以为了加快加法器的运算,引入了超前进位全加器。

全加器的两个逻辑表达式

       sum = a ^ b ^ cin;

       co = a & b | (a ^ b) & cin;

  sum = a ^ b ^ cin;

       co = a & b + a & cin + b & cin;

       这两个公式的电路图看起来不一样,但其实是一样的,同一个功能的电路可以有不同的描述方式。而且把co这两个表达式展开,观察其最小项表达式(画卡诺图),最终的结果也是一样的和真值表完全相符。

四位超前进位全加器

根据一位全加器的表达式可以推理出,四位全加器每一位的计算通式。

       为了达到并行的效果,通过公式化简,得到co和sum的表达式,每一位之间的运算都是独立的,和低位的运算没有关系,这样做达到完全并行,这就是四位超前进位全加器。

       有了四位全加器,我们可以以通过四位超前进位全加器设计出16位、32位、64位超前进位全加器,有些设计方法是将四个四位超前进位全加器串联起来,即将低四位的co连接到高四位的cin上,但这样并不能算得上是真正的并行,每四位是并行的,但每四位之间是串行的,博主目的是要达到完全并行的设计,继续往下看吧。

       这里的g是generation(生成)的意思,当a和b同时为1时,1位全加器必然产生进位,p表示propagation(传到)的意思,当a或b中有一个是1时,如果进位cin位1,1位全加器必然产生进位,利用这个原理即可做出四位超前进位全加器之间的超前进位。

       四位超前进位全加器的co进位输出端为

       这与一位全加器的进位类似,

       我们可以推出如下关系式

       我们通过调用四个超前进位全加器即可实现16位超前进位全加器,那么实现64位超前进位全加器其实也是和这个实现方法一样了,调用4个16位超前进位全加器就可以实现64位超前进位全加器。不过实际中CPU采用的是超前进位和串行进位集合,并行设计占面积,串行设计速度慢,尽量做到面积与速度之间的权衡。

       博主最近要学Verilog设计一个32位的简易CPU,其中ALU中想用上32位超前进位全加器。对于32位超前进位全加器,也是一样的方法。我选择的是三级并行设计,即四个四位超前进位全加器组间并行实现16位超前进位全加器,两个16位超前进位全加器组间并行实现32位超前进位全加器,至于两级并行还是多级并行看自己选择了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏V站

PHP日期时间函数 :time(),date(),mktime()区别

语法: int checkdate(int month, int day, int year);

32430
来自专栏一“技”之长

Objective—C语言的新魅力——Nullability、泛型集合与类型延拓

        在Xcode7中,iOS9的SDK已经全面兼容了Objective-C的一些新特性和新功能。这些功能都只作用于编译期,对程序的运行并没有影响,因...

9530
来自专栏walterlv - 吕毅的博客

为什么委托的减法(- 或 -=)可能出现非预期的结果?(Delegate Subtraction Has Unpredictable Result)

2017-12-28 02:03

11110
来自专栏函数式编程语言及工具

Akka(2):Actor生命周期管理 - 监控和监视

  在开始讨论Akka中对Actor的生命周期管理前,我们先探讨一下所谓的Actor编程模式。对比起我们习惯的行令式(imperative)编程模式,Actor...

40780
来自专栏屈定‘s Blog

设计模式--装饰者模式思考

装饰者模式实际上是一直提倡的组合代替继承的实践方式,个人认为要理解装饰者模式首先需要理解为什么需要组合代替继承,继承又是为什么让人深恶痛绝.

35820
来自专栏大壮

iOS直播(基础篇)-rtmpdefine NALU_TYPE_SLICE 1define NALU_TYPE_DPA 2define NALU_TYPE_DPB 3define NALU_TYPE_

17420
来自专栏菩提树下的杨过

linq to sql生成not in语句的小技巧

以前一直觉得linq to sql生成类似where id not in (1,3,5)或where id not in (select id from ......

20650
来自专栏谦谦君子修罗刀

程序员面试闪充--Block

1、介绍 Block是OC中非常重要的一种技术手段 ? 2、从c函数和oc函数的区别来定义block C函数写法:int add(int num1, int n...

30180
来自专栏撸码那些事

【封装那些事】 未利用封装

17340
来自专栏数据结构与算法

HDU 1848 Fibonacci again and again(SG函数)

Problem Description 任何一个大学生对菲波那契数列(Fibonacci numbers)应该都不会陌生,它是这样定义的: F(1)=1; ...

36160

扫码关注云+社区

领取腾讯云代金券