目录
Project1 4
1 总体数据通路结构设计 4
1.1 总体数据通路结构图 4
2 模块定义 7
2.1 GPR模块定义 7
2.2 ALU模块定义 10
2.3 EXT模块定义 12
2.4 DM模块定义 14
2.5 Controller模块定义 16
2.6 PC模块定义 21
2.7 NextPC模块定义 23
2.8 IM模块定义 25
2.9 MUX1模块定义 26
2.10 MUX2模块定义 27
2.11 MUX3模块定义 29
2.12 im_reg模块定义 30
2.13 dm_reg模块定义 31
2.14 A_reg模块定义 32
2.15 B_reg模块定义 33
2.16 ALU_reg模块定义 34
2.16 LB模块定义 35
2.17 SB模块定义 36
3 设计的机器指令描述 37
4 状态转移图 38
5 测试程序 38
6 测试结果 41
6.1 GPR运行结果 41
6.2 DM运行结果 42
6.3 波形图 43
Project2 44
1 总体数据通路结构设计 44
1.1 总体数据通路结构图 44
2 模块定义 45
2.1 cp0模块定义 45
2.2 bridge模块定义 48
2.3 timer模块定义 50
2.4 inputdev模块定义 53
2.5 outputdev模块定义 54
3 设计的机器指令描述 55
4 状态转移图 55
5 测试程序 56
6 测试结果 58
7 总结与收获 58
2 模块定义
由于P2是在P1基础上增加了bridge、cp0以及三个外设,并修改了im以及dm的容量,只需更改一下im以及dm寄存器数组大小以及输入地址位数,以及写入寄存器堆的多路选择器扩展为5路,加上cp0out和din,只需修改MUX2模块引脚。故以下只列出P2相对于P1新增的五个模块。
2.1 cp0模块定义
2.1.1 模块设计
module cp0(pc,din,hwint,sel,cp0wr,exlset,exlclr,clk,reset,intreq,epc,epcwr,dout);
input [31:0] pc; //用于保存pc
input [31:0] din; //cp0寄存器的写入数据:GPR中rt寄存器读出数据
input [5:0] hwint; //6个设备中断,从bridg传递过来
input [4:0] sel; //选择cp0内部寄存器
input epcwr; //epc写使能
input cp0wr; //cp0写使能
input exlset; //置位SR的EXL位
input exlclr; //清除SR的EXL位,执行eret指令产生
input clk,reset;
output intreq; //中断请求信号
output [31:0] dout; //cp0寄存器的输出数据
output reg [31:0] epc; //epc寄存器输出至npc
reg [15:10] hwint_pend; //cause中6位寄存器,锁存hwint
reg [15:10] im; //SR
reg exl,ie; //exl标记中断状态;ie 全局中断使能 1允许中断
always@(posedge clk or posedge reset)
begin
if(reset) begin
exl=0; ie=0; im=0; hwint_pend=0;
end
else begin
if(epcwr)
epc <= pc; //保存中断时的pc
if(cp0wr && (sel==5'd12)) //cp0写使能有效且为sr寄存器,给SR赋初值
{im,exl,ie} <= {din[15:10],din[1],din[0]};
if(exlset) //关中断,防止再次进入
exl<=1'b1;
if(exlclr) begin //开中断
exl<=1'b0;
hwint_pend=0;
end
else hwint_pend<=hwint;
end
end
assign intreq=|(hwint & im) & ie & !exl; //产生中断请求
//写入cpu寄存器的数据
//12:SR 13:CAUSE 14:EPC 15:PrID
assign dout=(sel==5'd12)? {16'b0,im,8'b0,exl,ie}:
(sel==5'd13)? {16'b0,hwint_pend,10'b0}:
(sel==5'd14)? epc:
(sel==5'd15)? 32'h20074221:
32'd0;
endmodule
2.1.2 基本描述
CP0的主要功能是处理外设发出的中断请求,中断信号由bridge模块传入到CP0,经过处理后传入CPU的controller模块。处理中断的过程包含使用MTC0与MFC0指令:完成SR寄存器的预设;完成主程序中断位置的下一条指令对应的地址写入EPC寄存器,保护现场,并在ERET指令时回写到NPC,返回主程序。CP0内部主要用到了四个寄存器:SR寄存器(控制是否响应中断)、CAUSE寄存器(锁存中断原因)、EPC寄存器(存储中断位置下一条指令地址进行保护)、PrID寄存器(显示独有设计标识)。