P5
实验内容¶
实验一 :存储器读写实验¶
整体方案设计¶
输入输出引脚¶
- Addr:读写地址
- CLK:时钟脉冲
- WE:写使能标志
- CLR:清零标志
- SEL:选片标志
- Din:写入数据
- Dout:读取数据
电路图¶
- 使用多路选择器对MemOp进行解析,通过标志位控制选中RAM以及读写使能
仿真测试¶
- 使用MemOp=000对四个字节同时进行读写
- 测试WE和SEL
- 当WE不为1时无法写入,当SEL不为1时无法对指定的ram将进行操作
- 字节读取及符号扩展测试
错误现象及分析¶
- 在完成实验的过程中,没有遇到任何错误。
实验二 :ASCII 码显示实验¶
整体方案设计¶
输入输出引脚¶
- Code:要显示的字符的ascii码
- sel:是否选片(是否进行显示)
电路图¶
- 使用Code提取数据中的某一行,从16个rom中读取一行中的16个字节进行显示
仿真测试¶
- A
- @
错误现象及分析¶
- 在完成实验的过程中,没有遇到任何错误。
实验三 :取指令部件 IFU 实验¶
整体方案设计¶
输入输出引脚¶
- init Addr:初始pc
- Imm、BusA、NxtASrc、NxtBSrc用于计算下一个PC的值
- RESET重置PC到init标志
- Halt:是否暂停PC的更新
- PC:当前的PC值
- IR:PC对应的指令
电路图¶
- 使用一个寄存器缓存PC,根据输入的NxtASrc等标志计算下一个周期PC的值,每个时钟周期更新一次
仿真测试¶
- 初始化PC到0064
- 一个时钟周期后PC顺序移动
- 使用IMM立即数控制移动
错误现象及分析¶
- 在完成实验的过程中,没有遇到任何错误。
实验四-1 :立即数扩展器实验¶
整体方案设计¶
输入输出引脚¶
- Instr:等待解析的立即数
- Extop:解析方式
- imm:立即数的解析结果
电路图¶
- 使用分线器提取并合并立即数,并使用多路选择器选择解析方式
仿真测试¶
- Extop=000
- Extop=001
- Extop=010
错误现象及分析¶
- 在完成实验的过程中,没有遇到任何错误。
实验四-2 :跳转控制器实验¶
整体方案设计¶
输入输出引脚¶
- Branch:跳转控制类型
- Zero、Result0:运算器给出的标志位
- NxtASrc、NxtASrc:标志位解析结果,用于计算下一个时钟周期的PC
电路图¶
- 根据Branch选择模式,根据Zero及Result0给出标志位结果
仿真测试¶
- 输出为常数的模式:Branch=000、010
- 根据Zero及Result0计算结果,令Branch=101
错误现象及分析¶
- 在完成实验的过程中,没有遇到任何错误。
实验四-3 :IDU实验¶
整体方案设计¶
输入输出引脚¶
- IR:指令内容
- EXtop:指令类型
- RegWr:寄存器写使能
- BusW:向寄存器写入的数据
- DataA、DataB:从源寄存器中取出的源数据
-
BusA、BusB:用于ALU进行进一步运算的数据
-
CLK:时钟脉冲
- ALUASrc、ALUBSrc:运算类型标志
电路图¶
- 首先对指令进行拆分解析,并根据输入的Extop对立即数进行解析,之后根据寄存器编号从寄存器堆中取数据,得到BusA、BusB
- 再根据输入的ALUASrc、ALUBSrc进一步计算,为ALU准备进行运算的数据
仿真测试¶
- 向x2写入1,x3写入2,之后分别进行读取
- 选择其它Data计算模式
错误现象及分析¶
- 在完成实验的过程中,没有遇到任何错误。
实验四-4 :数据通路实验¶
整体方案设计¶
输入输出引脚¶
- Init Addr:初始PC值
- EXtop:指令类型
- RegWr:寄存器写使能
- MemWr:内存写使能
- MemToReg:内存写入寄存器
- Memop:内存操作标志
-
Halt:展厅程序的执行
-
CLK:时钟脉冲
- ALUASrc、ALUBSrc:运算类型标志
- Branch:跳转控制模式
- ALUSrc:运算器运算模式
电路图¶
- 根据原理图进行绘制
仿真测试¶
- 逐步执行指令并记录数据
序号 | 汇编指令 | PC | BusW | 立即数 | 寄存器堆 | 数据寄存器 |
---|---|---|---|---|---|---|
1 | lui x5,-1 | 00000000 | fffff000 | fffff000 | x5:fffff000 | |
2 | addi x5,x5,100 | 00000004 | fffff064 | 00000064 | x5:fffff064 | |
3 | sw x5,0(x0) | 00000008 | 00000000 | 00000000 | 0:fffff064 | |
4 | srai x6,x5,3 | 0000000c | fffffe0c | 00000403 | X6:fffffe0c | |
5 | sw x6,4(x0) | 00000010 | 00000004 | 000000004 | 1:fffffe0c | |
6 | lh x7,4(x0) | 00000014 | fffffe0c | 00000004 | X7:fffffe0c | |
7 | xori x8,x7,-1 | 00000018 | 000001f3 | ffffffff | X8:000001f3 | |
8 | sw x8,8(x0) | 0000001c | 00000008 | 00000008 | 2:000001f3 | |
9 | slt x9,x8,x7 | 00000020 | 00000000 | 00000007 | X9:00000000 | |
10 | sw x9,x12(x0) | 00000024 | 00000000c | 0000000c | 3:00000000 | |
11 | bne x9,x0,label2 | 00000028 | 00000000 | ffffffd8 | ||
12 | jarl x10,x0,48 | 0000002c | 00000030 | 00000030 | X10:00000030 | |
13 | sw x10,16(x0) | 00000030 | 00000010 | 00000010 | 4:00000030 | |
14 | auipc x11,100 | 00000034 | 00064034 | 00064000 | X11:00064034 |
错误现象及分析¶
- 在完成实验的过程中,没有遇到任何错误。
思考题¶
如何拓展 ROM 实验实现跑马灯的功能,在 3 个 LED 点阵中,滚动显示 5 个 ASCII 字符,如“NJUCS”。¶
-
使用多路选择器控制要显示的字符
- 使用一个寄存器存储当前显示第几个,每个时钟周期自动自加1,当等于5时置为0,实现循环显示
表 5.2 给出的第 11 条测试指令中标号 label2 所表示的偏移地址是多少(用真值表示)?¶
- 由上面运行表格得到bne指令的立即数为ffffffd8,转化为真值为-40
在 Risc-V 架构中,举例说明什么是伪指令?伪指令如何实现?¶
-
伪指令是一种特殊的汇编指令,它们并不直接对应于硬件中的机器指令。伪指令是为了方便程序员在编写汇编代码时使用,它们通常比直接使用机器指令更容易理解和记忆。编译器或汇编器会将这些伪指令转换为一条或多条实际的机器指令。
-
伪指令举例
-
assembly addi x1, x2, 0 lui x5,-1 jarl x10,x0,48
-
伪指令的实现:伪指令的实现依赖于汇编器。当汇编器遇到一个伪指令时,它会根据伪指令的定义将其转换为一个或多个实际的机器指令。
在指令执行过程中,如何实现程序结束后,指令不再继续执行?¶
- 只需要将Halt标志位置为1,PC就会停止变化,即不再继续执行
- 在IFU中,当Halt被置为1后会锁定PC寄存器,即程序不再继续执行