ALU设计报告.docx

上传人:b****8 文档编号:29826202 上传时间:2023-07-27 格式:DOCX 页数:22 大小:116.52KB
下载 相关 举报
ALU设计报告.docx_第1页
第1页 / 共22页
ALU设计报告.docx_第2页
第2页 / 共22页
ALU设计报告.docx_第3页
第3页 / 共22页
ALU设计报告.docx_第4页
第4页 / 共22页
ALU设计报告.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

ALU设计报告.docx

《ALU设计报告.docx》由会员分享,可在线阅读,更多相关《ALU设计报告.docx(22页珍藏版)》请在冰豆网上搜索。

ALU设计报告.docx

ALU设计报告

青岛理工大学

实验报告

实验课程:

计算机组成原理I

实验日期:

2013年9月18日,交报告日期:

2013年9月30日,成绩:

实验地点:

现代教育技术中心101(计算机实验室)

计算机工程学院,计算机科学与技术专业,班级:

计算112班

实验指导教师:

盛建伦批阅教师:

同组学生

姓名

任师锋

秦世帅

学号

一、实验课题

设计一个16位ALU的逻辑,决定外部的端口(名称、有效电平)和内部各元件的连接,画出系统框图和逻辑图,设计仿真数据,用VHDL编程和仿真。

实验内容:

(1)、主要元件设计

1.4位并行进位加法器

功能要求:

能完成两个4位二进制数(补码和无符号数)的加法和逻辑加运算。

内部有并行进位链。

可以扩展成多位组。

2.组间并行进位链逻辑

功能要求:

4个4位小组的组间并行进位链逻辑。

将组间并行进位链逻辑与4个4位超前进位加法器连接可以构成16位

进位加法器。

可参考74182的逻辑函数。

3.函数发生器

功能要求:

能把输入的两个16位二进制数进行变换,与后面的16位超前进

加法器配合完成两个16位二进制数(补码和无符号数)的8种算术运算(有

些运算考虑低位来的进位)和8种逻辑运算。

提示:

ALU的功能参考数字逻辑课程的“多功能加法器”实验

(2)、顶层设计

用层次结构设计的方法设计一个16位ALU。

内部包括4个4位并行进位加

法器、组间并行进位链、16位函数发生器等。

功能要求:

能完成两个16位二进制数以及低位来的进位的8种算术运算和8种逻辑运算。

可参考74181

(3)、仿真

设计仿真波形数据,要考虑到所有可能的情况。

在实验报告中必须清楚写明

仿真波形数据是怎样设计的。

二、逻辑设计

一位全加器系统框图

端口说明:

P,G:

进位传递函数,进位产生函数。

S:

输出

a,b:

输入

cin:

来自低位的进位

cout:

向高位的进位。

推导的逻辑函数。

S=a⊕b⊕cin;

P=aorb;

G=aandb;

Cout=G+P.cin;

超前进位琏系统框图

 

P(0-3),G(0-3):

接收进位传递函数和进位产生函数的端口。

C(0-3):

产生的进位输出。

Cin:

来自低位的进位。

PN,GN:

分别是组件进位传递函数和组件进位产生函数。

超前进位输出逻辑函数:

Carry0=G0+P0.Cin

Carry1=G1+P1.C0

Carry2=G2+P2.C1

Carry3=G3+P3.C2

GN=G3+P3G2+P3P2G1+P3P2P1G0

PN=P3P2P1P0

四位并行加法器系统框图

 

端口说明:

M:

模式控制信号,M=0逻辑加,M=1算术加。

A,B:

输入。

S:

输出

Cin:

来自低位的进位。

Cout:

向高位的进位。

PN,GN:

分别输出片间的进位传递函数和进位产生函数。

四位并行加法器逻辑图

 

 

片(0-3):

1位全加器。

M:

模式控制信号。

G(0-3),P(0-3):

分别是组件的进位产生函数和进位传递函数。

Cin:

来自低位的进位

Carry(0-3):

超前进位琏产生的进位输出,他们分别与四位并行加法器的Cin(来自低位的进位)相连。

Carry3没有用到。

a(0-3),b(0-3):

输入。

S(0-3):

是四位并行加法器的输出

PN,GN:

组件进位传递函数和组件进位产生函数。

连接到超前进位琏端口的G(0-3),P(0-3),与一位全加器的PN,GN向连。

函数发生器系统框图

-

