复杂数字系统设计报告
学 院: 电子工程学院
专 业: 电子与通信工程
班 级: 研 2-108
学生姓名: 童 源
学 号: 1075490268
具有乘法辅助指令的 16-bit ALU 的设计
一、设计要求
设计一个具有乘法辅助指令的 16-bit 算术逻辑单元 (ALU)。
(1) 完成普通 ALU 的全部功能。
逻辑运算:“与(and)”、“或(or)”、“非(not)”、“异或(xor)”;
移位运算(每条指令实现 1-bit 移位):“逻辑左移(lsl)”、“逻辑右移
(lsr) ”、“算数右移(asl)”;
算数运算:“加(add)”、“减 (sub)”、“带进位加(addc)”、“带借位减
(subc)”;
(2) 具有状态标志产生寄存功能。包括“零标志位(z)”、“进位标志 (c)”、“负
标志 (n) ”、“溢出标志 (o) ”。
(3) 指令(OpCode)为 4-bit 编码,自行确定;运算操作数来两个寄存器 (OpX &
OpY),输出结果分别存储与 ALU 结果寄存器 AR(16-bit)和乘积寄存器
MH:ML(32 -bit)中。
(4) 具有多周期乘法辅助指令(ppgen)。
(5) 加减法指令采用超前进位加法器(CLA)实现,乘法辅助指令采用修正Booth
算法的移位式乘法电路实现。
(6) 采用Top-Down设计方法,用Verilog HDL进行电路结构级和RTL级描述。
设计完备的测试向量集,对所设计的电路进行完善的功能验证,并给出详
细的ModelSim仿真结果。
下图为设计电路的参考结构框图。
图 1 具有乘法辅助指令的 16-bit ALU 参考结构框图
二、ALU 概述
算术逻辑单元是所有数字信号处理设备必不可少的运算部件,同时也是应用
最为灵活和使用频率最高的部件。ALU 主要完成两个输入操作数相加、相减、
相乘、相除算术运算及求‘与’、‘或’、‘异或’和‘非’等逻辑运算以及各种移位运算
等。ALU 中还设有运算结果的判定电路和相关的状态标志寄存器,可以对数据
运算结果的性质与状态进行检测和保存,供进一步处理时应用。
典型的算术运算单元(ALU)如下图所示:
图 2 典型 ALU 单元框图
可知典型的算术运算单元主要包括:指令译码单元、逻辑运算单元、移位运
算单元、加/减法器、多路数据选择器、状态标志寄存器。
本文的设计是在典型单元的基础上,按照图 1 的结构框图进行设计。由于设
计需要实现 16 位乘法功能,所以扩展了乘法控制模块,另外为了使设计的 ALU
模块实用,增添了通用寄存器组。本文设计的主要单元为:数据控制单元(由译
码单元改写)、逻辑运算单元、移位运算单元、加/减法器、多路数据选择器、状
态标志寄存器、乘法控制单元。
ALU 单元各模块功能为:数据控制单元根据指令进行译码,控制各个模块有
序工作。逻辑运算单元完成指令的逻辑操作。移位运算单元完成指令的移位操作。
加/减法器完成加减运算,以及在乘法控制模块的控制下完成乘法操作。多路数
据选择器完成运算结果的选取(本设计中包括送入加减法器乘法和加/减法操作
数的选择)。状态寄存器根据相应的操作产生对应的状态。乘法控制模块控制加
减法器实现多周期的乘法操作。
ALU 单元的操作步骤为:数据控制单元接收前级传出的指令,同时通用寄存
器组产生所需操作数。数据控制单元根据译码结果选择逻辑运算单元、移位运算
单元、算术运算单元(加/减法器)和乘法控制单元的执行相应的操作,然后控
制多路数据选择器选择操作结果,送入相应的结果寄存器和状态寄存器。
三、ALU 电路模块的设计
(1)数据控制单元
数据控制单元实现指令的译码,根据译码结果输出对应模块信号使能,以控
制各个模块有序工作。在程序设计中数据控制单元的模块名为 datactl。本设计中
除乘法指令外,其他指令都为单时钟周期。设计中采用了状态机的设计方法,初
始状态运行在单周期状态,当为乘法操作时进入多周期状态。为了使乘法操作有
序进行,乘法步骤也是在状态机的控制下有序进行操作,乘法状态机嵌套在单/
多周期状态机中。
ALU 的指令为:
OpCode 运算
与
0000
OpCode 运算
0100
0001
0010
0011
(and)
或
(or)
非
(not)
异或
(xor)
0101
0110
0111
OpCode 运算
加
1000
1001
1010
1011
(add)
减
(sub)
带进位加
(addc)
带借位减
(subc)
OpCode 运算
乘
1100
(mul)
null
1101
1110
1111
null
null
逻辑左移
(lsl)
逻辑右移
(lsr)
算术左移
(asl)
算术右移
(asr)
数据控制状态转移图如下图:
表 1 ALU 指令
图 3 数据控制单元状态转移图
(2)逻辑运算单元
逻辑运算单元主要实现操作数 Opx 和 Opy 的“与(and)”、“或(or)”、“异
或(xor)”和 Opx 的“非(not)”操作。在程序设计中逻辑运算单元的模块名为
log。
(3)移位运算单元
移位运算单元主要实现对操作数 Opx 的“逻辑左移(lsl)”、“逻辑右移(lsr)”、
“算术左移(asl)”、“算术右移(asr)”。设计每次操作都只进行 1 位操作。在程
序设计中移位运算单元的模块名为 shifter。
四种移位操作类型如下所示:
逻辑左移:
逻辑右移:
高位补‘0’
算术左移:
算术右移:
低位移出
(4)加/减法器
加/减法器主要实现操作数 Opx 和 Opy 的“加(add)”,“减”,“带进位加”,“带
借位减”。 在程序设计加/减法器的模块名为 adder17,它是对 adder4 进行调用产
生。
一位全加器是构造多位加法运算电路的基本单元。在全加器加法运算中,不
但要考虑本位数的运算,还必须考虑来自低位运算的进位信号。其逻辑运算表达
式如式(1),(2)所示。其中 A 和 B 表示加法操作数,Cin 表示进位输入,Sum
和 Cout 表示本位和进位输出。
Sum A B C
= ⊕ ⊕
in
ABC
ABC
ABC
=
+
+
in
in
in
A B C AB C A B
(
)(
(
+ +
+
=
+
A B C C
)
(
+ +
=
ABC
ABC
ABC
in
+
+
+
out
(1)
))
C
out
=
AB BC
in
+
+
AC
in
(2 )
由此可以得出常见典型加法器,行波进位加法器(Ripple Carry Adder,RCA),
如图 3 所示。N 位此加法器每一位的进位输入均由相邻低位的进位输出送来,在
最高位(N-1)得到最后的进位输出 Carry,运算结果 SUM 输出则从各个相应位
取得。行波进位加法器的进位信号是从最低位向最高位逐级传递的,延迟时间比
较大,在加法器位数较大的情况下,这种加法器的运算速度比较慢,故不能适应
高速运算时的速度要求。
图 3 行波进位加法器电路结构图
本设计中采用运算速度快的超前进位加法器(Carry Lookahead Adder,CLA),
这种加法器采用超前进位逻辑避免了行波进位加法器的进位延迟, 极大地提高
了运算速度。下面介绍超前进位加法器算法原理。
N 位加法运算中,某一位数的相加是否产生进位的条件是:
G A B
• i
=
i
i
(进位信号产生函数)
N 位加法运算中,其进位输入直接传递到该位进位输出的条件是:
P A B
i
i
=
i
+ (进位信号传递函数)
进行第 i 位加法运算时,首先进行进位产生和进位传递函数的计算,然后根
据 Gi 与 Pi 的结果计算该位的和与进位:
S C
B
i
i
i
C
G P C
=
i
i
A
= ⊕ ⊕
i
+ •
1
+
i
i
由方法可以推导出四位超前进位算法如下:
四位超前进位加法器的电路结构如图 4 所示:
图 4 四位超前进位加法器的电路结构
由上面的推导可知,每一特定位的进位信号可直接由本位操作数以及比它低
的各位的加数、被加数和最低位的进位输入产生,而不需要等待低位的进位信号
产生,这就是所谓的超前进位。一般在实现超前进位逻辑时,当加法器位数超过
4 位时,加法器位数每增加一位,电路复杂度迅速上升。因此对于 N-bit 加法器,
通常预先分为若干个位数不超过 4 位的加法器单元,各单元内部采用超前进位加
法器结构实现,在各组之间引入组进位产生信号和组进位传递信号,仍然采取超
前进位的方式,这样构成的多位加法器速度快,而且电路复杂度也可以接受。
利用超前进位形成逻辑的递归使用可以实现如图 5 所示的 16 位的超前进位加
法器 。
图 5 16 位的超前进位加法器
由于本设计中乘法采用改进的 Booth 算法,实现 16 位有符号数的移位式乘法
器时需要 17 位的加法器进行部分积累加,因此需要设计一个 17-bit 的超前进位
加法器,故实际设计中采用 17 位的超前进位加法器。当使用该加法器来实现
16-bit 操作数的加减法运算时,需要先把操作数高位加 0 扩展为 17 位。
(5)乘法控制单元
乘法运算单元主要完成两个 16-bit 有符号数的乘法运算。在乘法控制单元程
序设计的模块名为 mul_ctl。
传统的二进制乘法运算首先需要根据乘数中个各位的状态从低位到高位依
次产生相应的部分积,由于乘数中各位权值的不同,每个部分积相对于上一个部
分积需要左移一位,有多少位乘数就要产生多少个部分积。一般过程如图6所示。
(1) Booth 算法的基本思路
图 6 典型乘法过程
Booth 算法的基本思路是每次依次取出乘数的一位记为当前位,然后根据该
位值与前一次取出位数的值产生对应于该两位的部分积。在运算中,每次得到的
两位数对应有四种可能的组合,每种组合所对应的操作如下:
00 — 部分积相当于0•M,同时左移2位;
01 — 部分积相当于1•M,同时左移2位;
11 — 部分积相当于3•M,同时左移2位;
10 — 部分积相当于2•M,同时左移2位;
由于3•M的计算比较复杂,在实际实现时用(4•M-M)来替代。通常的作法是本
次运算中只执行(-M)操作,而(+4•M)则归并到下一个部分积生成时执行。因为下
一个部分积已经左移了2位,所以上次欠下的+4•M在此刻变成了+M(与移位后的
部分积正好对齐)。同样也可以将-M归并至上一个部分积中运算,此时其变成
-4•M。
(2)修正的Booth算法
修正Booth算法的编码过程中部分积可以直接通过被乘数移位得到,简化了
部分积产生过程,其编码表如表2所示。修正BOOTH算法能有效的减少乘法运算
过程中部分积的数目,两个N-bit的有符号数乘法,其部分积的个数降到(N+2)