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