华科 - HUST - 微机原理 - 类MIPS单周期微处理器设计 - 实验报告(2)

2019-02-16 12:32

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));


华科 - HUST - 微机原理 - 类MIPS单周期微处理器设计 - 实验报告(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:酶促反应动力学实验

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: