计算机组成专题实验资料7 运算器设计案例.docx
- 文档编号:3175292
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:23
- 大小:180.20KB
计算机组成专题实验资料7 运算器设计案例.docx
《计算机组成专题实验资料7 运算器设计案例.docx》由会员分享,可在线阅读,更多相关《计算机组成专题实验资料7 运算器设计案例.docx(23页珍藏版)》请在冰点文库上搜索。
计算机组成专题实验资料7运算器设计案例
运算器实现案例
2.运算器的设计与实现2
2.1实验目的2
2.2实验原理2
2.3实验设计目标4
2.4顶层设计实体的引脚对应关系:
5
2.5实验步骤5
2.6实验现象15
2.7实验总结15
运算器的设计与实现
2.1实验目的
(1)掌握基本的算术运算和逻辑运算的运算规则和实现方法;
(2)掌握简单运算器的传送通路;
(3)掌握运算器的工作原理,设计并实现具有一定功能的运算器。
2.2实验原理
运算器是既能实现算术运算又能完成逻辑运算的部件。
算术运算主要包括加减乘除运算,逻辑运算主要包括与、或、非、异或和移位运算。
运算器(ALU)通常有两个数据输入端(opr1和opr2),一个数据输出端(result),运算模式控制信号(code)和标志位(cin,flag)等。
下图为运算器的逻辑框图:
图2-1运算器
运算器包含加法器、减法器、乘法器、与门、或门、非门、异或门和移位器。
各组成部件的原理如下所述。
(本实验中设计的运算器操作数为8位字长)。
(1)加法器
从进位传递时间和门电路的扇入、扇出来考虑,将8位数据分为两组,采取组内并行、组间串行的设计方案。
该加法器的设计框图如下所示:
图2-28位的加法器
其中,Gi=opr1(i)andopr2(i)(i=1,…,7),Gi为第i位的本地进位,Pi=opr1(i)xoropr2(i)(i=1,…,7),P(i)为传递条件。
4位先行加法器的逻辑图如下所示:
图2-34位先行加法器逻辑图
于是根据逻辑图可以得出4位先行加法器的逻辑表达式如下:
Gi=opr1(i-1)opr2(i-1)
Pi=opr1(i-1)
opr2(i-1)
S1=P1
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为高电平,启动运算过程。
2.4顶层设计实体的引脚对应关系:
(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:
instd_logic;--低位向高位的进位或者借位信号
opr1:
instd_logic_vector(7downto0);--第一操作数(operand)
opr2:
instd_logic_vector(7downto0);--第二操作数
result:
outstd_logic_vector(7downto0);--运算结果
flag:
outstd_logic--运算结果标志位flag
);
endALU;
architecturebehavofALUis
signala:
std_logic_vector(7downto0);
signalb:
std_logic_vector(7downto0);
signalc:
std_logic_vector(7downto0);
begin
process(a,b,c,set,code,cin,opr1,opr2)
variablei:
integer;
begin
a<="00000000";
b<="00000000";
C<="00000000";
result<="00000000";
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));
when"0001"=>--"+1"
result(0)<=notopr1(0);
result
(1)<=opr1
(1)xoropr1(0);
result
(2)<=opr1
(2)xor(opr1
(1)andopr1(0));
result(3)<=opr1(3)xor(opr1
(2)andopr1
(1)andopr1(0));
result(4)<=opr1(4)xor(opr1(3)andopr1
(2)andopr1
(1)andopr1(0));
result(5)<=opr1(5)xor(opr1(4)andopr1(3)andopr1
(2)andopr1
(1)andopr1(0));
result(6)<=opr1(6)xor(opr1(5)andopr1(4)andopr1(3)andopr1
(2)andopr1
(1)andopr1(0));
result(7)<=opr1(7)xor(opr1(6)andopr1(5)andopr1(4)andopr1(3)andopr1
(2)andopr1
(1)andopr1(0));
flag<=opr1(7)andopr1(6)andopr1(5)andopr1(4)andopr1(3)andopr1
(2)andopr1(0);
when"0010"=>--"-"
a(0)<=opr1(0)and(notopr2(0));b(0)<=opr1(0)xor(notopr2(0));
a
(1)<=opr1
(1)and(notopr2
(1));b
(1)<=opr1
(1)xor(notopr2
(1));
a
(2)<=opr1
(2)and(notopr2
(2));b
(2)<=opr1
(2)xor(notopr2
(2));
a(3)<=opr1(3)and(notopr2(3));b(3)<=opr1(3)xor(notopr2(3));
a(4)<=opr1(4)and(notopr2(4));b(4)<=opr1(4)xor(notopr2(4));
a(5)<=opr1(5)and(notopr2(5));b(5)<=opr1(5)xor(notopr2(5));
a(6)<=opr1(6)and(notopr2(6));b(6)<=opr1(6)xor(notopr2(6));
a(7)<=opr1(7)and(notopr2(7));b(7)<=opr1(7)xor(notopr2(7));
result(0)<=b(0)xor(notcin);
c(0)<=a(0)or(b(0)and(notcin));
result
(1)<=b
(1)xorc(0);
c
(1)<=a
(1)or(b
(1)anda(0))or(b
(1)andb(0)and(notcin));
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)and(notcin));
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)and(notcin));
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);
c(7)<=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));
flag<=notc(7);
when"0011"=>--"-1"
result(0)<=notopr1(0);
result
(1)<=opr1
(1)xor(notopr1(0));
result
(2)<=opr1
(2)xor(not(opr1
(1)oropr1(0)));
result(3)<=opr1(3)xor(not(opr1
(2)oropr1
(1)oropr1(0)));
result(4)<=opr1(4)xor(not(opr1(3)oropr1
(2)oropr1
(1)oropr1(0)));
result(5)<=opr1(5)xor(not(opr1(4)oropr1(3)oropr1
(2)oropr1
(1)oropr1(0)));
result(6)<=opr1(6)xor(not(opr1(5)oropr1(4)oropr1(3)oropr1
(2)oropr1
(1)oropr1(0)));
result(7)<=opr1(7)xor(not(opr1(6)oropr1(5)oropr1(4)oropr1(3)oropr1
(2)oropr1
(1)oropr1(0)));
flag<=not(opr1(7)oropr1(6)oropr1(5)oropr1(4)oropr1(3)oropr1
(2)oropr1
(1)oropr1(0));
when"0100"=>--"*"操作数为4位,结果为8位,无符号数乘法
c<=opr1(3downto0)*opr2(3downto0);
result<=c;
when"0101"=>--传送数据
result<=opr1(7downto0);
when"0110"=>--"and"
result(0)<=opr1(0)andopr2(0);
result
(1)<=opr1
(1)andopr2
(1);
result
(2)<=opr1
(2)andopr2
(2);
result(3)<=opr1(3)andopr2(3);
result(4)<=opr1(4)andopr2(4);
result(5)<=opr1(5)andopr2(5);
result(6)<=opr1(6)andopr2(6);
result(7)<=opr1(7)andopr2(7);
when"0111"=>--"or"
result(0)<=opr1(0)oropr2(0);
result
(1)<=opr1
(1)oropr2
(1);
result
(2)<=opr1
(2)oropr2
(2);
result(3)<=opr1(3)oropr2(3);
result(4)<=opr1(4)oropr2(4);
result(5)<=opr1(5)oropr2(5);
result(6)<=opr1(6)oropr2(6);
result(7)<=opr1(7)oropr2(7);
when"1000"=>--"not"
result(0)<=notopr1(0);
result
(1)<=notopr1
(1);
result
(2)<=notopr1
(2);
result(3)<=notopr1(3);
result(4)<=notopr1(4);
result(5)<=notopr1(5);
result(6)<=notopr1(6);
result(7)<=notopr1(7);
when"1001"=>--"xor"
result(0)<=opr1(0)xoropr2(0);
result
(1)<=opr1
(1)xoropr2
(1);
result
(2)<=opr1
(2)xoropr2
(2);
result(3)<=opr1(3)xoropr2(3);
result(4)<=opr1(4)xoropr2(4);
result(5)<=opr1(5)xoropr2(5);
result(6)<=opr1(6)xoropr2(6);
result(7)<=opr1(7)xoropr2(7);
when"1010"=>--"SAL"
caseopr2is
when"00000000"=>result<=opr1;
when"00000001"=>result(0)<=opr1(0);
result(7downto1)<=opr1(6downto0);
when"00000010"=>result(0)<=opr1(0);
result
(1)<=opr1(0);
result(7downto2)<=opr1(5downto0);
when"00000011"=>result(0)<=opr1(0);
result
(1)<=opr1(0);
result
(2)<=opr1(0);
result(7downto3)<=opr1(4downto0);
when"00000100"=>result(0)<=opr1(0);
result
(1)<=opr1(0);
result
(2)<=opr1(0);
result(3)<=opr1(0);
result(7downto4)<=opr1(3downto0);
when"00000101"=>result(0)<=opr1(0);
result
(1)<=opr1(0);
result
(2)<=opr1(0);
result(3)<=opr1(0);
result(4)<=opr1(0);
result(7downto5)<=opr1(2downto0);
when"00000110"=>result(0)<=opr1(0);
result
(1)<=opr1(0);
result
(2)<=opr1(0);
result(3)<=opr1(0);
result(4)<=opr1(0);
resul
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机组成专题实验资料7 运算器设计案例 计算机 组成 专题 实验 资料 运算器 设计 案例