M:

模式控制信号

Ctrl:

函数发生控制信号。

a,b:

输入

aout,bout:

输出。

Cin:

低位的进位。

Cout:

输出

函数发生器功能表

ms2s1s0

运算

aout

bout

cout

1000

a加b

a

b

0

1001

a加1

a

0

1

1010

a加b加低位进位

a

b

ci

1011

b加1

0

b

1

1100

a加

a

0

1101

a加0

a

0

0

1110

a加a

a

a

0

1111

a加加1

a

1

0000

a+b

a+b

0

0

0001

a.b

a.b

0

0

0010

0

0

0011

0

0

0100

a⊕b

a⊕b

0

0

0101

a+

a+

0

0

0110

0

0

0111

a.

a.

0

0

十六位并行加法器系统框图

端口说明:

M:

模式控制信号,M=0逻辑加,M=1算术加。

Ctrl:

函数控制信号,控制做哪种函数运算。

A,B:

输入。

S:

输出

Cin:

来自低位的进位。

Cout:

向高位的进位。

十六位并行加法器逻辑图

 

端口说明:

片(0-3):

四位并行加法器(由于空间的限制,其中函数发生控制信号,并没有在逻辑如图中标出)。

G(0-3),P(0-3):

分别是组件的进位产生函数和进位传递函数。

Cin:

来自低位的进位

Carry(0-3):

超前进位琏产生的进位输出,他们分别与四位并行加法器的Cin(来自低位的进位,图中没有标明端口名)相连。

Carry3没有用到。

S(0-15):

是16位并行加法器的输出。

M:

模式控制信号。

Ctrl(0-2):

函数发生控制端。

Ⅰ,Ⅱ,Ⅲ,Ⅳ:

分别表示

