# MIPS_CPU **Repository Path**: wangqiyuejava63/MIPS_CPU ## Basic Information - **Project Name**: MIPS_CPU - **Description**: 支持MIPS指令集(子集)的CPU,用vivado工程实现。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-04-11 - **Last Updated**: 2025-04-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 单周期CPU,支持MIPS指令集 ### 环境 Vivado 2019 ### 设计方案 单周期CPU,任何时候读,下降沿写 不采用多周期方案,太复杂了。 ### 效果 #### 减法 sub ![alt text](sub.png) #### 加法add,减法sub,与运算and ![alt text](add_sub_and.png) #### 或运算or, 小于置零slt ![alt text](or_slt.png) ##### slt指令改正 之前对 slt 的理解错误了 应该是小于置1,用法见下图 ![](slt指令格式.png) ALU.v 正确代码 ``` module ALU( input wire [31:0] srcA, // 32位输入A input wire [31:0] srcB, // 32位输入B input wire [2:0] ALUControl, // 3位控制信号 output reg [31:0] ALUResult, // 32位结果 output wire Zero // 结果是否为0 ); // 根据控制信号执行不同的操作 always @(*) begin case (ALUControl) 3'b010: ALUResult = srcA + srcB; // 加法 3'b110: ALUResult = srcA - srcB; // 减法 3'b000: ALUResult = srcA & srcB; // 与运算 3'b001: ALUResult = srcA | srcB; // 或运算 3'b111: ALUResult = (srcA < srcB) ? 32'b1 : 32'b0; // slt运算 default: ALUResult = 32'b0; // 默认为0 endcase end // 设置Zero信号 assign Zero = ALUResult == 32'b0 ? 1 : 0; endmodule ``` 而之前是没有这一行的 ``` 3'b111: ALUResult = (srcA < srcB) ? 32'b1 : 32'b0; // slt运算 ``` 遇到slt指令,会直接走default分支,获得 ALUResult = 0 #### beq指令 ![alt text](beq.png) ##### beq指令改正: 正确代码 ``` assign PCBranch = (SignImmOut<<2) + PCPlus4;//注意! + 的优先级高于 << ``` 错误代码 之前beq指令的代码是 ``` assign PCBranch = SignImmOut<<2 + PCPlus4; ``` 没有考虑到优先级问题,使得加法在移位之前操作了 但是由于当时 PCPlus4的值是0x20,也就是32 而SignImmOut的值是-8,也就是 0xfffffff8, 左移34位以后,还是0 而预期的正确结果 PCBranch = (SignImmOut<<2) + PCPlus4 = (0xfffffff8 << 2) + 0x20 = -32 + 32 = 0 两者值是相同的,所以误打误撞,导致我误以为beq已经可以正确执行了,在这里我要记录一下。 #### sw lw sw存储字指令,lw加载字指令 ![alt text](sw_lw.png) #### jump 无条件跳转指令 ![alt text](jump.png) ### 已完成的指令 | 指令 | 是否完成 | | -----| ------| | add | √ | | sub | √| | and | √| |or|√| |slt|√| | addi |√ | | j | √| |beq | √| |bge| | |bgt| | |blt| | |ble| | | sw| √| |lw|√|