# MIPS **Repository Path**: observerw/mips ## Basic Information - **Project Name**: MIPS - **Description**: No description available - **Primary Language**: Verilog - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-12-14 - **Last Updated**: 2021-07-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 文件结构 * 源代码都在src里面 * 分为control, dataPath,testbench和headers几个部分 * 所有操作信号都在headers/global.vh里面,用的时候看这个就成了 * testbench还没有写 * 参考资料在material里面 * example里面放的是其他人的代码,用于参考 # 指令 ## 格式 ![image-20210530220837520](pics.asset/image-20210530220837520.png) ## 计算 * J型:`newPC = (PC+4)[31:28], addr, 00 ` # 扩展 ## `sllv` ```verilog sllv $d, $t, $s ``` ``` $d = $t << $s ``` R型指令,利用寄存器值左移。 ### 数据通路 1. 读取指令; 2. 将`ct_alu`设置为左移运算的操作码(`ct_alu_src`默认为0),使得两个寄存器值进行左移运算; 3. 将`ct_rf_wen`设置为1,`ct_rf_dst`设置为1(`ct_data_rf`默认为0),将ALU运算结果写入指定寄存器中。 ## `lui` ```verilog lui $1, 100 ``` ``` $1 = imm & (1 << 16) ``` I型指令,用于数据传送,将16位立即数加载至32位寄存器的高16位,同时将低16位置空。 ### 数据通路 1. 读取指令; 2. 将`ct_alu_src`信号置为1,将扩展为32位的立即数送入ALU中; 3. 将`ct_alu`设置为LUI操作的操作码,使得立即数的低16位转移到高16位中; 4. 将`ct_rf_wen`置为1(ct_rf_dst默认为0),将变换完后的立即数写入相应位置的寄存器中。 ## `nor` R型指令,对两个寄存器的值进行或非。 ``` $1 = ~($2 | $3) ``` ``` $rd = ~($rs | $rt) ``` ### 数据通路 1. 读取指令; 2. 将`ct_alu`设置为或非运算的操作码(`ct_alu_src`默认为0),使得两个寄存器值进行或非运算; 3. 将`ct_rf_wen`设置为1,`ct_rf_dst`设置为1(`ct_data_rf`默认为0),将ALU运算结果写入指定寄存器中。 ## `xori` I型指令,将寄存器的值与立即数进行异或。 ``` $1 = $2 ^ imm ``` ``` $rt = $rs ^ (zero-extend)imm ``` ### 数据通路 1. 读取指令; 2. 将`ct_alu_src`信号置为1,将扩展为32位的立即数送入ALU中; 3. 将`ct_alu`设置为LUI操作的操作码,使得立即数的低16位转移到高16位中; 4. 将`ct_rf_wen`置为1(ct_rf_dst默认为0),将变换完后的立即数写入相应位置的寄存器中。