近跟着老师学习Verilog,做了中科大的练习题,将答案记录一下
Q106 控制器
题目描述
控制器模块负责产生各种控制信号。
与寄存器堆模块相关的:
1.rf_wr_en:1位使能信号,连接到寄存器堆的写使能端口(WE)。
查RISC-V手册可得,需要写寄存器的指令有U型指令,J型指令,I型指令,R型指令。
2.rf_wr_sel:2位选择信号,控制寄存器堆写数据的选择。其与指令的关系如下:
与pc模块相关的:
do_jump:一位控制信号,当指令为jalr或者jal时为1。当指令为jal或者jalr或者B型指令且满足分支条件时,pc模块的JUMP信号为1。
与分支跳转模块相关的:
BrType:三位,指明分支指令类型。由于之前我们为了提高代码容错率,没有直接使用B型指令的功能码作为控制信号,而是设置BrType为0时不进行操作,所以信号与指令对应如下:
与ALU模块相关:
1.alu_a_sel:ALU模块SrcA端口的选择信号;
2.alu_b_sel:ALU模块SrcB端口的选择信号;
通过查RISC-V中文手册可得:
指令为R型或I型或S型时,ALU模块输入SrcA端口连接寄存器输出端口RD1,即ALU模块其中一个操作数为寄存器rs1中的值;
指令为R型时,ALU模块输入SrcB端口连接寄存器输出端口RD2,即ALU模块另一个操作数为寄存器rs2中的值;
(ps:并不是说指令里有rs2就代表alu_b_sel为0,如B型指令里有rs2,但比较过程是在branch模块进行的,不是经过ALU模块)
3.alu_ctrl:四位,控制ALU模块运算类型的信号,具体如下:
(ps:load型指令即lb,lh,lw,lbu,lhu)
与存储器模块相关:
1.dm_rd_ctrl:三位,指明数据存储器读方式。具体如下:
2.dm_wr_ctrl:两位,指明数据存储器写方式。具体如下:
输入格式
32位的指令inst
输出格式
1.位宽为1bit的rf_wr_en:寄存器堆的写使能信号 2.位宽为2bit的rf_wr_sel:输入寄存器堆的数据的选择信号 3.位宽为1bit的do_jump:无条件跳转信号 4.位宽为3bit的BrType:分支指令类型的控制信号 5.位宽为1bit的alu_a_sel:ALU模块SrcA端口的选择信号 6.位宽为1bit的alu_b_sel:ALU模块SrcB端口的选择信号 7.位宽为4bit的alu_ctrl:ALU模块运算类型的控制信号 8.位宽为3bit的dm_rd_ctrl:存储器读类型的控制信号 9.位宽为2bit的dm_wr_ctrl:存储器写类型的控制信号
代码
module top_module(
input [31:0] inst,
output rf_wr_en,
output reg [1:0] rf_wr_sel,
output do_jump,
output reg [2:0] BrType,
output alu_a_sel,
output alu_b_sel,
output reg [3:0]

博主跟随老师学习Verilog,记录中科大练习题答案。介绍了Q106控制器,包括其产生的各种控制信号及与各模块的关系,还给出输入输出格式和代码;同时阐述Q107 RISC-V单周期CPU,说明在顶层模块调用子模块实现单周期CPU,也给出输入输出格式和代码。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



