系统硬件综合设计

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机与信息学院

系统硬件综合设计》

课程设计报告

学生姓名:李

学号:1234567890

专业班级:计算机

2017 年07 月01 日

1.pcf 部分

always @(posedge Clk)

begin

PCPlus4F_Reg = PCPlus4F;

if (BranchM&ZeroM) PCF = PCBranchM;

else PCF = PCPlus4F;

InstructionF_Reg = InstructionF;

if (InstructionF[31:26] == 6'b000010)

begin

PCF = {6'h0,InstructionF[25:0]};

PCF = PCF << 2;

end

End

assign PCPlus4F = PCF + 4;

assign ImemRdAddrF = PCF;

每个时钟上升沿到来,根据上一个时钟的PCSrcM判断是否为分支指令,若是,则选择

PCBranchM作为这个时钟的指令地址,否则选PCF+4作为这个指令的指令地址,另外对于J 类指令,我设计了一个特定的OpCode=“= 000010”,即为跳转指令,因为每个指令以字节格式存储,占用,4 个字节,故将后26 位立即数进行位扩展后将其左移两位,效果等同于乘4,再将其赋值给PCF,这样下一跳的指令地址即为所要跳转的地址。对于这个部分,我起先是准备将其设计成一个模块的,之后由于模块接口连接时出现了无法解决的错误:输出PCF要作为Instruction Memory 的输入,又要作为自身模块下一跳的输入,导致三者关联一起变化,程序报错,后来我又想到将PCF的输出改成两个,PCFout 及PCFnext,PCFout 作为Instruction Memory的输入,PCFnext 作为自身模块下一跳的输入,但是程序仍无法正常运行,最后我想到了在top 模块中对PCF进行处理并得以实

现。

2. Instruction Memory 模块

initial begin

$readmemh("instruction", InstMem, 8'h0);

end

always @(ImemRdAddr) begin

Instruction <= InstMem[ImemRdAddr>>2];

end

这个模块很简单,主要是通过instructin 文档来存储指令,以PCF作为地址取出指令输出至Control ,SignExtend ,Register 三个模块。

3.Ctr 模块

always @(OpCode) begin case(OpCode) // R-I // addiu 6'b001001:

begin

RegDstD = 1;

ALUSrcD = 1;

MemtoRegD = 0;

RegWriteD = 1;

MemWriteD = 0;

BranchD = 0;

ALUOp = 2'b10; end //addi

endcase

end

always @(ALUOp or Funct)

begin

casex({OpC

ode ,ALUOp

, Funct})

14'b10001100xxxxxx: ALUControlD = 5'b00010; // LW : add

14'b00010001xxxxxx: ALUControlD = 5'b00110; // SW : substract beq

endcase end

endmodule

Control 模块主要对来自Instruction Memory模块的指令进行分解,得到

OpCode(指令高六位) ,Funct(指令低六位) ,在通过分析OpCode得到RegDstD,ALUSrcD ,MemtoRegD,RegWriteD ,BranchD ,ALUOp这六个信号量,用于后面的运算,再使用OpCode, ALUOp, Funct 三者的组合对指令的运算方法进行分析,得到相应的ALUControlD 输出至ALU模块。

4.Register模块

initial

begin

$readmemh("register", regFile, 32'h0);

end

// write on falling clock edge

always @(posedge Clk)

begin

if(RegWrite == 1'b1)

regFile[RegWrAddr] <= RegWrData;

end

assign RegARdData = (RegARdAddr >= 0)? regFile[RegARdAddr]:0;

assign RegBRdData = (RegBRdAddr >= 0)? regFile[RegBRdAddr]:0;

通过信号量RegWrite 来判断读写操作,RegWrite=1 即为写操作,0 为读操作,读写皆操作于建立的register 文档中,另在top 模块中有

assign RegARdAddr = InstructionD[25:21];

assign RegBRdAddr = InstructionD[20:16]; 对寄存器地址赋值,register 读出的两个数可供ALU选择使用。

5.ALU 模块

assign Zero = (ALURes == 0)? 1:0;//ALURes 0 跳转

always @(SrcA or SrcB or ALUCtr)

begin

OverFlow = 0;

TmpForSrcB = 0;

HI = 0;

LO = 0;

A = 0;

B = 0;

case(ALUCtr)

5'b10011:

begin

TmpForSrcB = SrcB;

TmpForSrcB[31] = (TmpForSrcB[31]+1)%2;

ALURes = SrcA + TmpForSrcB;

if ((SrcA[31] != TmpForSrcB[31]) || (SrcA[31] == TmpForSrcB[31] && ALURes[31] == SrcA[31]))

begin

OverFlow = 1'b0; end

else

相关文档
最新文档