实验报告
目录

  1. 整体概述 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              	#跳转出函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

更多推荐