基于Verilog的32位单周期CPU处理器的完善设计

文章详细描述了Project1和Project2中的数据通路结构,包括GPR、ALU、EXT、DM等模块的定义。重点介绍了在P2中新增的CP0模块,该模块负责处理硬件中断,通过桥接模块接收中断信号,管理中断请求并更新相关寄存器。同时,文章提到了状态转移图、机器指令描述和测试程序,用于验证设计的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录
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寄存器(显示独有设计标识)。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shejizuopin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值