计算机组成专题实验资料7 运算器设计案例Word格式.docx
《计算机组成专题实验资料7 运算器设计案例Word格式.docx》由会员分享,可在线阅读,更多相关《计算机组成专题实验资料7 运算器设计案例Word格式.docx(23页珍藏版)》请在冰点文库上搜索。
C0
C1=G1+P1C0
S2=P2
C1
C2=G2+P2C1=G2+P2G1+P2P1C0
S3=P3
C2
C3=G3+P3C2=G3+P3G2+P3P2G1+P3P2P1C0
S4=P4
C3
C4=G4+P4C3=G4+P4G3+P4P3G2+P4P3P2G1+P4P3P2P1C0
(2)减法器
减法可以用加法来实现,只需要把输入opr2、cin和输出cout取反即可。
(3)乘法器
由于VDHL硬件编程语言提供了乘法计算,只需在程序中申明即可实现,而不需要使用复杂的程序。
故此实验设计方案中不另外设计乘法器,而是调用系统软件包实现该运算。
(4)与、或、非、异或运算
与、或、非、异或的实现非常简单,只需对每个操作位进行按位运算即可。
(5)移位运算(移位数不超过7)
移位操作共有6种类型,算术左右移、逻辑左右移、循环左右移。
1.算术左移SAL(ShiftArithmeticalLeft)、算术右移SAR(ShiftArithmeticalRight)
把操作数看成带符号数,对寄存器操作数进行移位。
左移时空出的位补与最低位相同的1或0;
右移时空出的其余位补与最高位相同的1或0,如图2-4所示。
算术左移算术右移
图2-4算术左右移
2.逻辑左移SLL(ShiftLogicalLeft)、逻辑右移SLR(ShiftLogicalRight)
把操作数看成无符号数,对寄存器操作数进行移位。
左移时空出的位补‘0’;
右移时空出的其余位补‘1’,如图2-5所示。
逻辑左移逻辑右移
图2-5逻辑左右移
3.循环左移ROF(RotationLeft)、循环右移ROR(RotationRight)
循环左右移其实是一样的,比如说8位的操作数,左移n(0≤n≤8)位和右移n-8位结果是一样的。
左移时,移出的最高位移回到最低位;
右移时,移出的最低位移回到最高位。
如图2-6所示。
循环左移循环右移
图2-6循环左右移
2.3实验设计目标
设计一个8位运算器,满足以下要求。
(1)8位运算器能够进行下列运算:
加法、减法、加1、减1、乘法、与、或、非、传送、算术左移、算术右移、逻辑左移、逻辑右移、循环左移和循环右移。
用4位运算操作码OP[2..0]运算类型,控制方式如表2-1所示:
表2-1运算器方式表
运算操作码OP[3..0]
运算
对标志位flag的影响
0000
result←opr1+opr2
进位
0001
result←opr1+1
0010
result←opr1-opr2
借位
0011
result←opr1-1
0100
result←opr1*opr2
—
0101
result←opr1
0110
result←opr1andopr2
0111
result←opr1oropr2
1000
result←notopr1
1001
result←opr1xoropr2
1010
result←opr1salopr2
移位数是否合理
1011
result←opr1saropr2
1100
result←opr1sllopr2
1101
result←opr1alropr2
1110
result←opr1rolopr2
1111
result←opr1roropr2
(2)设计一个输入信号cin,表示之前低位向高位的进位或借位情况。
(3)设计一个运算控制信号set,当操作数和操作类型码准备好以后,set为高电平,启动运算过程。
(1)运算控制信号set对应实验台上开关SA0;
(2)低位向高位的进位或者借位信号cin对应实验台上开关SA1;
(3)操作码code[2..0]对应实验台上开关SA5~SA2;
(4)第一操作数opr1[7..0]对应于实验台上开关SD7~SD0;
(5)第二操作数opr2[7..0]对应实验台上开关SD15~SD8;
(6)运算结果result[15..0]对应实验台上指示灯A7~A0;
(7)运算结果标志位flag对应实验台上指示灯A8。
2.5实验步骤
(1)创建一个新文件夹E:
\ALU.
(2)使用File二级菜单中NewProjectWizard菜单项创建一个工程文件ALU.此时文件夹(目录)、工程名和顶层设计实体名全为ALU.设计使用器件为cyclone系列的EP1C6Q240C6.选择EDA工具选中3种功能:
综合、仿真和时序分析.检查工程中的各种设置确保无误.
(3)建立源文件.
新建VHDL类型的文件并命名为ALU.在VHDL文本编辑窗口内输入源程序.
---程序流程图如图2-7所示:
图2-7程序流程图
图2-8加法运算的流程图
---程序源代码如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
entityALUis
port(
set:
instd_logic;
--运算控制信号(算术/逻辑)
code:
instd_logic_vector(3downto0);
--操作码
cin:
--低位向高位的进位或者借位信号
opr1:
instd_logic_vector(7downto0);
--第一操作数(operand)
opr2:
--第二操作数
result:
outstd_logic_vector(7downto0);
--运算结果
flag:
outstd_logic--运算结果标志位flag
);
endALU;
architecturebehavofALUis
signala:
std_logic_vector(7downto0);
signalb:
signalc:
begin
process(a,b,c,set,code,cin,opr1,opr2)
variablei:
integer;
a<
="
00000000"
;
b<
C<
result<
flag<
='
0'
ifset='
1'
then
casecodeis
when"
0000"
=>
--"
+"
a(0)<
=opr1(0)andopr2(0);
b(0)<
=opr1(0)xoropr2(0);
--产生本地进位和传递条件
a
(1)<
=opr1
(1)andopr2
(1);
b
(1)<
=opr1
(1)xoropr2
(1);
a
(2)<
=opr1
(2)andopr2
(2);
b
(2)<
=opr1
(2)xoropr2
(2);
a(3)<
=opr1(3)andopr2(3);
b(3)<
=opr1(3)xoropr2(3);
a(4)<
=opr1(4)andopr2(4);
b(4)<
=opr1(4)xoropr2(4);
a(5)<
=opr1(5)andopr2(5);
b(5)<
=opr1(5)xoropr2(5);
a(6)<
=opr1(6)andopr2(6);
b(6)<
=opr1(6)xoropr2(6);
a(7)<
=opr1(7)andopr2(7);
b(7)<
=opr1(7)xoropr2(7);
--每四位一组,组内先行进位加法,组间串行进位加法.
result(0)<
=b(0)xorcin;
c(0)<
=a(0)or(b(0)andcin);
result
(1)<
=b
(1)xorc(0);
c
(1)<
=a
(1)or(b
(1)anda(0))or(b
(1)andb(0)andcin);
result
(2)<
=b
(2)xorc
(1);
c
(2)<
=a
(2)or(b
(2)anda
(1))or(b
(2)andb
(1)anda(0))or(b
(2)andb
(1)andb(0)andcin);
result(3)<
=b(3)xorc
(2);
c(3)<
=a(3)or(b(3)anda
(2))or(b(3)andb
(2)anda
(1))or(b(3)andb
(2)andb
(1)anda(0))or(b(3)andb
(2)andb
(1)andb(0)andcin);
result(4)<
=b(4)xorc(3);
c(4)<
=a(4)or(b(4)andc(3));
result(5)<
=b(5)xorc(4);
c(5)<
=a(5)or(b(5)anda(4))or(b(5)andb(4)andc(3));
result(6)<
=b(6)xorc(5);
c(6)<
=a(6)or(b(6)anda(5))or(b(6)andb(5)anda(4))or(b(6)andb(5)andb(4)andc(3));
result(7)<
=b(7)xorc(6);
flag<
=a(7)or(b(7)anda(6))or(b(7)andb(6)anda(5))or(b(7)andb(6)andb(5)anda(4))or(b(7)andb(6)andb(5)andb(4)andc(3));
0001"
+1"
=notopr1(0);
=opr1
(1)xoropr1(0);
=opr1
(2)xor(opr1
(1)andopr1(0));
=opr1(3)xor(opr1
(2)andopr1
(1)andopr1(0));
=opr1(4)xor(opr1(3)andopr1
(2)andopr1
(1)andopr1(0));
=opr1(5)xor(opr1(4)andopr1(3)andopr1
(2)andopr1
(1)andopr1(0));
=opr1(6)xor(opr1(5)andopr1(4)andopr1(3)andopr1
(2)andopr1
(1)andopr1(0));
=opr1(7)xor(opr1(6)andopr1(5)andopr1(4)andopr1(3)andopr1
(2)andopr1
(1)andopr1(0));
=opr1(7)andopr1(6)andopr1(5)andopr1(4)andopr1(3)andopr1
(2)andopr1(0);
0010"
-"
=opr1(0)and(notopr2(0));
=opr1(0)xor(notopr2(0));
=opr1
(1)and(notopr2
(1));
=opr1
(1)xor(notopr2
(1));
=opr1
(2)and(notopr2
(2));
=opr1
(2)xor(notopr2
(2));
=opr1(3)and(notopr2(3));
=opr1(3)xor(notopr2(3));
=opr1(4)and(notopr2(4));
=opr1(4)xor(notopr2(4));
=opr1(5)and(notopr2(5));
=opr1(5)xor(notopr2(5));
=opr1(6)and(notopr2(6));
=opr1(6)xor(notopr2(6));
=opr1(7)and(notopr2(7));
=opr1(7)xor(notopr2(7));
=b(0)xor(notcin);
=a(0)or(b(0)and(notcin));
=a
(1)or(b
(1)anda(0))or(b
(1)andb(0)and(notcin));
=a
(2)or(b
(2)anda
(1))or(b
(2)andb
(1)anda(0))or(b
(2)andb
(1)andb(0)and(notcin));
=a(3)or(b(3)anda
(2))or(b(3)andb
(2)anda
(1))or(b(3)andb
(2)andb
(1)anda(0))or(b(3)andb
(2)andb
(1)andb(0)and(notcin));
c(7)<
=notc(7);
0011"
-1"
=opr1
(1)xor(notopr1(0));
=opr1
(2)xor(not(opr1
(1)oropr1(0)));
=opr1(3)xor(not(opr1
(2)oropr1
(1)oropr1(0)));
=opr1(4)xor(not(opr1(3)oropr1
(2)oropr1
(1)oropr1(0)));
=opr1(5)xor(not(opr1(4)oropr1(3)oropr1
(2)oropr1
(1)oropr1(0)));
=opr1(6)xor(not(opr1(5)oropr1(4)oropr1(3)oropr1
(2)oropr1
(1)oropr1(0)));
=opr1(7)xor(not(opr1(6)oropr1(5)oropr1(4)oropr1(3)oropr1
(2)oropr1
(1)oropr1(0)));
=not(opr1(7)oropr1(6)oropr1(5)oropr1(4)oropr1(3)oropr1
(2)oropr1
(1)oropr1(0));
0100"
*"
操作数为4位,结果为8位,无符号数乘法
c<
=opr1(3downto0)*opr2(3downto0);
result<
=c;
0101"
--传送数据
=opr1(7downto0);
0110"
and"
=opr1(0)andopr2(0);
=opr1
(1)andopr2
(1);
=opr1
(2)andopr2
(2);
=opr1(3)andopr2(3);
=opr1(4)andopr2(4);
=opr1(5)andopr2(5);
=opr1(6)andopr2(6);
=opr1(7)andopr2(7);
0111"
or"
=opr1(0)oropr2(0);
=opr1
(1)oropr2
(1);
=opr1
(2)oropr2
(2);
=opr1(3)oropr2(3);
=opr1(4)oropr2(4);
=opr1(5)oropr2(5);
=opr1(6)oropr2(6);
=opr1(7)oropr2(7);
1000"
not"
=notopr1
(1);
=notopr1
(2);
=notopr1(3);
=notopr1(4);
=notopr1(5);
=notopr1(6);
=notopr1(7);
1001"
xor"
=opr1(0)xoropr2(0);
=opr1
(1)xoropr2
(1);
=opr1
(2)xoropr2
(2);
=opr1(3)xoropr2(3);
=opr1(4)xoropr2(4);
=opr1(5)xoropr2(5);
=opr1(6)xoropr2(6);
=opr1(7)xoropr2(7);
1010"
SAL"
caseopr2is
when"
=opr1;
00000001"
result(0)<
=opr1(0);
result(7downto1)<
=opr1(6downto0);
00000010"
result(7downto2)<
=opr1(5downto0);
00000011"
result(7downto3)<
=opr1(4downto0);
00000100"
result(7downto4)<
=opr1(3downto0);
00000101"
result(7downto5)<
=opr1(2downto0);
00000110"
resul