实验六 8位硬件加法器
一.
1. 2. 3.
实验目的
掌握QuartusII的硬件描述语言设计方法 了解同步计数器的原理及应用
设计一个带使能输入、进位输出及同步清零的增1四位N (N<16)进制同步计数器
二.
1.
准备知识
串行进位加法器
若有多位数相加,则可采用并行相加串行进位的方式来完成。例如,有两个4位二进制数A3A2A1A0和B3B2B1B0相加 ,可以采用两片内含两个全加器或1片内含4个全加器的集成电路组成,其原理图如图6.1所示:
图6.1 串行进位加法器
由图6.1可以看出,每1位的进位信号送给下1位作为输入信号,因此,任1位的加法运算必须在低1位的运算完成之后才能进行,这种进位方式称为串行进位。这种加法器的逻辑电路比较简单,但它的运算速度不高。为克服这一缺点,可以采用超前进位等方式。 2.
超前进位加法器
对于一个加法器来说,它是一个纯组合电路。也就是它的输出在输入出现的时刻就已经确定了,包括它的和和进位值,是输入的组合逻辑。换而言之,只要知道输入,在不算出和的情况下也可以得到进位值,该值仅为输入的组合逻辑,以这样的一种思路设计的叫超前进位加法器。而所谓串行进位加法器,就是必须算得低位加法的值后才可以继续计算高位值,如图6.1所示的电路,引用了一位全加器构成了四位全加器。在硬件实现上,在4倍的单个全加器延时时间内它的输出都是不准确的,必须经过4倍的单个全加器延时时间才能得到准确值。如果是16位或32位的加法器,延时是不可容忍的。因此一般来说是直接利用输入组合逻辑方式同时决定结果的每一位和输出进位来实现的加法器,为超前进位加法器,相比与串行加法大大减低了多位加法所需要的延迟。
由于串行进位加法器的速度受到进位信号的限制,人们又设计了一种多位数超前进位加法逻辑电路,使每位的进位只由加数和被加数决定,而与低位的进位无关。现在介绍超前进位的概念。
根据全加器的功能,可列出它的真值表:
表6.1 全加器真值表
38
由全加器的真值表可得Si和Ci的逻辑表达式:
Si?AiBiCi?1?AiBiCi?1?AiBiCi?1?AiBiCi?1?Ai?BiCi?1?Ai?BiCi?1?Ai?Bi?Ci?1 (6.1)
Ci?AiBiCi?1?AiBiCi?1?AiBiCi?1?AiBiCi?1?AiBi?Ai?BiCi?1 (6.2)
定义两个中间变量Gi和Pi:
Gi?AiBiPi?Ai?Bi (6.3)
当Ai=Bi=1时,Gi=1,由Ci的表达式可得Ci=1,即产生进位,所以Gi称为产生量变 。若Pi=1,即Ai·Bi=0,则Ci=Ci-1,即Pi=1时,低位的进位能传送到高位的进位输出端,故Pi称为传输变量,这两个变量都与进位信号无关。
将Gi和Pi代入Si和Ci得:
Si?Pi?Ci?1Ci?Gi?PiCi?1 (6.4)
由式6.3可知,因为进位信号只与变量Gi、Pi和 Ci-1有关,而C-1是向最低位的进位信号,其值为0,所以各位的进位信号都只与两个加数有关,它们是可以并行产生的。
进而可得各位进位信号的逻辑表达如式6.5所示:
C0?G0C1?G1?P1C0?G1?P1G0C2?G2?P2C1?G2?P2G1?P2P1G0C3?G3?P3C2?G3?P3G2?P3P2G1?P3P2P1G0 (6.5)
根据超前进位概念构成的集成4位加法器74LS283的逻辑图如图6.2所示。
39
图6.2 集成4位加法器74LS283逻辑图
从以上分析可知,超前进位加法器速度变快了,但是其逻辑比较复杂,随着加法器位数的增加,其电路复杂程度难以想象,对具有运算速度要求的设计者来说,工作量很大。而QuartusII软件本身带有超前进位加法器模块,设计者可以根据需要进行设置、调用。
本实验的思路: 实现8位全加器。
加法器的两个加数如下处理:使用实验箱上的按键Key1,作为16进制计数器的时钟信号,其计数结果作为加数A的高位,并显示于数码管1;同样,Key2控制加数A的低位,显示于数码管2;Key3控制加数B的高位,显示于数码管3,Key4控制加数B的低位,显示于数码管4。
按键Key5,控制一个T触发器,显示于LED1,作为进位输入信号Cin,使用LED1亮为Cin=1,
40
LED1灭为Cin=0。
加法器使用QuartusII软件的兆功能模块LPM_ADD_SUB
加法器的结果:使用数码管7、8进行显示;其进位使用LED8显示,Cout=1时,LED8亮,Cout=0时,LED8灭。
按键都进行消抖处理。
三. 实验步骤
1、 新建工程ADDER
新建文件夹,并在该文件夹下新建工程。 2、 编写硬件描述语言文件
3、 新建顶层文件
新建原理图文件ADDER8,并设为顶层实体文件,根据本实验的思路,在该文件中逐个添加模块,以体现“从上至下”的设计理念。
编写多通道的按键消抖模块debounce,并封装生成模块符号文件。
使用兆功能模块之计数器模块,生成DIV200Hz模块符号文件,使之产生为200Hz的时钟信号作为消抖模块时钟信号。
使用兆功能模块之计数器模块,生成CNT16模块符号文件,计数结果为0~F的输出。
使用兆功能模块之加/减法器LPM_ADD_SUB模块,生成8位全加器ADD8模块符号文件,带进位输入和进位输出功能。注意这里的符号文件名为ADD8,不要和顶层文件或重名。步骤如下:
在顶层原理图文件空白区域双击鼠标,进入输入“Symbol”界面,选择“Megafunctions\\ arithmetic”下的“LPM_ADD_SUB”模块,点击“OK”按钮。在“输出文件名”处进行如图6.1所示的设置。其中的路径名和工程文件夹有关,也可以选择其他的文件名,不一定是“ADD8”。
图6.1 8位加法器设置步骤1
点击“Next”按钮,在弹出的界面进行如图6.2所示的设置,我们要定制“8”位的全“加”器。这里我们看出,该模块具有“加”、“减”、“加减使能”三种选择。
图6.2 8位加法器设置步骤2
点击“Next”按钮,在弹出的界面进行如图6.3所示的设置。其上面的一部分选择两个加数是否为“constant”常数,下面一部分是进行“Signed”有符号还是“Unsigned”无符号运算。
点击“Next”按钮,在弹出的界面进行如图6.4所示的设置。这里按设计要求设置带有进位输入和进位输出功能。
41
图6.3 8位加法器设置步骤3 图6.4 8位加法器设置步骤4
点击“Next”按钮,在弹出的界面进行如图6.4所示的设置。这里“pipeline”的含义就是流水输出,即该加法器使用几级流水线,也就是在多少个“Clock”周期后,产生求和结果。一般情况下,采用流水线输出,会使用更多的硬件资源,但使用了时钟寄存输出,得到的结果的“毛刺”现象会大大减少。我们这里不使用流水线输出。
图6.5 8位加法器设置步骤5
编写扫描显示模块,我们设定扫描频率为400Hz,故需要同时使用兆功能模块之计数器模块,生成DIV400Hz模块符号文件,使之产生为400Hz的时钟信号,为了减少逻辑单元的使用可以把DIV400Hz和DIV200Hz的两个模块合并为1个,方法:DIV400Hz 加上一个T触发器,就产生了200Hz的时钟信号,作为消抖模块的时钟信号。这里同时需要一个8进制的计数器,我们使用已有的16进制计数器CNT16来完成。
同时把未使用的LED置为灭状态,即相应的IO管脚置为高电平;把未使用的数码5、6显示0。 最后生成的顶层原理图文件如图6.6所示。
42