《数字电路与数字系统实验》实验报告
O.
预习部分
加法器
多位加法器可以由 一 位加法器级联而成,图3 - 1(a) 是 一 位全加器真值
表,输入为a; 、b; 和 ci, 输 出 为 s; 和 ci+i; 图3- 1(b) 是 一 位加法器电路图,
图 3 1(d)是四位行波进位加法器框图 。输入为a(ao-a₃)、b(bo-b₃) 和 cm,
输出为 s(So-S₃) 和 Cou
一位全加器的设计相对简单,请同学们根据电路图自行思考如何设计一个
串行进位加法器电路。串行加法器速度 很慢,因为进位必须从最低位传至最高
位。要想构建速度较快的加法器,就要利用附加逻辑,提前算出进位信息,这
就是先行进位加法器的设计思想,先行进位加法有几种常用的算法,感兴趣的
同学可以查找资料自行学习。
图3-2:简单加减 ALU
通过预习了解了本次实验之一是要求我们设计一个具有加减法运算功能
的
ALU, 复习之前学习的知识可以知道加减法都是在一个运算器上实现的,
做加法的时候 Cin为0,两个数直接相加,做减法的时候Cin 为 1 , 被减数
取反,
当成加法来做,
结果是一样的.同时还要输出高位的一位进位和一位
表示溢出与否的溢出位以及类似 ZF 的判断结果是否为0的一位输出.同样的
通过复习的知识我们可以得出溢出位的表示,以及判断结果是否为0的表示.
加/减“0/1”
cn
三
操作数A
32
Zere
操作数B
1位扩展
为32位
异或门
阵列
Carry
Result
加
法
器
Overflow
B1
三
A1
首先可以根据 pdf 中的表达式:
input [n-1:0]
in_x,in_y;
output [n-1:0] out_s;
/ / 算 术 赋 值 语 句
out_s =in_x +in_y;
就 可 以 实 现 n 位 加 法 器 了 。
通过这样来获得加法的结果以及进位的结果, 当是做减法的时候我们
将减数取法再加上 Cin 即可当成加法来做,同样可以获得高位的进位和相
加的结果 .
在位运算层面,取负就是~A+1 即可,下面给出一些位运算技巧:
> x|(~x) 最高位 一 定是1
> ~!x+1` 在‘ x ==0 和 x!=0`** 的情况下可以化为很特殊的形式
**,分别是‘Oxffffffff 和 0x00. .00 `,** 想消除掉某个数,`&/ | `上全
零 或 全 1 是很好用的**
非 溢 出 判 断
同时利用这个结果就可以判断两个数相加是否溢出了,这也是利用了补码
Overflow =(in_x₁-1==in_yn-1)&&(out_Sn-1!=in_xn-1)
(3-1)
其判断原 理是 :如果两个 参加加法运 算的变量符 号相同,而运算结果的符号与
其不 相 同,则 运 算结果不 准 确,产生 溢 出。即 两 个正数相 加 结果为负 数 ,或者
两个负数相加结果为正数,则发生了溢出。 一正一负两个数相加是不会产生溢
出的。当然,还有其他的 判断溢出位的方式,请大家参照相关资料,了解其他
判断运算是否溢出的方法。
相加的结论:如果两个加数一正一负那么结果不会溢出, 只有两个正数相加结果
为负数,两个负数相加结果为正数才会溢出,这个表达式蕴含的也是这个原理.
> 思考题
思考题:
在判断输出结果是否为零的时候也有两种判断方式, 一种是用 if 语句,将
Result 和“0”相比较,这样在硬件上会产生一个比较器。还可以使用如下语
句:
1 assign zero =~(|Result);
“I Result”操作称为一元约简运算,这个运算在硬件上几个逻辑门就可以实
现了,请查阅Verilog
相关语法资料,了解此运算的操作过程。选择你认为好的
方式来进行结果是否为“0”的判断。
判断结果是否为0正如上述所述有两种方法, 第一种是利用if语句来进行判断
结果是否为0,这是最容易想到的方法,但是代码看起来不那么简洁,而且在硬件上
实现起来也不方便.而第二种方法是利用一元约简运算,这个运算符是利用该
数字的最高位和次高位相与,
结果再和次高位下面的一位相与得到一个结果,
依次这样进行下去直到和最后一位相与产生的结果就是运算的结果.这样可
以和容易判断一个数是否为0,而且硬件实现起来也比较简单,代码看起来也很舒
服,第二种方法更好.
> ALU 的原理
实际上 ALU 的设计是在全加器的基础上,对全加器功能的扩展来实现
符合要求的多种算术运算以及逻辑运算的功能.为了实现多种功能上面的An
Sn
Cn
全 加 器
Xn
Yn
F3—
函 数 发 生 器
F1-
An Bn
F2—
Cn-1