计算机组成原理实验三【计算机组成原理实验报告材料1-单周期】
时间:2020-06-30 07:45:57 来源:勤学考试网 本文已影响 人
计算机组成原理实验报告
单周期处理器开发
Q:1064950364
2015.05.12
文档目录:
功能设计说明
模块化和层次化设计说明
具体模块定义
测试代码及结果
实验完成时间安排
心得体会
功能设计说明
1. 完成的指令集:
a) add,sub,and,or,slt,lw,sw,beq 和J 指令。
b) 不支持溢出。
2. 处理器为单周期设计。
3. 功能模块统一采用书上201页的图4-24设计,信号控制采用书上的193页图4-12和200页图4-22的真值表进行化简。
模块化和层次化设计说明
具体模块定义
数据通路:
1)PC模块定义:
(1) 基本描述
PC 主要功能是完成输出当前指令地址。复位后,PC指向0x0000_0000,此处为第一条指令的地址。
(2) 模块接口
信号名
方向
描述
[31:0]address
I
输入的指令地址
clk
I
时钟信号
rst
I
复位信号
[31:0]out
O
输出的指令地址
(3)功能定义
序号
功能名称
功能描述
1
复位
rst=1时,将out置为0X0000_0000
2
输出指令地址
时钟信号到来时,将address赋给out
2)NPC模块定义:
(1) 基本描述
NPC 主要功能是根据当前指令是否为beq指令,输出下一条指令的地址。该模块调用了MUX模块。
(2) 模块接口
信号名
方向
描述
[15:0]imaddr
I
指令的低16位
zero
I
ALU计算结果:
1表示当前两寄存器(rs,rt)值相等;
0表示不相等。
br
I
是否为beq指令。1是0否
[31:0]pc
I
输入当前指令地址
[31:0]npc
O
输出下一条指令地址
(3)功能定义
序号
功能名称
功能描述
1
输出指令地址
根据zero与br的值输出下一条指令的地址。
3)ALU模块定义:
(1) 基本描述
实现加、减、与、或、小于则赋1五种计算。
(2) 模块接口
信号名
方向
描述
[2:0]aluctrl
I
ALU控制信号
[31:0]A
I
rs寄存器的值
[31:0]B
I
rt寄存器的值
zero
O
B=0,则zero=1;
否则zero=0.
[31:0]result
O
Alu计算输出的结果。
(3)功能定义
序号
功能名称
功能描述
1
输出计算结果
根据alu控制信号,输出A与B的计算结果
2
输出zero
若result=0
则输出zero=1,否则输出zero=0。
4)MUX模块定义:
(1) 基本描述
实现32位和5位二选一数据选择器
(2) 模块接口
信号名
方向
描述
S
I
MUX控制信号
[31:0]d0/
[4:0]d0
I
MUX输入
[31:0]d1/
[4:0]d1
I
MUX输入
[31:0]y/
[4:0]y
O
MUX输出
(3)功能定义
序号
功能名称
功能描述
1
输出d0,或d1的值
S为0,y=d0;
S为1,y=d1.
5)EXT模块定义:
(1) 基本描述
将输入的16位地址按符号位扩展为32位。
(2) 模块接口
信号名
方向
描述
[15:0]addrin
I
输入的16位地址
[31:0]addrout
O
输出的32位地址
(3)功能定义
序号
功能名称
功能描述
1
输出扩展的32位地址.
将addrin扩展为32位的addrout.
6)regfile模块定义:
(1) 基本描述
根据输入的两个寄存器地址,输出相应寄存器的值,根据寄存器写信号和寄存器地址,将输入的数据选择写入寄存器。
(2) 模块接口
信号名
方向
描述
clk
I
时钟信号
[4:0]rreg1
I
Rs寄存器地址
[4:0]rreg2
I
Rt寄存器地址
[31:0]rdata1
O
Rs寄存器值
[31:0]rdata2
O
Rt寄存器值
regw
I
写寄存器信号
[4:0]wreg
I
Rt写寄存器地址
[31:0]wdata
I
写入寄存器的信号
(3)功能定义
序号
功能名称
功能描述
1
读寄存器数据
读rs、rt寄存器的数据
2
向寄存器写入数据
根据写信号向寄存器选择写入数据
7)im_4k模块定义:
(1) 基本描述
指令存大小为4K,初始化从code.txt载入指令。根据输入的指令地址,输出当前位置存储的指令。
(2) 模块接口
信号名
方向
描述
[9:0]addr
I
指令地址
[31:0]dout
O
指令
(3)功能定义
序号
功能名称
功能描述
1
载入指令
初始化载入code.txt中的指令
2
输出指令
根据输入的指令地址,输出当前指令
8)dm_4k模块定义:
(1) 基本描述
“数据存”大小为4K,根据输入的地址读出“数据存”中的数据,并根据数据写信号,将输入的数据选择写入“数据存”中。
(2) 模块接口
信号名
方向
描述
clk
I
时钟信号
[9:0]addr
I
数据地址
[31:0]din
I
写入的数据
we
I
数据存写信号
[31:0]dout
O
读出的数据
(3)功能定义
序号
功能名称
功能描述
1
读数据存数据
根据输入的数据地址,读出数据存的数据,读出的数据不一定被使用,只有lw指令才会使用。
2
向数据存写入数据
在时钟信号到来时,根据写数据信号,将输入的数据选择写入数据存中。
9)Jump模块定义:
(1) 基本描述
将输入的低26位指令左移两位,高四位加上pc+4的高4位,组成32位地址输出。
(2) 模块接口
信号名
方向
描述
[25:0]addrin
I
低26位指令
[31:0]pc
I
当前PC
[31:0]addrout
O
计算出的32位地址
(3)功能定义
序号
功能名称
功能描述
1
输出J跳转地址
输出计算得到的32位地址,为J指令要跳转的地址。
10) ALUCtrl模块定义:
(1) 基本描述
根据指令的低6位(function字段)和输入的aluop控制信号,利用真值表化简输出三位的ALU控制信号。真值表利用书上193页图4-12.
(2) 模块接口
信号名
方向
描述
[5:0]func
I
指令低6位
[1:0]aluop
I
Aluop控制信号
[2:0]aluctrl
O
Alu控制信号
(3)功能定义
序号
功能名称
功能描述
1
输出ALU控制信号
利用真值表化简输出ALU控制信号。
11) controller模块定义:
(1) 基本描述
根据输入的指令高6位(Op字段),利用真值表化简,输出RegDst,ALUSrc,MemtoReg,RegWrite,MemWrite,
Branch,J,ALUOp控制信号。真值表采用书上200页图4-22,再加上J指令的输入输出。其中高阻状态设为0。MemRead信号可以省略。
(2) 模块接口
信号名
方向
描述
[5:0]Op
I
指令高6位
RegDst
O
Rd寄存器控制信号
ALUSrc
O
ALU数据来源控制信号
MemtoReg
O
数据存数据写入寄存器控制信号
RegWrite
O
寄存器写控制信号
MemWrite
O
数据存写控制信号
Branch
O
Beq指令控制信号
J
O
J指令控制信号
[1:0]ALUOp
O
ALUOp控制信号
(3)功能定义
序号
功能名称
功能描述
1
输出各种控制信号
根据输入的OP,利用真值表化简,输出各种控制信号。
测试代码及结果
测试代码及结果:
在regfile模块初始化了17($s1),18($s2),20($s4)号寄存器的值分别为8、4、12.
add $s3,$s2,$s1 //$s3=4+8=12
sub $s5,$s4,$s3 //$s5=12-12=0
beq $s3,$s4,LI //$s3==$s4,跳到LI
sw $s2,1($s1)
lw $s3,1($s1)
LI:and $s5,$s4,$s3 //$s5=$s4 & $s3=12
or $s5,$s3,$s1 //$s5=$s4 | $s3=12
slt $s5,$s3,$s1 //$s3>$s1,$s5=0
sw $s2,1($s1) //存入4
lw $s3,1($s1) //载入4到$s3
j LI //跳转
生成的16进制文件(code.txt): // add $s3,$s2,$s1
0293a822 // sub $s5,$s4,$s3 // beq $s3,$s4,LI
ae320001 // sw $s2,1($s1)
8e330001 //lw $s3,1($s1)
0293a824 // LI:and $s5,$s4,$s3
0271a825 // or $s5,$s3,$s1
0271a82a // slt $s5,$s3,$s1
ae320001 // sw $s2,1($s1)
8e330001 // lw $s3,1($s1) //j LI
实验完成时间安排
实验前2小时看了Verilog语法,并用ModelSim跑了PPT给的counter程序。
实验课上跟着老师写了各个模块,至此各个模块已经基本写完。
中午用了不到1小时写了控制信号及顶层模块,只剩下测试工作。
中午用了大概半小时时间测试程序可以运行,完成调试。
总体完成时间在10小时以。
6、心得体会
通过该实验,对硬件编程有了更深入的理解。之前参加学校的PLD比赛赛前培训(后来时间太紧,比赛放弃),使用过Vivado跑了一段测试程序,当时对仿真一块还不太懂,此次实验更加深了理解。对单周期处理器的认识也更深刻了。开发初期,受c语言开发的限制,老是想不通这些模块的调用参数是如何传递的。后来想到Verilog有wire型变量,其实就可以将其想象成一条条真实的线,各个模块就是各个真实的器件,这些器件用线连接起来才可以工作。于是,便突破了思想局限,顺利完成了实验。使用开发工具多了,渐渐就会发现这些工具都小异,所以上手也会很快。