ÀàMIPSµ¥ÖÜÆÚ΢´¦ÀíÆ÷Éè¼Æ
ʵÑ鱨¸æ
רҵ£ºµç×ÓÐÅÏ¢¹¤³Ì °à¼¶£º×¿Ô½1201°à ѧºÅ£º U201213500 ÐÕÃû£º ÖÓ Ô¶ ά
Ò»¡¢ ʵÑéÄ¿µÄ
1. 2. 3. 4.
Á˽â΢´¦ÀíÆ÷µÄ»ù±¾½á¹¹
ÕÆÎÕ¹þ·ð½á¹¹µÄ¼ÆËã»ú¹¤×÷ÔÀí ѧ»áÉè¼Æ¼òµ¥µÄ΢´¦ÀíÆ÷
Á˽âÈí¼þ¿ØÖÆÓ²¼þ¹¤×÷µÄ»ù±¾ÔÀí
¶þ¡¢ ʵÑéÈÎÎñ
ÀûÓÃHDLÓïÑÔ£¬»ùÓÚXilinx FPGA nexys4ʵÑéÆ½Ì¨£¬Éè¼ÆÒ»¸öÄܹ»Ö´ÐÐÒÔÏÂMIPSÖ¸ÁµÄµ¥ÖÜÆÚÀàMIPS´¦ÀíÆ÷£¬ÒªÇóÍê³ÉËùÓÐÖ§³ÖÖ¸ÁîµÄ¹¦ÄÜ·ÂÕæ£¬ÑéÖ¤Ö¸ÁîÖ´ÐеÄÕýÈ·ÐÔ£¬ÒªÇó±àд»ã±à³ÌÐò½«±¾ÈËѧºÅµÄASCIIÂë´æÈëRAMµÄÁ¬ÐøÄÚ´æÇøÓò
¡ª¡ªÖ§³Ö»ù±¾µÄÄÚ´æ²Ù×÷Èçlw£¬swÖ¸Áî
¡ª¡ªÖ§³Ö»ù±¾µÄËãÊõÂß¼ÔËËãÈçadd£¬sub£¬and£¬or£¬slt£¬andiÖ¸Áî ¡ª¡ªÖ§³Ö»ù±¾µÄ³ÌÐò¿ØÖÆÈçbeq£¬jÖ¸Áî
Èý¡¢ ΢´¦ÀíÆ÷¸÷Ä£¿éÉè¼Æ
M0UX1M1UX0+PCµÄ¸ß4λ32λ28λ4 add26λ add×óÒÆÁ½Î»M1UX0×óÒÆÁ½Î»Ö¸Áî[25:0]Ö¸Áî[25:21]Ö¸Áî[20:16]1MU0XPCÖ¸Áî[15:11]Ö¸ÁîдÊý¾Ý¼Ä´æÆ÷1Êý¾Ý¶Á¼Ä´æÆ÷1µØÖ·¶Á¼Ä´æÆ÷2µØÖ·¼Ä´æÆ÷2Êý¾Ýд¼Ä´æÆ÷µØÖ·MUX ALUzero¼Ä´æÆ÷×éÊý¾Ý×ÜÏßÊý¾Ý×ÜÏßµØÖ·×ÜÏßÖ¸Áî[15:0]µØÖ·×ÜÏß16λ·ûºÅÀ©Õ¹32λALU¿ØÖÆÒëÂëÊý¾Ý´æ´¢Æ÷Ö¸Áî´æ´¢Æ÷RegDstÖ¸Áî[5:0]RegWriteÖ¸Áî[31:26]¿ØÖÆÆ÷ALUSrcALUOp[1:0]MemToRegMemWriteMemReadBranchJump
¸÷Ä£¿éµÄ¿òͼ½á¹¹ÈçÉÏͼËùʾ¡£ÓÉͼ¿ÉÖª£¬¸Ã´¦ÀíÆ÷°üº¬Ö¸Áî´æ´¢Æ÷¡¢Êý¾Ý´æ´¢Æ÷¡¢¼Ä´æÆ÷×é¡¢ALUµ¥Ôª¡¢·ûºÅÊýÀ©ÕÅ¡¢¿ØÖÆÆ÷¡¢ALU¿ØÖÆÒëÂëÒÔ¼°¶à·¸´ÓÃÆ÷µÈ¡£Í¼Öл¹ºöÂÔÁËÒ»¸öµ¥Ôª£ºÊ±ÖÓÐźŲúÉúÆ÷£¬¶øÇÒÒÔÉϸ÷¸ö²¿¼þ±ØÐëÔÚʱÖÓÐźŵĿØÖÆÏÂе÷¹¤×÷¡£
1. Ö¸Áî´æ´¢Æ÷µÄÉè¼Æ
Ö¸Áî¼Ä´æÆ÷ΪROMÀàÐ͵Ĵ洢Æ÷£¬Îªµ¥Ò»Êä³öÖ¸ÁîµÄ´æ´¢Æ÷¡£Òò´ËÆä¶ÔÍâµÄ½Ó¿ÚΪclk¡¢´æ´¢Æ÷µØÖ·ÊäÈëÐźţ¨Ö¸ÁîÖ¸Õ룩ÒÔ¼°Êý¾ÝÊä³öÐźţ¨Ö¸Á¡£
£¨1£©ÔÚIP wizard ÖÐÅäÖÃROM£¬·ÖÅä128¸ö×ֵĴ洢¿Õ¼ä£¬×Ö³¤Îª32λ¿í¡£
£¨2£©Ñ¡ÔñÊäÈë¾ßÓеØÖ·¼Ä´æ¹¦ÄÜ£¬Ö»Óе±Ê±ÖÓÉÏÉýÑØÓÐЧʱ£¬²Å½øÐÐÊý¾ÝµÄÊä³ö¡£
£¨3£©ÅäÖÃROMÄÚ´æ¿Õ¼äµÄ³õʼ»¯COEÎļþ¡£×îºóµ¥»÷Generate°´Å¥Éú³ÉIROMÄ£¿é¡£
2. Êý¾Ý´æ´¢Æ÷µÄÉè¼Æ
Êý¾Ý´æ´¢Æ÷ΪRAMÀàÐ͵Ĵ洢Æ÷£¬²¢ÇÒÐèÒª¶ÀÁ¢µÄ¶Áд¿ØÖÆÐźš£Òò´ËÆä¶ÔÍâµÄ½Ó¿ÚÊäÈëÐźÅΪclk¡¢we¡¢datain¡¢addr£»Êä³öÐźÅΪdataout¡£ Êý¾Ý´æ´¢Æ÷»ù±¾½¨Á¢¹ý³ÌͬROMµÄ½¨Á¢¡£
3. ¼Ä´æÆ÷×éÉè¼Æ
¼Ä´æÆ÷×éÊÇÖ¸Áî²Ù×÷µÄÖ÷Òª¶ÔÏó£¬MIPSÖÐÒ»¹²ÓÐ32¸ö32λ¼Ä´æÆ÷¡£ÔÚÖ¸ÁîµÄ²Ù×÷¹ý³ÌÖÐÐè񻂿·ÖRs¡¢Rt¡¢RdµÄµØÖ·ºÍÊý¾Ý£¬²¢ÇÒRdµÄÊý¾ÝÖ»ÓÐÔڼĴæÆ÷дÐźÅÓÐЧʱ²ÅÄÜдÈ룬Òò´Ë¸ÃÄ£¿éµÄÊäÈëΪclk¡¢RegWriteAddr¡¢RegWriteData¡¢RegWriteEn¡¢RsAddr¡¢RtAddr¡¢reset£»Êä³öÐźÅΪRsData¡¢RtData¡£
ÓÉÓÚ$0Ò»Ö±Êä³ö0£¬Òò´Ëµ±RsAddr¡¢RtAddrΪ0ʱ£¬RsDataÒÔ¼°RtData±ØÐëÊä³ö0£¬·ñÔòÊä³öÏàÓ¦µØÖ·¼Ä´æÆ÷µÄÖµ¡£ÁíÍ⣬µ±RegWriteEnÓÐЧʱ£¬Êý¾ÝÓ¦¸ÃдÈëRegWriteAddr¼Ä´æÆ÷¡£²¢ÇÒÿ´Î¸´Î»Ê±ËùÓмĴæÆ÷¶¼ÇåÁã¡£ ´úÂëÈçÏ£º module regFile(
input clk, input reset,
input [31:0] regWriteData, input [4:0] regWriteAddr, input regWriteEn, output [31:0] RsData, output [31:0] RtData, input [4:0] RsAddr, input [4:0] RtAddr );
reg[31:0] regs[0:31];
assign RsData = (RsAddr == 5'b0)?32'b0:regs[RsAddr]; assign RtData = (RtAddr == 5'b0)?32'b0:regs[RtAddr];
integer i;
always @(posedge clk) begin if(!reset) begin if(regWriteEn==1) begin regs[regWriteAddr]=regWriteData; end end else begin for(i=0;i<31;i=i+1) regs[i]=0; regs[31]=32'hffffffff; end end endmodule
4. ALUÉè¼Æ
ÔÚÕâ¸ö¼òµ¥µÄMIPSÖ¸ÁÖУ¬Î¢´¦ÀíÆ÷Ö§³Öadd¡¢sub¡¢and¡¢or¡¢sltÔËËãÖ¸ÁÐèÒªÀûÓÃALUµ¥ÔªÊµÏÖÔËË㣬ͬʱÊý¾Ý´æ´¢Ö¸Áîsw¡¢lwÒ²ÐèÒªALUµ¥Ôª¼ÆËã´æ´¢Æ÷µØÖ·£¬Ìõ¼þÌø×ªÖ¸ÁîbeqÐèÒªALUÀ´±È½ÏÁ½¸ö¼Ä´æ
Æ÷ÊÇ·ñÏàµÈ¡£ËùÓÐÕâЩָÁî°üº¬µÄ²Ù×÷Ϊ¼Ó¡¢¼õ¡¢Óë¡¢»òСÓÚÉèÖÃ5ÖÖ²»Í¬µÄ²Ù×÷¡£
¸ÃÄ£¿é¸ù¾ÝÊäÈë¿ØÖÆÐźŶÔÊäÈëÊý¾Ý½øÐÐÏàÓ¦µÄ²Ù×÷£¬²¢»ñµÃÊä³ö½á¹ûÒÔ¼°Áã±êʾ£¬ÓÉÓÚMIPS´¦ÀíÆ÷ALUµ¥ÔªÀûÓÃ4¸ùÊäÈë¿ØÖÆÏßµÄÒëÂë¾ö¶¨Ö´ÐкÎÖÖ²Ù×÷£¬Òò´Ë¸ÃÄ£¿éµÄ½Ó¿ÚΪ£º ÊäÈ룺input1(32bit),input2(32bit),aluCtr(4bit) Êä³ö£ºzero(1bit),alluRes(32bit) ´úÂëÈçÏ£º module ALU(
input [31:0] input1, input [31:0] input2, input [3:0] aluCtr, output [31:0] aluRes, output zero );
reg zero;
reg[31:0] aluRes;
always @(input1 or input2 or aluCtr) begin case(aluCtr) 4'b0110: begin aluRes=input1-input2; if(aluRes==0) zero=1; else zero=0; end 4'b0010: aluRes=input1+input2; 4'b0000: aluRes=input1&input2; 4'b0001: aluRes=input1|input2; 4'b1100: aluRes=~(input1|input2); 4'b0111: begin if(input1 aluRes = 0; endcase end endmodule 5. ALU¿ØÖÆÉè¼Æ ALUµ¥Ôª¶ÔÓ¦ÒÔÉÏ5ÖÖ²Ù×÷µÄ±àÂëÈç±íËùʾ£º ÊäÈëÐźŠ²Ù×÷ÀàÐÍ 0000 Óë 0001 »ò 0010 ¼Ó 0110 ¼õ 0111 СÓÚÉèÖà ͨ¹ý2λ²Ù×÷ÀàÐÍÂëÒÔ¼°6λָÁÄÜÂë¾Í¿ÉÒÔ²úÉúALUµ¥ÔªµÄ4λ¿ØÖÆÐźš£ËüÃÇÖ®¼äµÄ¶ÔÓ¦¹ØÏµÈç±íËùʾ£º Òò´Ë¸ÃÄ£¿éµÄÖ÷Òª¹¦ÄܾÍÊǸù¾ÝÒëÂë¿ØÖÆµ¥Ôª²úÉú2λ²Ù×÷ÂëÒÔ¼°6λ¹¦ÄÜÂë²úÉú4λALU¿ØÖÆÐźţ¬½Ó¿ÚΪ£º ÊäÈ룺aluop(2bit),funt(6bit) Êä³ö£ºaluctr(4bit) ´úÂëΪ£º module aluctr( input [1:0] ALUOp, input [5:0] funct, output [3:0] ALUCtr ); reg[3:0] ALUCtr; always @(ALUOp or funct) 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×ֶΣ¬¼´²Ù×÷Âë¡£²Ù×÷Âë¾¹ýÖ÷¿ØÖƵ¥ÔªµÄÒëÂ룬¸øALUCtr¡¢Data¡¢Memory¡¢Registers¡¢MuxsµÈ²¿¼þÊä³öÕýµÄ¿ØÖÆÐźš£ ΢´¦ÀíÆ÷ÔÚÖ´Ðв»Í¬Ö¸Áîʱ£¬¸ç¸ç¿ØÖÆÐźÅÏà¶ÔÓ¦µÄ״̬±íÈçÏ£º Òò´Ë¸ÃÄ£¿éµÄ½Ó¿ÚΪ£º ÊäÈ룺opcode(6bit) Êä³ö£ºalusrc,memtoreg,regwrite,memread,memwrite,branch,,aluop[1:0],jmp ´úÂëΪ£º 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. ·ûºÅÊýÀ©Õ¹ ½«16λÓзûºÅÀ©Õ¹Îª32λÓзûºÅÊý¡£´ø·ûºÅÀ©Õ¹Ö»ÐèÒªÔÚÇ°Ãæ²¹×ã·ûºÅ¼´¿É¡£ ´úÂëΪ£º 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)); dram dmem( .a(aluRes[7:2]), .d(RtData), .clk(!clkin), .we(memwrite), .spo(memreaddata) ); irom_number imem( .a(pc[8:2]), .clk(clkin), .spo(inst) ); regFile regfile( .RsAddr(inst[25:21]), .RtAddr(inst[20:16]), .clk(!clkin), .reset(reset), .regWriteAddr(mux1), .regWriteData(mux3), .regWriteEn(regwrite), .RsData(RsData), .RtData(RtData) ); signext signext(.inst(inst[15:0]),.data(expand)); assign mux1=reg_dst?inst[15:11]:inst[20:16]; assign mux2=alu_scr?expand:RtData; assign mux3=memtoreg?memreaddata:aluRes; assign mux4=choose4?address:add4; assign mux5=jmp?jmpaddr:mux4; assign choose4=branch&zero; assign expand2=expand<<2; assign jmpaddr={add4[31:28],inst[25:0],2'b00}; assign address=pc+expand2; endmodule ËÄ¡¢ Rom»ã±à³ÌÐòÉè¼Æ ÏÂÃæÒÔ½«±¾ÈËѧºÅU201213500µÄASCIIÂë´æÈëRAMµÄÁ¬ÐøÄÚ´æÇøÓò±àдΪ»ã±à³ÌÐòΪÀý£º ±à¼MIPS»ã±àÔ´´úÂ룺 ²ÉÓÃultraedit±à¼»ã±àÔ´³ÌÐò´úÂ룬²¢±£´æÎªnumber.asmÎļþ¡£´úÂëÈçÏ£º main: andi $2,$31,85 #U sw $2,0($3) andi $2,$31,50 #2 sw $2,4($3) andi $2,$31,48 #0 sw $2,8($3) andi $2,$31,49 #1 sw $2,12($3) andi $2,$31,50 #2 sw $2,16($3) andi $2,$31,49 #1 sw $2,20($3) andi $2,$31,51 #3 sw $2,24($3) andi $2,$31,53 #5 sw $2,28($3) andi $2,$31,48 #0 sw $2,32($3) andi $2,$31,48 #0 sw $2,36($3) j main »ñÈ¡»úÆ÷´úÂ룬²¢±£´æÎªcoeÎļþ£º ÀûÓÃQtSpim×°ÔØnumber.asm£¬²¢²âÊÔ¹¦ÄÜÊÇ·ñÕý³£¡£×°ÔØÖ®ºóµÄÓû§´úÂë¶ÎÔÚQtSpimÖеĽṹÈ總ͼËùʾ£º ÌáÈ¡µÄÓû§´úÂë¶ÔÓ¦µÄ»úÆ÷Â룬²¢°Ñj mainÖ¸Áî¶ÔÓ¦µÄ»úÆ÷Âë0x08100009ÐÞ¸ÄΪ0x08000000¡£ ½«ÉÏÊö»úÆ÷Ö¸Áî±£´æÔÚultraeditÖÐеÄÎļþÖУ¬Ìí¼ÓcoeÎļþÍ·ÃèÊöÓï¾ä£¬Íê³ÉºóµÄÍêÕûcoeÎļþÄÚÈÝÈçÏ£º MEMORY_INITIALIZATION_RADIX=16; MEMORY_INITIALIZATION_VECTOR= 33e20055, ac620000, 33e20032, ac620004, 33e20030, ac620008, 33e20031, ac62000c, 33e20032, ac620010, 33e20031, ac620014, 33e20033, ac620018, 33e20035, ac62001c, 33e20030, ac620020, 33e20030, ac620024, 08000000, ½«¸ÃÎļþ±£´æÎªcoeÎļþ£¬¼´number.coe¡£ÖÁ´Ë£¬coeÎļþÖÆ×÷Íê³É¡£ ×îºó£¬°ÑcoeÎļþµ¼ÈëiromÖУ¬ÈçÏÂͼËùʾ£º Îå¡¢ Ä£¿é·ÂÕæ 1. ¼Ä´æÆ÷×é·ÂÕæ£º ½¨Á¢·ÂÕæ´úÂ룬ÔÚ×Ô¶¯Éú³ÉµÄ¼¤Àø´úÂë»ù´¡ÉϼÓÈ빦ÄÜ·ÂÕæÐèÒªµÄ´úÂ룺reset²âÊÔ¡¢Ð´Èë²âÊÔ¡¢Êä³ö²âÊԵȡ¢ÍêÕû´úÂëÈçÏ£º module regsim; // Inputs reg clk; reg reset; reg [31:0] regWriteData; reg [4:0] regWriteAddr; reg regWriteEn; reg [4:0] RsAddr; reg [4:0] RtAddr; // Outputs wire [31:0] RsData; wire [31:0] RtData; // Instantiate the Unit Under Test (UUT) regFile uut ( .clk(clk), .reset(reset), .regWriteData(regWriteData), .regWriteAddr(regWriteAddr), .regWriteEn(regWriteEn), .RsData(RsData), .RtData(RtData), .RsAddr(RsAddr), .RtAddr(RtAddr) ); integer i; initial begin // Initialize Inputs clk = 0; reset = 0; regWriteData = 0; regWriteAddr = 0; regWriteEn = 0; RsAddr = 0; RtAddr = 0; // Wait 100 ns for global reset to finish #100; // Add stimulus here regWriteData=32'h55aaaa55; regWriteEn=1; reset=1; #100; reset=0; end parameter PERIOD = 20; always begin clk = 1'b0; #(PERIOD/2) clk = 1'b1; #(PERIOD/2); end always begin for(i = 31; i>= 1; i=i-1) begin regWriteAddr = i; RsAddr=i; #PERIOD; end end endmodule ·ÂÕæ½á¹ûÈçÏ£º ÏÂͼ¿ÉÒԹ۲쵽ResetΪ¸ßµçƽ״̬¡£Reset¸ßµçƽ״̬ÏÂÊä³öÊý¾ÝΪ0£¬±íʾResetÓÐЧµØ¹¤×÷ÁË¡£ResetÐźÅÎÞЧºó£¬Õý³£ÊäÈëºÍÊä³öÊý¾Ý¡£ µÚÒ»´ÎforÑ»·µÄµØÖ··¶Î§Êä³öÊý¾ÝÔÚʱÖÓµÍµçÆ½Ê±Êä³ö0£¬¸ßµçƽÊä³ö0x55aaaa55£¬ÈçÏÂͼËùʾ£¬±íÃ÷Êý¾ÝÕýÈ·µØÔÚʱÖÓÉÏÉýÑØÐ´ÈëµÄ¡£Ö®ºóÒ»Ö±Êä³öµÄÊý¾ÝÓëдÈëµÄÊý¾ÝÏàͬ£¬±íÃ÷Êý¾Ý¶¼ÕýÈ·µØ±£´æÔڼĴæÆ÷×éÖС£ 2. ¿ØÖÆÆ÷·ÂÕæ£º ¿ØÖÆÆ÷·ÂÕæÐèÒª°üº¬ËùÓÐcaseµÄÊäÈ룬·ÂÕæ¼¤ÀøÎļþÐ޸ĴúÂëºó£¬ÈçÏ£º module ctrsim; // Inputs reg [5:0] opCode; // Outputs wire regDst; wire aluSrc; wire memToReg; wire regWrite; wire memRead; wire memWrite; wire branch; wire [1:0] aluop; wire jmp; // Instantiate the Unit Under Test (UUT) ctr uut ( .opCode(opCode), .regDst(regDst), .aluSrc(aluSrc), .memToReg(memToReg), .regWrite(regWrite), .memRead(memRead), .memWrite(memWrite), .branch(branch), .aluop(aluop), .jmp(jmp) ); initial begin // Initialize Inputs opCode = 0; // Wait 100 ns for global reset to finish #100; opCode=6'b000010;//jump #100; opCode=6'b000000;//R #100; opCode=6'b100011;//lw #100; opCode=6'b101011;//sw #100; opCode=6'b000100; end endmodule ËùÓÐcaseϵķÂÕæ²¨ÐÎÈçͼËùʾ£¬½«¸Ã²¨ÐÎͼÓë֮ǰµÄ±í¸ñ¶Ô°É·¢ÏÖ¹¦ÄÜÕýÈ·¡£ 3. ¶¥²ã·ÂÕæ£º ¼¤Àø´úÂëÈçÏ£º module topsim; // Inputs reg clkin; reg reset; // Instantiate the Unit Under Test (UUT) top uut ( .clkin(clkin), .reset(reset) ); initial begin // Initialize Inputs clkin = 0; reset = 0; // Add stimulus here #100; reset = 1; #100; reset = 0; end parameter PERIOD = 20; always begin clkin = 1'b0; #(PERIOD/2) clkin = 1'b1; #(PERIOD/2); End endmodule TopÄ£¿é·ÂÕæ²¨ÐÎÈçÏ£º Ê×ÏȲ鿴ָÁîÖ´ÐÐ˳ÐòÊÇ·ñÕýÈ·£¬ÑéÖ¤Ìø×ªÖ¸Áî¡£ ´ÓÉÏͼ¿ÉÒÔ¿´µ½Ö¸Áî´æ´¢Æ÷µØÖ·a[9:0]´Ó0µ½8Ñ»·£¬±íÃ÷Ö¸Áî´ÓµÚ0Ìõ˳ÐòÖ´Ðе½µÚ8ÌõÖ®ºóÌø×ªµ½µÚ0ÌõÐźÅÖ´ÐС£ÕâÊÇÓÉÓÚÔÚÖ¸Áî´æ´¢Æ÷ÖдæÈëÁËÈçÏ´úÂ룺 main: add $4,$2,$3 #0ºÅÖ¸Áî lw $4,4($2) #1ºÅÖ¸Áî sw $2,8($2) #2ºÅÖ¸Áî sub $2,$4,$3#3ºÅÖ¸Áî or $2,$4,$3#4ºÅÖ¸Áî and $2,$4,$3#5ºÅÖ¸Áî slt $2,$4,$3#6ºÅÖ¸Áî beq $4,$3,exit #7ºÅÖ¸Áî j main #8ºÅÖ¸Áî exit:lw $2,0($3) #9ºÅÖ¸Áî j main #10ºÅÖ¸Áî ²¢ÇÒ½«Êý¾Ý´æ´¢Æ÷µÄÄÚ´æ¿Õ¼ä³õʼ»¯Îª0x55555555ÁË¡£ÓÉÓÚ1ºÅÖ¸Á$4´ÓÄÚ´æÖжÁ³öÊý¾ÝΪ0x55555555£¬¶ø$3һֱΪ0£¬Ö´Ðе½7ºÅÖ¸Áîʱ²»ÏàµÈ£¬´Ó¶øË³ÐòÖ´ÐÐ8ºÅjÖ¸ÁîµÄ½á¹û¡£ È»ºóÔڲ鿴¸÷ÌõÖ¸ÁîÖ´Ðнá¹û£¬1¡¢3¡¢4¡¢5¡¢6ºÅÖ¸Áî¶¼½«Ð޸ļĴæÆ÷µÄÖµ£¬Òò´Ë¿ÉÒԲ鿴¼Ä´æÆ÷Ä£¿éµÄregWriteDataΪ0x55555555£¬regWriteAddrΪ04£¬ÇÒRegWriteEndΪ1£¬±íʾ½«¶Ô4ºÅ¼Ä´æÆ÷дÈëÊý¾Ý0x55555555£¬ÕâÕýÊÇÎÒÃÇÏëÒªµÄ½á¹û¡£ 4. ¼ÓѧºÅÖÁRAMµÄ·ÂÕæ£º °ÑcoeÎļþµ¼ÈëROMºó£¬Í¨¹ý·ÂÕæ£¬¿ÉÒԵõ½ÒÔϵķÂÕæ²¨ÐΣº ´ÓISimÊÓͼ²þ¿ñÑ¡Ôñmemory£¬Ñ¡Ôñram_dataÄ£¿é£¬¿ÉÒÔ¿´µ½±¾È˵ÄѧºÅU201213500ÒѾ´æ½øRAMÖÐÁË£º Áù¡¢ ÐĵÃÌå»á ͨ¹ýÕâ´ÎʵÑ飬ÎÒÁ˽âÁË΢´¦ÀíÆ÷µÄ»ù±¾½á¹¹£¬ÕÆÎÕÁ˹þ·ð½á¹¹µÄ¼ÆËã»ú¹¤×÷ÔÀí£¬Ñ§»áÁËÉè¼Æ¼òµ¥µÄ΢´¦ÀíÆ÷£¬Í¬Ê±£¬Á˽âÁËÈí¼þ¿ØÖÆÓ²¼þ¹¤×÷µÄ»ù±¾ÔÀí¡£ ÔÚ±¾´ÎʵÑé¹ý³ÌÖУ¬ÎÒÔÚÓï·¨µÄ±àÒëÖУ¬Óöµ½ÁËÒ»µãÎÊÌ⣬µ«ÊÇÄܹ»ÔڱȽϿìËÙµÄʱ¼äÄÚ½â¾öµô¡£ÎÒ¸öÈËÈÏΪ£¬±¾´ÎʵÑé³É¹¦µÄ¹Ø¼ü£¬Ó¦¸ÃÊǶÔʵÑéÔÀíµÄÀí½â£¬ºÍ¶Ô¿Î±¾ÖªÊ¶µÄѧÒÔÖÂÓ᣶øÇÒ£¬Í¬Ñ§Ö®¼äµÄ½»Á÷ºÍһЩÏà¹ØµÄ×ÊÁÏÒ²ÊÇʵÑéµÄ¹Ø¼ü¡£ Õâ¸öʵÑé×ÜÌåÀ´½²£¬ÊDZȽÏÓÐÌôÕ½ÐԵģ¬ÌرðÊÇÓöµ½MIPS΢´¦ÀíÆ÷µÄ½á¹¹·½ÃæµÄÎÊÌâµÄʱºò¡£»¹ÓÐÊÇͨ¹ý»ã±àÓïÑÔ£¬Ð´´æÈëѧºÅµ½RAMÀïµÄ¹ý³ÌÒ²ÊÇÓеãÄѶȡ£µ«¾¹ý¶ÔʵÑéÔÀíµÄÀí½âºó£¬»¹ÊÇÄܹ»Ë³ÀûµØÍê³ÉÁË¡£ Ï£ÍûÏÂÒ»´ÎʵÑ飬Ҳ»áÒ»Ñù˳ÀûµØÍê³É¡£