Skip to content

P5

实验内容

实验一 :存储器读写实验

整体方案设计

输入输出引脚
  • Addr:读写地址
  • CLK:时钟脉冲
  • WE:写使能标志
  • CLR:清零标志
  • SEL:选片标志
  • Din:写入数据
  • Dout:读取数据

电路图

  • image-20231213145012507
  • 使用多路选择器对MemOp进行解析,通过标志位控制选中RAM以及读写使能

仿真测试

  • 使用MemOp=000对四个字节同时进行读写
  • image-20231213150250671
  • 测试WE和SEL
  • 当WE不为1时无法写入,当SEL不为1时无法对指定的ram将进行操作
  • 字节读取及符号扩展测试
  • image-20231213150438717

错误现象及分析

  • 在完成实验的过程中,没有遇到任何错误。

实验二 :ASCII 码显示实验

整体方案设计

输入输出引脚
  • Code:要显示的字符的ascii码
  • sel:是否选片(是否进行显示)

电路图

  • image-20231213150456826
  • 使用Code提取数据中的某一行,从16个rom中读取一行中的16个字节进行显示

仿真测试

  • A
  • image-20231213151121206
  • @
  • image-20231213151146583

错误现象及分析

  • 在完成实验的过程中,没有遇到任何错误。

实验三 :取指令部件 IFU 实验

整体方案设计

输入输出引脚
  • init Addr:初始pc
  • Imm、BusA、NxtASrc、NxtBSrc用于计算下一个PC的值
  • RESET重置PC到init标志
  • Halt:是否暂停PC的更新
  • PC:当前的PC值
  • IR:PC对应的指令

电路图

  • image-20231213151207410
  • 使用一个寄存器缓存PC,根据输入的NxtASrc等标志计算下一个周期PC的值,每个时钟周期更新一次

仿真测试

  • 初始化PC到0064
  • image-20231213151753343
  • 一个时钟周期后PC顺序移动
  • image-20231213151837732
  • 使用IMM立即数控制移动
  • image-20231213151918698

错误现象及分析

  • 在完成实验的过程中,没有遇到任何错误。

实验四-1 :立即数扩展器实验

整体方案设计

输入输出引脚
  • Instr:等待解析的立即数
  • Extop:解析方式
  • imm:立即数的解析结果

电路图

  • image-20231213152048645
  • 使用分线器提取并合并立即数,并使用多路选择器选择解析方式

仿真测试

  • Extop=000
  • image-20231213152153957
  • Extop=001
  • image-20231213152213303
  • Extop=010
  • image-20231213152239690

错误现象及分析

  • 在完成实验的过程中,没有遇到任何错误。

实验四-2 :跳转控制器实验

整体方案设计

输入输出引脚
  • Branch:跳转控制类型
  • Zero、Result0:运算器给出的标志位
  • NxtASrc、NxtASrc:标志位解析结果,用于计算下一个时钟周期的PC

电路图

  • image-20231213152257850
  • 根据Branch选择模式,根据Zero及Result0给出标志位结果

仿真测试

  • 输出为常数的模式:Branch=000、010
  • image-20231213152531591
  • image-20231213152516496
  • 根据Zero及Result0计算结果,令Branch=101
  • image-20231213152633322

错误现象及分析

  • 在完成实验的过程中,没有遇到任何错误。

实验四-3 :IDU实验

整体方案设计

输入输出引脚
  • IR:指令内容
  • EXtop:指令类型
  • RegWr:寄存器写使能
  • BusW:向寄存器写入的数据
  • DataA、DataB:从源寄存器中取出的源数据
  • BusA、BusB:用于ALU进行进一步运算的数据

  • CLK:时钟脉冲

  • ALUASrc、ALUBSrc:运算类型标志

电路图

  • image-20231213152706573
  • 首先对指令进行拆分解析,并根据输入的Extop对立即数进行解析,之后根据寄存器编号从寄存器堆中取数据,得到BusA、BusB
  • 再根据输入的ALUASrc、ALUBSrc进一步计算,为ALU准备进行运算的数据

仿真测试

  • 向x2写入1,x3写入2,之后分别进行读取
  • image-20231213153815678
  • 选择其它Data计算模式
  • image-20231213153851947

错误现象及分析

  • 在完成实验的过程中,没有遇到任何错误。

实验四-4 :数据通路实验

整体方案设计

输入输出引脚
  • Init Addr:初始PC值
  • EXtop:指令类型
  • RegWr:寄存器写使能
  • MemWr:内存写使能
  • MemToReg:内存写入寄存器
  • Memop:内存操作标志
  • Halt:展厅程序的执行

  • CLK:时钟脉冲

  • ALUASrc、ALUBSrc:运算类型标志
  • Branch:跳转控制模式
  • ALUSrc:运算器运算模式

电路图

  • 根据原理图进行绘制
  • image-20231213153949736

  • image-20231213153914102

仿真测试

  • 逐步执行指令并记录数据
序号 汇编指令 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”。

  • image-20231213165416591

  • 使用多路选择器控制要显示的字符

  • 使用一个寄存器存储当前显示第几个,每个时钟周期自动自加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就会停止变化,即不再继续执行
  • image-20231213154809127
  • 在IFU中,当Halt被置为1后会锁定PC寄存器,即程序不再继续执行