1、main:addi $2,$0,85 sw $2,0($3)addi $2,$0,50 sw $2,4($3)addi $2,$0,48 sw $2,8($3)addi $2,$0,49 sw $2,12($3)addi $2,$0,53 #sw $2,16($3)addi $2,$0,49 #sw $2,20($3)addi $2,$0,51 #sw $2,24($3)addi $2,$0,52 #sw $2,28($3)addi $2,$0,54 #sw $2,32($3)sw $2,36($3)j main将其导入QtSpim中,选中机器码,加上前缀并将最后一行0x08100009修改为
2、0x08000000,代码如下MEMORY_INITIALIZATION_RADIX=16;MEMORY_INITIALIZATION_VECTOR=20020055,ac620000,20020032,ac620004,20020030,ac620008,20020031,ac62000c,20020035,ac620010,ac620014,20020033,ac620018,20020034,ac62001c,20020036,ac620020,ac620024,08000000,保存为.coe文件,在ROM模块里调用。2)数据存储器RAM设计新建IP core Generator,命名
3、为dram。数据存储器为RAM类型的存储器,并且需要独立的读写信号控制。因此其对外的接口为clk、we、datain、addr;输出信号为dataout。当时钟上升沿到来时,如果写信号(we)为真,根据addr所表示的地址找到对应的存储单元,并将输入的数据(datain)写到对应的存储单元中;如果写信号为假,则根据addr所表示的地址,将对应存储单元的数据送到输出端(dataout)。在本实验中调用ISE提供的IP核进行设计,设定的数据存储器大小为64字。数据存储器模块在顶层模块中被调用。输入的时钟信号来自于顶层模块的clkin,addr信号来自于ALU单元的输出端(对基地址与偏移量执行加操作
4、),datain来自于寄存器组的第二个数据输出端(Rtdata),而控制信号we则来自于控制器对指令的译码。输出数据dataout通过一个选择器(MUX3)决定是否写入到相应的寄存器。初始化dram值:0x55555555,在以后的仿真过程中可以用于验证是否正确调用3)立即数符号扩展模块设计对于I型指令,将指令的低十六位作为立即数符号扩展模块的输入inst15:0,如果十六位立即数的最高位(即符号位)为1,则在inst15:15前面补16个1,如果为0,则在前面补16个0。然后将符号扩展之后的data31:0通过一个选择器(即MUX2)输送到ALU单元的第二个源操作数输入端(即input2)。
5、代码如下:module signext( input 15:0 inst, output 31:0 data );assign data=inst15:15?16hffff,inst:h0000,inst;endmodule4)寄存器组模块该模块的输入为clk、RegWriteData、RegWriteAddr、RegWriteEn、RsAddr、RtAddr和reset,输出信号为RsData和RtData。由于$0一直输出0,因此当RsAddr、RtAddr为0时,RsData以及RtData必须输出0,否则输出相应地址寄存器数据。另外,当RegWriteEn信号有效时,数据应该写入Reg
6、WriteAddr寄存器,并且每次复位时所有寄存器都清零。寄存器组模块在顶层模块中被调用。clk信号来自于顶层模块的clkin,reset信号来自于顶层模块的reset,RegWriteData来自于ALU单元的运算结果输出端或者是数据存储器的输出端(通过一个选择器MUX3进行选择),RegWriteAddr、RsAddr、RtAddr来自于指令的对应位,RegWriteEn来自于控制器对指令的译码。输出信号Rsdata与Rtdata则分别来自于Rsaddr与Rtaddr对应的寄存器。module regFile( input clk, input reset, input 31:0 regW
7、riteData, input 4:0 regWriteAddr, input regWriteEn,0 RsData,0 RtData,0 RsAddr,0 RtAddrreg31:0 regs0:31;assign RsData = (RsAddr = 5b0)?32b0:regsRsAddr;assign RtData = (RtAddr = 5regsRtAddr;integer i;always (posedge clk)begin if(!reset) begin if(regWriteEn=1) begin regsregWriteAddr=regWriteData; end e
8、nd else for(i=0;i31;i=i+1) regsi=0; regs31=32hffffffff; end5)控制器模块控制器输入为指令的opCode字段,即操作码。操作码经过主控制单元的译码,给ALUCtrl、Data Memory、Registers、Muxs等部件输出正确的控制信号。该模块在顶层模块中被调用,输入的opcode来自于指令的前6位,而输出信号aluSrc、MemToReg、RegWrite、MemRead、MemWrite、branch、aluop和jmp则是对6位opcode的译码。module ctr( input 5:0 opCode, output re
9、gDst, 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; reg1:0 aluop; reg jmp;always (opCode)case(opCode) 6b000010:/jmp begin regDst=
10、0; aluSrc=0; memToReg=0; regWrite=0; memRead=0; memWrite=0; branch=0; aluop=2b00; jmp=1; b000000:/R regDst=1; regWrite=1;b10; jmp=0;b100011:/lw aluSrc=1; memToReg=1; memRead=1;b101011:/sw memWrite=1;b000100:/beq branch=1;b01; /6b001100:/andib001000: /aluop=2b11; default: endcaseend6)运算器(ALU)模块微处理器支持的add、sub、and、or和slt运算指令,需要利用ALU单元实现运算,同时数据存储指令sw和lw也需要通过ALU单元计算存储器地址,条件跳转指令beq需要ALU来比较两个寄存器是否相等。所有这些指令包含的操作为加、减、与、或和小于设置5钟不同的操作。该模块根据输入控制信号对输入数据进行相应的操作,并获得
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1