casex({ALUOp,funct})
8'b00xxxxxx:ALUCtr=4'b0010; 8'b01xxxxxx:ALUCtr=4'b0110; 8'b11xxxxxx:ALUCtr=4'b0000; 8'b10xx0000:ALUCtr=4'b0010; 8'b10xx0010:ALUCtr=4'b0110; 8'b10xx0100:ALUCtr=4'b0000; 8'b10xx0101:ALUCtr=4'b0001; 8'b10xx1010:ALUCtr=4'b0111; endcase endmodule 6. 控制器设计
控制器输入为指令的opCode字段,即操作码。操作码经过主控制单元的译码,给ALUCtrl、Data Memory、Registers、Muxs等部件输出正确的控制信号。
指令 R型:add,sub,and,or,slt I型:lw I型:sw I型:beq J型:J I型:addi opcode 000000 100011 101011 000100 000010 001000 该模块在顶层模块中被调用,输入的opcode来自于指令的前6位,而输出信号aluSrc、MemToReg、RegWrite、MemRead、MemWrite、branch、aluop和jmp则是对6位opcode的译码。译码结果在此不做说明。
代码如下: module ctr(
input [5:0] opCode, output regDst, output aluSrc, output memToReg, output regWrite, output memRead, output memWrite, output branch,
output [1:0] aluop, output jmp );
reg regDst; reg aluSrc; reg memToReg; reg regWrite; reg memRead; reg memWrite;
reg branch; reg[1:0] aluop; reg jmp; always @(opCode) begin
case(opCode)
6'b000010://jmp begin regDst=0; aluSrc=0; memToReg=0; regWrite=0; memRead=0; memWrite=0; branch=0; aluop=2'b00; jmp=1; end
6'b000000://R begin regDst=1; aluSrc=0; memToReg=0; regWrite=1; memRead=0; memWrite=0; branch=0; aluop=2'b10; jmp=0; end
6'b100011://lw begin regDst=0; aluSrc=1; memToReg=1; regWrite=1; memRead=1; memWrite=0; branch=0; aluop=2'b00; jmp=0; end
6'b101011://sw begin regDst=0; aluSrc=1; memToReg=0; regWrite=0; memRead=0; memWrite=1; branch=0; aluop=2'b00; jmp=0; end
6'b000100://beq begin regDst=0; aluSrc=0; memToReg=0; regWrite=0; memRead=0; memWrite=0; branch=1; aluop=2'b01; jmp=0; end
6'b001100://andi begin regDst=0; aluSrc=1; memToReg=0; regWrite=1; memRead=0; memWrite=0; branch=0; aluop=2'b11; jmp=0; end
default: begin regDst=0; aluSrc=0;
memToReg=0; regWrite=0; memRead=0; memWrite=0; branch=0; aluop=2'b00; jmp=0; end endcase end
endmodule
7. 立即数符号扩展模块设计
对于I型指令,将指令的低十六位作为立即数符号扩展模块的输入inst[15:0],如果十六位立即数的最高位(即符号位)为1,则在inst[15:15]前面补16个1,如果为0,则在前面补16个0。然后将符号扩展之后的data[31:0]通过一个选择器(即MUX2)输送到ALU单元的第二个源操作数输入端(即input2)。
代码如下:
module signext(
input [15:0] inst, output [31:0] data );
assign data=inst[15:15]?{16'hffff,inst}:{16'h0000,inst}; endmodule 8. 顶层设计
顶层模块需要将前面的多个模块实例化后,通过导线以及多路复用器将各个部件连接起来,并且在时钟的控制下修改PC的值,PC是一个32位的寄存器,每个时钟沿自动增加4。
多路复用器MUX直接通过三目运算符实现,例如 assign OUT = SEL ? INPUT1 : INPUT2;
其中,OUT、SEL、INPUT1和INPUT2都是预先定义的信号。 代码如下: module top(
input clkin, input reset );
reg[31:0] pc,add4; wire choose4;
wire[31:0] expand2,mux2,mux3,mux4,mux5,address,jmpaddr,inst; wire[4:0] mux1;
//wire for controller
wire reg_dst,jmp,branch,memread,memwrite,memtoreg; wire[1:0] aluop;
wire alu_src,regwrite; //wire for aluunit
wire zero;
wire[31:0] aluRes; //wire for aluctr wire[3:0] aluCtr; //wire for memory
wire[31:0] memreaddata; //wire for register
wire[31:0] RsData,RtData; //wireforext
wire[31:0] expand;
always @(negedge clkin) begin
if(!reset) begin pc=mux5; add4=pc+4; end else begin pc=32'b0; add4=32'h4; end end
ctr mainctr(
.opCode(inst[31:26]), .regDst(reg_dst), .aluSrc(alu_scr), .memToReg(memtoreg), .regWrite(regwrite), .memRead(memread), .memWrite(memwrite), .branch(branch), .aluop(aluop), .jmp(jmp));
ALU alu(.input1(RsData), .input2(mux2), .aluCtr(aluCtr), .zero(zero),
.aluRes(aluRes));
aluctr aluctr1(.ALUOp(aluop), .funct(inst[5:0]), .ALUCtr(aluCtr));
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库华科 - HUST - 微机原理 - 类MIPS单周期微处理器设计 - 实验报告(2)在线全文阅读。
相关推荐: