《计算机体系结构》实验一报告1 下载本文

内容发布更新时间 : 2024/7/8 18:26:14星期一 下面是文章的全部内容请认真阅读。

《计算机体系结构》实验报告

实验一、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的值,代码正确性得到了验证。