基于verilog的精简指令的多周期cpu处理器设计
·
实验报告
目录
- 整体概述 1
2.模块定义 1
2.1 alu 1
2.3 Ctrl 2
2.4 ext 3
2.8.6 MemtoRegMux 7
2.8.7 dmMux 7
2.11 IR 9
3.测试程序原理及结果 10
3.1测试源代码 10
3.2测试原理 12
3.3测试结果(若看不清放大word比例即可) 12
4.问答 15
1.整体概述
该多周期处理器采用verilog开发,支持以下多条指令:{addu,subu,ori,lw,sw,beq,lui,addi,addiu,slt,j,jal,jr,lb,lh,lbu,lhu,sb,sh,slti},处理器为多周期设计。
目录结构如图所示:

其中mips.v为顶层结构,tb_mips.v为测试文件,code.txt为IM中要读入的内容。
2.模块定义
2.1 alu
(1)基本描述
alu是该多周期处理器的运算逻辑单元,主要功能是完成需要处理的运算,并将运算结果传输给需要的部件。
测试程序test.asm:
.data
.text
main:
lui $t0 0 #赋值0
lui $t1 0 #赋值0
ori $t1,$t1,10 #给$t1寄存器赋值10
lui $t4,0 #给$t4赋值0
lui $t5,0 #赋值0
ori $t5,$t5,4 #给$t5赋值4,作为DM地址递增量
lui $t6,0 #赋值0,作为累加结果
labelFor: #for循环的跳转点
jal sum #跳转到累加函数
beq $t1,$t0,labelJump #如果$t1内容减到0了就跳出for循环
j labelFor #用来建立循环,在上一步没跳出就继续
labelJump: #用来跳出循环的标记点
subu $t4,$t4,$t5 #将$t4指向最后写入的内容
lw $t1,0($t4) #加载最后写入的内容到$t1
lui $t6,0 #赋值0
lbu $t2,0($t4) #加载第一个字节,用于验证lbu
lhu $t3,0($t4) #加载后半个字,用于验证lhu
addu $t4,$t4,$t5 #将指向DM的指针移到下一块空内存单元
sh $t3,2($t4) #$t3的后半个字存入指向dm单元的的前半个字,用于验证sh
addu $t4,$t4,$t5 #将指向DM的指针移到下一块空内存单元
sb $t2,1($t4) #$t2的最后一个字节存入指向dm单元的第二个字节,用于验证sb
addu $t4,$t4,$t5 #将指向DM的指针移到下一块空内存单元
ori $t0,$t0,55 #给$t0赋值55
beq $t1,$t0,labelTest #如果运算结果等于55就跳转
addi $t6,$t6,1 #加1用来判断是否成功跳转,从而判断结果是否正确
labelTest: #跳转点
addi $t6,$t6,1 #$t6值+1
sw $t6,0($t4) #如果最后写入的值是1证明累加1到10运算结果正确,否则不正确
addu $t4,$t4,$t5 #将指向DM的指针移到下一块空内存单元
lui $t6,0
ori $t6,255
lui $t2,0
ori $t2,200
slt $t3,$t6,$t2 # ($t3)=(($t6)<($t2))? 1 : 0;
sw $t3,0($t4) #若为0 则指令正确执行
addu $t4,$t4,$t5 #将指向DM的指针移到下一块空内存单元
lui $t6,0
lui $t2,0
addi $t6,$t6,-10
slti $t3,$t6,-2 # ($t3)=(($t6)<(-2))? 1 : 0;
sw $t3,0($t4) #若为1 则指令正确执行
addi $t4,$t4,4 #将指向DM的指针移到下一块空内存单元
sw $t6,0($t4) #存入$t6
lb $t2,3($t4) #将当前内存单元第三个字节存入$t2,用于验证lb
lh $t3,2($t4) #将当前内存单元前半个字存入$t3,用于验证lh
addi $t4,$t4,4 #将指向DM的指针移到下一块空内存单元
LabelWhile: #开始死循环
addi $t6,$t6,-1
j LabelWhile
syscall
sum:
addu $t6,$t6,$t1 #第i次循环把10-i+1累加
sw $t6,0($t4) #将每次的临时结果存入到DM
addu $t4,$t4,$t5 #将指向DM的指针移到下一块空内存单元
addiu $t1,$t1,-1 #$t1减一
jr $ra #跳转出函数










更多推荐

所有评论(0)