参考实验书目:《数字设计和计算机体系结构》机械工业出版社,7章
实验平台:vivado
语言:system verilog
一、实验信息
略...咱的专业课实验报告
二、实验内容
(一)设计原理及实验方案
总体设计思路:
将微体系结构分为两个部分:数据路径和控制。数据路径对数据字进行操作。控制单元从数据路径接收当前指令,并控制数据路径如何执行指令。前者包含存储器,寄存器,ALU和复用器等结构,本次实验设计32位的处理器,因此应采用32位数据路径。后者根据指令需求产生各种使能信号来控制寄存器写,存储器写,复用器数据选择等功能。
设计+实验流程:
1.基础部分(只涉及到教材所提及的指令)
主译码器真值表:
ALU译码器真值表:
基础部分处理器原理图:
2.扩展部分(增加andi,ori,bne指令)
主译码器真值表:
指令 |
opcode |
regwrite |
regdst |
alusrc |
branch |
memwrite |
memtoreg |
aluop |
jump |
zeroselect |
immselect |
R类型 |
000000 |
1 |
1 |
0 |
0 |
0 |
0 |
010 |
0 |
x |
x |
lw |
100011 |
1 |
0 |
1 |
0 |
0 |
1 |
000 |
0 |
x |
1 |
sw |
101011 |
0 |
x |
1 |
0 |
1 |
x |
000 |
0 |
x |
1 |
beq |
00100 |
0 |
x |
0 |
1 |
0 |
x |
001 |
0 |
1 |
x |
addi |
001000 |
1 |
0 |
1 |
0 |
0 |
0 |
000 |
0 |
x |
1 |
j |
000010 |
0 |
x |
x |
x |
0 |
x |
xxx |
1 |
x |
x |
bne |
000101 |
0 |
x |
0 |
1 |
0 |
x |
001 |
0 |
0 |
X |
andi |
001100 |
1 |
0 |
1 |
0 |
0 |
0 |
011 |
0 |
x |
0 |
ori |
001101 |
1 |
0 |
1 |
0 |
0 |
0 |
100 |
0 |
x |
0 |
ALU译码器真值表:
aluop |
funct |
alucontrol |
000 |
X |
010(加) |
001 |
X |
110(减) |
010 |
100000 |
010(加) |
010 |
100010 |
110(减) |
010 |
100100 |
000(与) |
010 |
100101 |
001(或) |
010 |
101010 |
111(小于置位) |
011 |
x |
000(与) |
100 |
x |
001(或) |
扩展指令后的原理图:
3.增加I/O接口准备上板部分
将dmem扩展成DataMemoryDecoder,该模块包括数据存储器(dmem)、I/O接口,7段数码管三个子模块,其原理图如下。
(二)实验结果及分析
(1)在基础verilog代码上根据需要扩展代码而发生改动的局部代码。
1)maindec
因为增加了zeroselect,immselect以及aluop从2位扩展成3位,controls更改位12位向量。根据真值表在case语句中,增加了bne,andi,ori对应的controls值,同时对其他指令的controls值做了修改。
2)aludec
因为aluop的变为3位,所以aludec的case语句中各条件值也做了变化,新增011和100令alucontrol赋值为与运算、或运算的信号值。
3)增加零扩展模块
令扩展时,高位直接补零,将16位立即数扩展称32位,用于andi和ori运算。
4)datapath中增加选择扩展后进入alu运算的立即数类型的复用器。
immselect选择immsrc,immsrc参与srcb的选择。
5)controller中增加选择beq或者bne的zerosrc的语句。
在controller中选择条件跳转的信号来源zerosrc,zero表示beq条件;opzero=~zero,表示bne条件。
(2)最终代码整体分析
1)top.sv
增加了IO设备后的top文件端口发生了变化,输入和输出与实验开发板的开关,按钮,7段数码管联系起来。
增加DataMemoryDecoder模块,该模块包含数据存储器,I/O接口,7段数码管3个子模块。
2)mips
包含controller和datapath模块,controller模块包含主译码器,alu译码器模块,datapath包含原理图中的各个功能模块,controller中的译码器代码因为真值表的变化而产生一些变化,aluop变成3位向量,以及增加immselect信号,从controller输出,输入datapath,datapath中增加了零扩展模块和立即数选择模块。
3)imem
指令存储器,根据pc读取memfile.dat中的指令,因为指令文件添加到了项目中,所以读取时采用相对路径。
4)DataMemoryDecoder
包含dmem,IO,mux7seg模块。
dmem模块根据we和rd信号进行存数、取数操作。
IO模块,switchl用于接收从switch端口输入的信号,并在pRead==1时,内存地址正确时将开关输入的数据经过pReadData进入mips处理器;ledl用于在pWrite==1时,内存地址正确时,接收开关输入数据经mips处理的结果writedata。并且在ButtonL==1时,即输出就绪时,将ledl中暂存的结果输出到led端口,output到DataMemoryDecoder,与switch一起组成32位digit输入到7段数码管模块;status用于储存目前状态,当按下ButtonR时status[1]=1,表示准备读入开关数据,当按下ButtonL时status[0]=1,表示准备输出运算结果。
7段数码管模块
利用时钟产生一个3位向量s用于选择数码管。
选择亮起的数码管后,同时用s选择对应该数码管应该显示的值digit2
根据digit2的值选择数码管的A2G值,注意到当digit2值为0000时使用if else语句做出判断,这是因为digit输入mux7seg时,应该显示等号的数码管对应的digit值为0000,所以对digit2=0000时应该显示“0”或者“=”做出了判断。
仿真testbench
2. 仿真结果
1)基础部分
根据教材给出的测试文件和指令集,对具有R类型、lw,sw、beq、addi、j指令的单周期CPU代码进行测试,得到仿真结果如下,说明该CPU各项功能正常。
2)扩展指令后
扩展andi,ori,bne指令后,进行仿真验证3个指令的功能,由仿真结果可知,三个指令的功能正常。
3)增加IO设计后
仿真时钟自定为100MHZ,每隔约1.3ms选择数码管的信号count一次。仿真开始时,设置了10ns的清零操作和输出操作此后输入信号与输出信号一直保持为1,switch信号设置为4’h1234,可通过AN和A2G信号的仿真波形看出,各个数码管依次显示1234=046。仿真成功。
3.实验开发板
2.实现12+34=046
在仿真和最后实验上板的时候都出现了无法读入指令的情况,经过探索与实践,得到的解决办法是在design source和simulation source中都添加memfile.dat文件,前者用于生成.bit文件,后者用于vivado内的仿真。且用于生成bit文件的指令文件需要为.dat格式而非.txt格式。
2.调试代码
根据仿真结果判断仿真是否正确时,可以加入内部变量的波形,如pc,instr等,根据pc地址和指令逐步分析,查漏补缺。
另外判断其他部分代码是否正确可以通过vivado中的open elaborated design查看电路图,比对设计时理想的电路图排除错误。