aout(0-3)bout(0-3),aout(4-7)bout(4-7),aout(8-11)bout(8-11),aout(12-15bout(12-15

二、VHDL源程序

一位全加器:

entityOneAdderis

port(a,b:

instd_logic;--input

cin:

instd_logic;--jinweifromthelowbit

P,G:

outstd_logic;--P进位传递函数,G进位产生函数

s:

outstd_logic);--result

endOneAdder;

architecturebehaveofOneAdderis

begin

s<=axorbxorcin;

P<=aorb;

G<=aandb;

endbehave;

超前进位琏:

--supercarry

libraryieee;

useieee.std_logic_1164.all;

entitySuperCarryis

port(P,G:

instd_logic_vector(3downto0);--输入

cin:

instd_logic;--来自低位的进位

carry:

outstd_logic_vector(3downto0);--进位输出

PN,GN:

outstd_logic);--产生组件的进位传递和进位产生函数

endSuperCarry;

architecturebehaveofSuperCarryis

signalc:

std_logic_vector(3downto0);

begin

c(0)<=G(0)or(P(0)andcin);

carry(0)<=c(0);

c

(1)<=G

(1)or(P

(1)andc(0));

carry

(1)<=c

(1);

c

(2)<=G

(2)or(P

(2)andc

(1));

carry

(2)<=c

(2);

c(3)<=G(3)or(P(3)andc

(2));

carry(3)<=c(3);

GN<=G(3)or(P(3)andG

(2))or(P(3)andP

(2)andG

(1))or(P(3)andP

(2)andP

(1)andG(0));--产生组件进位产生函数

PN<=P(3)andP

(2)andP

(1)andP(0);--产生组件进位传递函数

endbehave;

函数发生器:

--Function

libraryieee;

useieee.std_logic_1164.all;

entityfunctionbornis

port(ctrl:

instd_logic_vector(2downto0);--controlbornoffunction

M:

instd_logic;--model

a,b:

instd_logic_vector(15downto0);--input

cin:

instd_logic;--来自低位的进位

aout,bout:

outstd_logic_vector(15downto0);--output

cout:

outstd_logic);--将来自低位的进位变换后的输出

endfunctionborn;

architecturebehaveoffunctionbornis

signalone:

std_logic:

='1';

signalzero:

std_logic:

='0';

signaliz:

std_logic_vector(15downto0):

="0000000000000000";

begin

process(M,ctrl)

begin

ifM='1'then--算术运算

casectrlis

when"000"=>aout<=a;bout<=b;cout<=zero;--a加b

when"001"=>aout<=a;bout<=iz;cout<=one;--a加1

when"010"=>aout<=a;bout<=b;cout<=cin;--a加b加来自低位的进位

when"011"=>aout<=iz;bout<=b;cout<=one;--b加1

when"100"=>aout<=a;bout<=notb;cout<=zero;--a加notb

when"101"=>aout<=a;bout<=iz;cout<=zero;--a加0

when"110"=>aout<=a;bout<=a;cout<=zero;--a加a

when"111"=>aout<=a;bout<=notb;cout<=one;--a加notb加1

endcase;

else

casectrlis

when"000"=>aout<=aorb;bout<=iz;cout<=zero;--a+b

when"001"=>aout<=aandb;bout<=iz;cout<=zero;--a.b

when"010"=>aout<=nota;bout<=iz;cout<=zero;--nota

when"011"=>aout<=notb;bout<=iz;cout<=zero;--notb;

when"100"=>aout<=axorb;bout<=iz;cout<=zero;--a⊕b

when"101"=>aout<=aor(notb);bout<=iz;cout<=zero;--a+notb

when"110"=>aout<=not(axorb);bout<=iz;cout<=zero;--not(a⊕b)

when"111"=>aout<=aand(notb);bout<=iz;cout<=zero;--a.notb

endcase;

endif;

endprocess;

endbehave;

四位并行加法器:

--fouradder

libraryieee;

useieee.std_logic_1164.all;

entityFourAdderis

port(a,b:

instd_logic_vector(3downto0);--input

cin:

instd_logic;

PN,GN:

outstd_logic;--fortheAdder16组件进位函数,GN-进位产生函数,PN-进位传递函数

s:

outstd_logic_vector(3downto0);--output

cout:

outstd_logic;--向高位的进位

M:

instd_logic);--模式控制m=1逻辑运算,M=0算术运算

endFourAdder;

architecturebehaveofFourAdderis

--declareOneAdder

componentOneAdder

port(a,b:

instd_logic;--input

cin:

instd_logic;--jinweifromthelowbit

P,G:

outstd_logic;--P进位传递函数,G进位产生函数

s:

outstd_logic);--result

endcomponent;

--enddeclareofOneAdder

--declareSuperCarry

componentSuperCarry

port(P,G:

instd_logic_vector(3downto0);

cin:

instd_logic;

carry:

outstd_logic_vector(3downto0);

PN,GN:

outstd_logic);

endcomponent;

--theenddeclareofSuperCarry

signalgt,pt:

std_logic_vector(3downto0);

signalc:

std_logic_vector(3downto0);--存储中间进位的结果

signalxin:

std_logic_vector(3downto0);

begin

xin(0)<=(Mandcin);--M为1的时候是算术运算,不会把来自低位的进位屏蔽。

--M为0的时候是逻辑运算,会把来自低位的进位屏蔽。

下同

TAG1:

OneAdderportmap--OneAdder实例化1

(a=>a(0),b=>b(0),s=>s(0),P=>pt(0),G=>gt(0),cin=>xin(0));

xin

(1)<=(Mandc(0));

TAG2:

OneAdderportmap--OneAdder实例化2

(a=>a

(1),b=>b

(1),s=>s

(1),P=>pt

(1),G=>gt

(1),cin=>xin

(1));

xin

(2)<=(Mandc

(1));

TAG3:

OneAdderportmap--OneAdder实例化3

(a=>a

(2),b=>b

(2),s=>s

(2),P=>pt

(2),G=>gt

(2),cin=>xin

(2));

xin(3)<=(Mandc

(2));

TAG4:

OneAdderportmap--OneAdder实例化4

(a=>a(3),b=>b(3),s=>s(3),P=>pt(3),G=>gt(3),cin=>xin(3));

TAG5:

SuperCarryportmap--SuperCarry实例化1

(P=>pt,G=>gt,carry=>c,cin=>xin(0),PN=>PN,GN=>GN);

cout<=Mandc(3);

endbehave;

十六位并行加法器:

libraryieee;

useieee.std_logic_1164.all;

entityAdder16is

port(a,b:

instd_logic_vector(15downto0);--input

cin:

instd_logic;--jinweifromthelowbit

s:

outstd_logic_vector(15downto0);--theresultoroutput

cout:

outstd_logic;--jinweitothehightbit

M:

instd_logic;--controlmodoul

ctrl:

instd_logic_vector(2downto0));--controlsignal

endAdder16;

architecturestructofAdder16is

componentFourAdder--FourAdder声明

port(a,b:

instd_logic_vector(3downto0);--input

cin:

instd_logic;--来自低位的进位

PN,GN:

outstd_logic;--fortheAdder16组件进位函数,GN-进位产生函数,PN-进位传递函数

s:

outstd_logic_vector(3downto0);--output

cout:

outstd_logic;--向高位的进位

M:

instd_logic);--模式控制m=1算术运算,M=0逻辑运算

endcomponent;

componentSuperCarry--SpuerCarry声明

port(P,G:

instd_logic_vector(3downto0);

cin:

instd_logic;

carry:

outstd_logic_vector(3downto0));

endcomponent;

componentfunctionborn

port(ctrl:

instd_logic_vector(2downto0);--controlbornoffunction

M:

instd_logic;--model

a,b:

instd_logic_vector(15downto0);--input

cin:

instd_logic;--来自低位的进位

aout,bout:

outstd_logic_vector(15downto0);--output

cout:

outstd_logic);--将来自低位的进位变换后的输出

endcomponent;

signalpt,gt:

std_logic_vector(3downto0);--内部信号-用于存储组间传递函数

signalc:

std_logic_vector(3downto0);--carrysignal从低到高分别代表c4,c8,c12,c16

signalx:

std_logic_vector(3downto0);

signalaout,bout:

std_logic_vector(15downto0);--存放函数发生器产生的中间结果

signalscout:

std_logic;--cin经过函数发生器转换的结果

begin

FUNC:

functionbornportmap--函数发生器的例化

(ctrl=>ctrl,M=>M,a=>a,b=>b,cin=>cin,aout=>aout,bout=>bout,cout=>scout);

x(0)<=(Mandscout);--M为1的时候是算术运算,不会把来自低位的进位屏蔽。

--M为0的时候是逻辑运算,会把来自低位的进位屏蔽。

下同

TAG1:

FourAdderportmap--FourAdder实例化1

(a=>aout(3downto0),b=>bout(3downto0),cin=>x(0),PN=>pt(0),s=>s(3downto0),GN=>gt(0),M=>M);

x

(1)<=(Mandc(0));

TAG2:

FourAdderportmap--FourAdder实例化2

(a=>aout(7downto4),b=>bout(7downto4),cin=>x

(1),PN=>pt

(1),s=>s(7downto4),GN=>gt

(1),M=>M);

x

(2)<=(Mandc

(1));

TAG3:

FourAdderportmap--FourAdder实例化3

(a=>aout(11downto8),b=>bout(11downto8),cin=>x

(2),PN=>pt

(2),s=>s(11downto8),GN=>gt

(2),M=>M);

x(3)<=(Mandc

(2));

TAG4:

FourAdderportmap--FourAdder实例化4

(a=>aout(15downto12),b=>bout(15downto12),cin=>x(3),PN=>pt(3),s=>s(15downto12),GN=>gt(3),M=>M);

TAG5:

SuperCarryportmap--SuperCarry实例化2--超级进位连

(P=>pt,G=>gt,cin=>x(0),carry=>c);

cout<=Mandc(3);

endstruct;

三、仿真设计

一位全加器的仿真数据:

将所有的数据组合进行仿真。

a

0

0

0

0

1

1

1

1

b

0

0

1

1

0

0

1

1

cin

0

1

0

1

0

1

0

1

P

0

0

1

1

1

1

0

0

G

0

0

0

0

0

0

1

1

s

0

1

1

0

1

0

0

1

注意:

P,G,s都是理论应当得到的数据。

超前进位琏仿真数据:

分析:

当进位产生函数为1时,一定会向高位进1.

令数据G为0010,P为1000,cin为1预测结果:

0010.

当进位传递函数为1而进位产生函数为0时,只要来自低位的进位为1就向高位产生进位。

令数据G为0000,p为0111,cin为1,预测结果0111.

令数据G为0000,P为0101,cin为1,预测结果0001.原因在于低位的进位不为1,则不会向高位产生进位1

只要G(3)为1,GN就为1,对于PN要所有的P(0-3)为1才为1。

函数发生器仿真:

输出aout,bout,cout要和功能表的输出一致

仿真数据:

(由于数据多,此处仅截取部分)

数据一般取和功能表所属情况相反的例子进行验证。

ms2s1s0

a

b

cin

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

当前位置:首页 > PPT模板 > 其它模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1