ÀàMIPSµ¥ÖÜÆÚ΢´¦ÀíÆ÷Éè¼ÆÊµÑ鱨¸æ-ÖÓԶά-U201213500 ÏÂÔØ±¾ÎÄ

Àà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ÀïµÄ¹ý³ÌÒ²ÊÇÓеãÄѶȡ£µ«¾­¹ý¶ÔʵÑéÔ­ÀíµÄÀí½âºó£¬»¹ÊÇÄܹ»Ë³ÀûµØÍê³ÉÁË¡£

Ï£ÍûÏÂÒ»´ÎʵÑ飬Ҳ»áÒ»Ñù˳ÀûµØÍê³É¡£