近跟着老师学习Verilog,做了中科大的练习题,将答案记录一下
Q62-99
题在哪儿
Q100 寄存器堆模块
题目描述
在RV32I中,寄存器堆指32个通用寄存器的集合,具有专门的读写端口,可并发访问不同寄存器。
我们用5位数代表寄存器的端口号,需要注意的是:当待写入寄存器端口号为0时,往x0写入的数据总是被丢弃,因为x0寄存器恒为0,不能对x0寄存器的值进行修改。设置x0寄存器,既可以提供常量0(比如RISC-V用sub rd, x0, rs来实现neg取负数指令),也可以提供一个可以丢弃结果的场所(比如RISC-V使用addi x0, x0, 0实现nop空指令)。
当A1有意义时,其对应指令中的rs1,即第15到19位;同理,当有意义时,A2对应指令中的rs2,即第20到24位;A3对应指令中的rd,即第7到11位。
输入格式
1.时钟信号clk 2.位宽为5的待读取寄存器端口号A1 3.位宽为5的待读取寄存器端口号A2 4.位宽为5的待写入寄存器端口号A3 5.位宽为32的待写入数据WD 6.位宽为1的寄存器写使能信号WE
输出格式
1.位宽为32的从A1对应的寄存器中读出的数据RD1 2.位宽为32的从A2对应的寄存器中读出的数据RD2
代码
module top_module(
input clk,
input [4:0] A1,A2,A3,
input [31:0] WD,
input WE,
output [31:0] RD1,RD2
);
reg [31:0] reg_file[0:31];
//初始化寄存器堆
integer i;
initial
begin
for(i=0;i<32;i=i+1) reg_file[i] = 0;
end
//写入寄存器
always@(posedge clk)
begin
/*待填*/
if(WE&A3!=0) //A3==0的情况排除?X0一直为0
reg_file[A3]= WD;
else ;
end
//读取寄存器
assign RD1 = reg_file[A1]/*待填*/;
assign RD2 = reg_file[A2]/*待填*/;
endmodule
Q101 程序计数器模块
题目描述
当执行一条指令时,首先需要根据PC中存放的指令地址,将指令由内存取到指令寄存器中,此过程称为取指。
PC全称ProgramCounter(程序计数器),它是计算机处理器中的寄存器,包含当前正在执行的指令的地址。

一般情况下,当指令被获取,程序计数器存储的地址加四(一条指令有32位,为4字节)。当遇到跳转指令(jal,jalr)或者满足分支跳转指令(所有B类指令)的跳转条件时,则将程序计数器的内容设置为转移指令规定的地址。
输入格式
1.时钟信号clk 2.复位键rst,当rst为1时将PC置零 3.位宽为1的跳转信号JUMP,当JUMP为1时将PC设为JUMP_PC 4.位宽为32的待跳转的地址JUMP_PC
输出格式
位宽为32的当前周期需要执行指令的地址pc
代码
module top_module(
input clk,
input rst,
input JUMP,
input [31:0] JUMP_PC,
output reg [31:0] pc);
wire [31:0] pc_plus4;
assign pc_plus4 = pc + 32'h4

文章概述了在Verilog中实现RV32I架构下的寄存器堆、程序计数器、数据处理和存储模块的详细步骤,展示了如何通过指令操作和逻辑判断进行硬件设计。
最低0.47元/天 解锁文章
2729





