内容发布更新时间 : 2025/1/10 6:42:04星期一 下面是文章的全部内容请认真阅读。
《计算机体系结构》实验报告
实验一、32位ALU设计
姓名:陆中琰
一、实验目的
本次实验要求设计32位算术逻辑单元,用硬件语言Verilog编程实现并测试。通过实验,能熟悉计算机硬件设计的基本流程,并温故Verilog语言和Vivado开发环境的使用。
二、实验内容
根据《数字设计和计算机体系结构》5.2.4 算术逻辑单元一节的内容,设计一个具有32位输入和32位输出的算术逻辑单元 (Arithmetic/Logic Unit, ALU)。如图1-1所示,该ALU包含一个N位加法器和N个2输入与门和或门,以及反相器和多路复用器(具体到本实验中,操作数长度N等于32)。该ALU根据控制信号F来选择执行 不同运算,表1-1列出了F的不同取值与相应运算。
学号:15307130321
院系:计算机科学与技术
图1-1 N位ALU原理图表1-1 ALU运算
图表来源:《数字设计与计算机体系结构》第2版, D.M Harris, pp153
三、实验步骤
(1)根据原理图1-1写出实现代码
从图1-1可以清楚看到,该ALU输入为A,B两个32位操作数以及控制信号F,输出为32位的运算结果Y,我们又添加了一个输出信号 zero,用于显示结果是否为零。 如图1-1所示,控制信号F的高位用于判断是否将B取反,用变量Bout表示。当F2= 1时 Bout = ~B,当F2 = 1时 Bout = B,可以用以下的assign语句实现。
1. assign Bout = F[2]? ~B : B;
加法器的输入为S和Bout,并用F2作为进位输入,也用assign语句实现。当F2 = 0时,加法器计算A+B;当F2= 1时,加法器计算A+~B+1,即A-B。
1. assign S = A + Bout + F[2];
最后是一个4路复用器,用always结构加上case语句实现。由于任何一项输入信号的变化都会影响输出,所以always的敏感信号表写为*,同时目标输出Y要声明为reg类型,用非阻塞赋值方式。其余均为wire变量,类型可以缺省。根据表1-1的要求,对于F1:0的不同取值做不同运算,我们只需使用Verilog的运算符,不用考虑底层实现。需要注意的是,当F1:0= 11时,SLT的实现是通过取加法器的输出S(此时恰为A-B)的符号位,如果S是负数,即A
1. always @(*) 2. begin
3. case(F[1:0])
4. 2'b00: Y <= A & Bout; 5.
6. 2'b01: Y <= A | Bout; 7.
8. 2'b10: Y <= S; 9.
10. 2'b11: Y <= S[31]; 11. endcase 12. end
zero信号我是在always语句外用一句简单的assign语句实现,也可以在always内部直接赋值(需要将zero声明为reg类型)。
1. assign zero = (Y == 32'b0);
表1-2 ALU测试向量
(2)编写测试代码进行仿真
首先补全测试向量表1-2。虽然之前的课程中没有做过仿真,但这次的测试代码还是很容易写的。Vivado有专门的simulation目录,在其中新建一个simulation source文件,模块命名为test_ALU_32。创建几个新变量用于测试,被测试模块的输入要声明为reg类型,输出则为wire类型,然后传给ALU_32模块。
1. 2. 3. 4. 5. 6.
reg [31:0] A,B; reg [2:0] F; wire [31:0] Y; wire zero;
ALU_32 u0(A,B,F,Y,zero);
本次实验不涉及时间信号的问题,只需用initial语句每隔一段时间对变量A,B,F进行赋值即可。我使用表1-2中第一个测试向量作为初值,每隔10ns对变量重新赋值。以此类推,共计21个测试案例,需要观察0 – 210 ns的波形来验证代码的正确性。
1. initial 2. begin
3. // ADD testcase 1 4. A = 32'h00000000; 5. B = 32'h00000000; 6. F = 3'd2;
7. // ADD testcase 2
8. #10 A = 32'h00000000; 9. B = 32'hFFFFFFFF; 10. // Other testcases 11. ... 12. end
四、运行结果
A B F Y zero
A B F Y zero A B F Y zero
图1-3 测试结果波形图
图1-3为测试得到的0 – 210 ns波形图,从上至下依次为A、B、F、Y、zero的波形。对比表1-2中result和zero的值,代码正确性得到了验证。