ALU的设计与实现.doc
《ALU的设计与实现.doc》由会员分享,可在线阅读,更多相关《ALU的设计与实现.doc(5页珍藏版)》请在冰点文库上搜索。
计算机组成原理实验
实验四ALU的设计与实现
专业班级:
计算机科学与技术
学号:
0936008姓名:
冯帆
学号:
0936036姓名:
张琪
实验地点:
理工楼901
实验四ALU的设计与实现
一、实验目的
1、理解ALU的功能和其在处理器中的地位。
2、掌握ALU的结构化(分模块、分层次)的设计方法。
3、掌握ALU的Verilog语言描述方法。
二、实验内容
1、学习ALU的设计方法。
2、用Verilog语言采用行为描述的方法完成74181的逻辑设计。
3、用Verilog语言采用结构描述的方法完成74181的逻辑设计。
4、学习用宏模块的方法定制并调用ALU。
三、实验仪器及设备:
PC机+QuartusⅡ9.0+DE2-70
四、实验步骤:
1.打开Quartus软件,新建工程,并新建一个verilog文件。
2.编写verilog程序。
首先,查找74181的功能表,用always模块和case语句实现其功能。
然后,设计ALU的过程中,利用p函数和g函数实现超前进位功能。
3.附程序代码如下:
moduleALU_74181
(
input[3:
0]a,
input[3:
0]b,
input[3:
0]s,//选择信号
inputm,//m=1执行逻辑运算,反之执行算术运算
inputcn,//低位的进位或者是高位的借位
output[3:
0]f,
outputaeqb,//输出,当a=b时输出1,当a!
=b时,输出0
outputc4,//对应74181的Cn+4
outputp,//p函数
outputg//g函数
);
reg[3:
0]result;//定义中间变量result存放结果
wire[4:
0]temp;//定义中间变量temp存放选择变量s和m
wirep0,p1,p2,p3;//进位产生信号
wireg0,g1,g2,g3;//进位传递信号
assigntemp={s,m};
always@(temporaorb)
begin
case(temp)//case语句实现74181的32种功能
5'b00000:
result=a;
5'b00001:
result=!
a;
5'b00010:
result=a|b;
5'b00011:
result=(!
a|b);
5'b00100:
result=(a|!
b);
5'b00101:
result=!
a&b;
5'b00110:
result=4'b1111;//补码运算,-1的补码是1111
5'b00111:
result=0;
5'b01000:
result=a+(a&!
b);
5'b01001:
result=!
(a&b);
5'b01010:
result=!
b;
5'b01011:
result=(a|!
b)+(a&!
b);
5'b01100:
result=a^b;
5'b01101:
result=a-b+4'b1111;
5'b01110:
result=a&(!
(b+4'b1111));
5'b01111:
result=a&!
b;
5'b10000:
result=a+a&b;
5'b10001:
result=(!
a)|b;
5'b10010:
result=a+b;
5'b10011:
result=!
(a^b);
5'b10100:
result=(a|!
b)+a&b;
5'b10101:
result=b;
5'b10110:
result=a&b+4'b1111;
5'b10111:
result=a&b;
5'b11000:
result=a+a;
5'b11001:
result=1;
5'b11010:
result=(a|b)+a;
5'b11011:
result=(a|!
b);
5'b11100:
result=(a|!
b)+a;
5'b11101:
result=(a|b);
5'b11110:
result=a+4'b1111;
5'b11111:
result=a;
default:
result=4'b0000; //默认情况,给result赋值为0
endcase
end
assignf=result;//将中间变量result的值赋给f
//片与片之间的超前进位
assigng0=a[0]&b[0];//g函数是a与b的与
assigng1=a[1]&b[1];
assigng2=a[2]&b[0];
assigng3=a[3]&b[0];
assignp0=a[0]^b[0];//p函数是a和b的异或
assignp1=a[1]^b[1];
assignp2=a[2]^b[2];
assignp3=a[3]^b[3];
assignc4=g3|(g2&p3)|(g1&p2&p3)|(g0&p0&p1&p2)|(cn&p0&p1&p2&p3);
//g3+p3g2+p3p2g1+p3p2p1g0+p3p2p1p0cn
assignp=p0&p1&p2&p3;
assigng=g3+g2&p3+g1&p2&p3+g0&p1&p2&p3;
assignaeqb=(a==b)?
1'b1:
1'b0;
endmodule
4.编译并仿真得出结果。
仿真结果如下图:
五、实验思考。
1.ALU的功能是什么,它在整机系统中的地位如何?
答:
ALU是多功能算数逻辑运算单元,不仅能进行多种算术运算和逻辑运算,如与、或、非、异或循环、移位、求补、清零、加、减、乘、除等,而且具有先行进位逻辑,从而能实现高速运算。
ALU是CPU的核心部分,也是CPU的重要组成部分。
一台计算机最主要的功能就是指向运算的功能,而ALU恰恰具有这样的功能,可以说多功能运算时据算计的灵魂,没有运算,计算机将不会具有如此强大的功能。
2.ALU是典型的组合逻辑,为什么在P157的实现中要加入时钟信号,其目的是什么?
答:
处于整机同步的需要,这样可以保证ALU产生的结果能够适时的送到总线,以便数据进行正确的读写。
3.74181ALU内部加法运算用的是超前进位算法吗?
答:
是。
74181的设计在内部的实现是通过超前进位,而后又利用了p函数和g函数实现了片与片之间的超前进位功能。
4位之间采用先行进位公式,每一位的进位公式可递推如下:
G=AandBP=AxorB
c1 =g0+p0c0
c2 =g1+p1c1
=g1+p1(g0+p0c0)
=g1+p1g0+p1p0c0
c3 =g2+p2c2
=g2+p2(g1+p1g0+p1p0c0)
=g2+p2g1+p2p1g0+p2p1p0c0
c4 =g3+p3c3=g3+p3(g2+p2g1+p2p1g0+p2p1p0c0)
=g3+p3g2+p3p2g1+p3p2p1g0+p3p2p1p0c0
其中G称为进位发生输出,P称为进位传送输出。
这样,对一片ALU来说,可有三个进位输出。
C4是本片(组)的最后进位输出。
逻辑表达式表明,这是一个先行进位逻辑,可以实现高速运算。