计算机组成原理实验
19. PCout <= PCin; 20. end 21. end 22. endmodule
仿真截图:
(3)程序存储器(instruction memory) Verilog代码:
1. module IMemory( 2. input InsMemRW, 3. input [31:0] address, 4. output reg [31:0] DataOut 5. );
6. reg [7:0] mem [0:127]; 7. initial begin
8. DataOut = 32'b111111_0000000_0000000_0000000_00000;
9. $readmemb(\, mem); 10. end
11. always@(address or InsMemRW) begin 12. if(InsMemRW == 1) begin
13. DataOut[31:24] <= mem[address]; 14. DataOut[23:16] <= mem[address+1]; 15. DataOut[15:8] <= mem[address+2]; 16. DataOut[7:0] <= mem[address+3]; 17. end 18. end 19. endmodule
仿真截图:
(4)ALU Verilog代码:
计算机组成原理实验
1. module ALU(
2. input [2:0] ALUopcode, 3. input [31:0] rega, 4. input [31:0] regb, 5. output reg [31:0] result, 6. output zero, 7. output sign 8. );
9. assign zero = (result==0)?1:0; 10. assign sign = result[31];
11. always @( ALUopcode or rega or regb ) begin 12. case (ALUopcode)
13. 3'b000 : result = rega + regb; 14. 3'b001 : result = rega - regb; 15. 3'b010 : result = regb << rega; 16. 3'b011 : result = rega | regb; 17. 3'b100 : result = rega & regb;
18. 3'b101 : result = (rega < regb)?1:0; // 不带符号比较 19. 3'b110 : begin // 带符号比较
20. if (rega 26. 3'b111 : result = rega ^ regb; 27. endcase 28. end 29. endmodule 仿真截图: (5)寄存器堆 Verilog代码: 计算机组成原理实验 1. module RegFile( 2. input CLK, 3. input RST, 4. input RegWre, 5. input [4:0] ReadReg1, 6. input [4:0] ReadReg2, 7. input [4:0] WriteReg, 8. input [31:0] WriteData, 9. output [31:0] ReadData1, 10. output [31:0] ReadData2 11. ); 12. reg [31:0] regFile[1:31]; // 寄存器定义必须用reg 类型 13. integer i; 14. assign ReadData1 = (ReadReg1 == 0) ? 0 : regFile[ReadReg1]; // 读寄存器数 据 15. assign ReadData2 = (ReadReg2 == 0) ? 0 : regFile[ReadReg2]; 16. always @ (negedge CLK) begin // 必须用时钟边沿触发 17. if (RST==0) begin 18. for(i=1;i<32;i=i+1) 19. regFile[i] <= 0; 20. end 21. else if(RegWre == 1 && WriteReg != 0) begin 22. regFile[WriteReg] <= WriteData; 23. end 24. end 25. 26. endmodule 仿真截图: (6)数据存储单元(Data Memory) Verilog代码: 1. module DataMemory( 2. input clk, 3. input [31:0] address, 4. input RD, 5. input WR, 计算机组成原理实验 6. input [31:0] DataIn, 7. output [31:0] DataOut 8. ); 9. 10. reg [7:0] ram[0:127]; 11. integer i; 12. initial begin; 13. for(i=0;i<128;i=i+1) 14. ram[i]<=0; 15. end 16. // output 17. assign DataOut[7:0] = (RD == 0)? ram[address+3]:8'bz; 18. assign DataOut[15:8] = (RD == 0)? ram[address+2]:8'bz; 19. assign DataOut[23:16] = (RD == 0)? ram[address+1]:8'bz; 20. assign DataOut[31:24] = (RD == 0)? ram[address]:8'bz; 21. // input 22. always@(negedge clk) begin 23. if(WR == 0) begin 24. if(address>=0 && address<128) begin 25. ram[address] <= DataIn[31:24]; 26. ram[address+1] <= DataIn[23:16]; 27. ram[address+2] <= DataIn[15:8]; 28. ram[address+3] <= DataIn[7:0]; 29. end 30. end 31. end 32. endmodule 仿真截图: 3.测试程序: 测试程序如下: 地址 汇编程序 指令代码 oprs(5) (6) 000001 010000 000000 000010 010001 00000 00000 00010 00011 00011 rt(5) rd(5)/immediate (16) 00001 00010 00001 00010 00010 0000 0000 0000 1000 0000 0000 0000 0010 00011 00000 000000 00101 00000 000000 00100 00000 000000 16进制数代码 0401 0008 4002 0002 0041 1800 0862 2800 4462 2000 0x00000000 addi $1,$0,8 0x00000004 ori $2,$0,2 0x00000008 add $3,$2,$1 0x0000000C sub $5,$3,$2 0x00000010 and $4,$5,$2 计算机组成原理实验 0x00000014 or $8,$4,$2 0x00000018 sll $8,$8,1 0x0000001C bne $8,$1,-2 (≠,转18) 0x00000020 slt $6,$2,$1 0x00000024 slt $7,$6,$0 0x00000028 addi $7,$7,8 0x0000002C beq $7,$1,-2 (≠,转28) 0x00000030 sw $2,4($1) 0x00000034 lw $9,4($1) 0x00000038 bgtz $9,2 (=0) 0x0000003C addi $9,$0,15 0x00000040 j 0x00000038 0x00000044 halt 机器代码(.roe): 010010 011000 110001 011100 011100 000001 110000 100110 100111 110010 000001 111000 111111 00100 00000 01000 00010 00110 00111 00111 00001 00001 01001 00000 00010 01000 00001 00001 00000 00111 00001 00010 01001 00000 01001 01000 00000 000000 01000 00001 000000 1111 1111 1111 1110 00110 00000 000000 00111 00000 000000 0000 0000 0000 1000 1111 1111 1111 1110 0000 0000 0000 0100 0000 0000 0000 0100 0000 0000 0000 0010 0000 0000 0000 1111 4882 4000 6008 4040 C501 FFFE 7041 3000 70C0 3800 04E1 0008 C0E1 FFFE 9822 0000 9C29 0004 C920 0002 0409 000F E000 000E FC00 0000 00 0000 0000 0000 0000 0000 1110 00 0000 0000 0000 0000 0000 0000 仿真截图: (1)addi $1, $0, 8 至 bne $1, $8, -2