计算机组成专题实验资料7 运算器设计案例.docx

上传人:b****2 文档编号:3175292 上传时间:2023-05-05 格式:DOCX 页数:23 大小:180.20KB
下载 相关 举报
计算机组成专题实验资料7 运算器设计案例.docx_第1页
第1页 / 共23页
计算机组成专题实验资料7 运算器设计案例.docx_第2页
第2页 / 共23页
计算机组成专题实验资料7 运算器设计案例.docx_第3页
第3页 / 共23页
计算机组成专题实验资料7 运算器设计案例.docx_第4页
第4页 / 共23页
计算机组成专题实验资料7 运算器设计案例.docx_第5页
第5页 / 共23页
计算机组成专题实验资料7 运算器设计案例.docx_第6页
第6页 / 共23页
计算机组成专题实验资料7 运算器设计案例.docx_第7页
第7页 / 共23页
计算机组成专题实验资料7 运算器设计案例.docx_第8页
第8页 / 共23页
计算机组成专题实验资料7 运算器设计案例.docx_第9页
第9页 / 共23页
计算机组成专题实验资料7 运算器设计案例.docx_第10页
第10页 / 共23页
计算机组成专题实验资料7 运算器设计案例.docx_第11页
第11页 / 共23页
计算机组成专题实验资料7 运算器设计案例.docx_第12页
第12页 / 共23页
计算机组成专题实验资料7 运算器设计案例.docx_第13页
第13页 / 共23页
计算机组成专题实验资料7 运算器设计案例.docx_第14页
第14页 / 共23页
计算机组成专题实验资料7 运算器设计案例.docx_第15页
第15页 / 共23页
计算机组成专题实验资料7 运算器设计案例.docx_第16页
第16页 / 共23页
计算机组成专题实验资料7 运算器设计案例.docx_第17页
第17页 / 共23页
计算机组成专题实验资料7 运算器设计案例.docx_第18页
第18页 / 共23页
计算机组成专题实验资料7 运算器设计案例.docx_第19页
第19页 / 共23页
计算机组成专题实验资料7 运算器设计案例.docx_第20页
第20页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

计算机组成专题实验资料7 运算器设计案例.docx

《计算机组成专题实验资料7 运算器设计案例.docx》由会员分享,可在线阅读,更多相关《计算机组成专题实验资料7 运算器设计案例.docx(23页珍藏版)》请在冰点文库上搜索。

计算机组成专题实验资料7 运算器设计案例.docx

计算机组成专题实验资料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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2