⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 decoder.v

📁 MIPS CPU tested in Icarus Verilog
💻 V
📖 第 1 页 / 共 3 页
字号:
		       Branch = 1'b0; //With 0, the PC is incremented in 1
		       Jump = 1'b0; //So that PC gets incremented in 1
		       Write_RF = 1'b1; //With 1 we write to the register file
		       Src2 = 1'b0; // With 0 the Mux selects Output B from RegFile
		       ALUOP = S_SUBU; //Special SUBU Opcode
		       RegDest = 2'b01; // With 1, the Mux selects Rd
		       Memory_Read = 1'b0; //Doesn't read from memory
		       Memory_Write = 1'b0; //Doesn't write to memory
		       Mem2Reg = 3'b000; //With 0 the Mux selects the output from the ALU
		       IntFP = 1'b0; //Select the ALU unit
		       ArSh = 1'b0; //SrcA = I[25-21]
		    end // case: S_SUBU

		    S_AND: begin
		       Branch = 1'b0; //With 0, the PC is incremented in 1
		       Jump = 1'b0; //So that PC gets incremented in 1
		       Write_RF = 1'b1; //With 1 we write to the register file
		       Src2 = 1'b0; // With 0 the Mux selects Output B from RegFile
		       ALUOP = S_AND; //Special AND Opcode
		       RegDest = 2'b01; // With 1, the Mux selects Rd
		       Memory_Read = 1'b0; //Doesn't read from memory
		       Memory_Write = 1'b0; //Doesn't write to memory
		       Mem2Reg = 3'b000; //With 0 the Mux selects the output from the ALU
		       IntFP = 1'b0; //Select the ALU unit
		       ArSh = 1'b0; //SrcA = I[25-21]
		    end // case: S_AND

		    S_OR: begin
		       Branch = 1'b0; //With 0, the PC is incremented in 1
		       Jump = 1'b0; //So that PC gets incremented in 1
		       Write_RF = 1'b1; //With 1 we write to the register file
		       Src2 = 1'b0; // With 0 the Mux selects Output B from RegFile
		       ALUOP = S_OR; //Special OR Opcode
		       RegDest = 2'b01; // With 1, the Mux selects Rd
		       Memory_Read = 1'b0; //Doesn't read from memory
		       Memory_Write = 1'b0; //Doesn't write to memory
		       Mem2Reg = 3'b000; //With 0 the Mux selects the output from the ALU
		       IntFP = 1'b0; //Select the ALU unit
		       ArSh = 1'b0; //SrcA = I[25-21]
		    end // case: S_OR

		    S_NOR: begin
		       Branch = 1'b0; //With 0, the PC is incremented in 1
		       Jump = 1'b0; //So that PC gets incremented in 1
		       Write_RF = 1'b1; //With 1 we write to the register file
		       Src2 = 1'b0; // With 0 the Mux selects Output B from RegFile
		       ALUOP = S_NOR; //Special NOR Opcode
		       RegDest = 2'b01; // With 1, the Mux selects Rd
		       Memory_Read = 1'b0; //Doesn't read from memory
		       Memory_Write = 1'b0; //Doesn't write to memory
		       Mem2Reg = 3'b000; //With 0 the Mux selects the output from the ALU
		       IntFP = 1'b0; //Select the ALU unit
		       ArSh = 1'b0; //SrcA = I[25-21]
		    end // case: S_NOR

		    S_XOR: begin
		       Branch = 1'b0; //With 0, the PC is incremented in 1
		       Jump = 1'b0; //So that PC gets incremented in 1
		       Write_RF = 1'b1; //With 1 we write to the register file
		       Src2 = 1'b0; // With 0 the Mux selects Output B from RegFile
		       ALUOP = S_XOR; //XOR Opcode
		       RegDest = 2'b01; // With 1, the Mux selects Rd
		       Memory_Read = 1'b0; //Doesn't read from memory
		       Memory_Write = 1'b0; //Doesn't write to memory
		       Mem2Reg = 3'b000; //With 0 the Mux selects the output from the ALU
		       IntFP = 1'b0; //Select the ALU unit
		       ArSh = 1'b0; //SrcA = I[25-21]
		    end // case: S_XOR

		    S_SLL: begin
		       Branch = 1'b0; //With 0, the PC is incremented in 1
		       Jump = 1'b0; //So that PC gets incremented in 1
		       Write_RF = 1'b1; //With 1 we write to the register file
		       Src2 = 1'b1; // With 1 the Mux selects the output of EXT-32
		       ALUOP = S_SLL; //Special SLL Opcode
		       RegDest = 2'b01; // With 1, the Mux selects Rd
		       Memory_Read = 1'b0; //Doesn't read from memory
		       Memory_Write = 1'b0; //Doesn't write to memory
		       Mem2Reg = 3'b000; //With 0 the Mux selects the output from the ALU
		       IntFP = 1'b0; //Select the ALU unit
		       ArSh = 1'b1; //SrcA = I[20-16]
		    end // case: S_SLL

		    S_SLLV: begin
		       Branch = 1'b0; //With 0, the PC is incremented in 1
		       Jump = 1'b0; //So that PC gets incremented in 1
		       Write_RF = 1'b1; //With 1 we write to the register file
		       Src2 = 1'b0; // With 0 the Mux selects output B from RegFile
		       ALUOP = S_SLLV; //Special SLLV Opcode
		       RegDest = 2'b01; // With 1, the Mux selects Rd
		       Memory_Read = 1'b0; //Doesn't read from memory
		       Memory_Write = 1'b0; //Doesn't write to memory
		       Mem2Reg = 3'b000; //With 0 the Mux selects the output from the ALU
		       IntFP = 1'b0; //Select the ALU unit
		       ArSh = 1'b0; //SrcA = I[25-21]
		    end // case: S_SLLV

		    S_SRA: begin
		       Branch = 1'b0; //With 0, the PC is incremented in 1
		       Jump = 1'b0; //So that PC gets incremented in 1
		       Write_RF = 1'b1; //With 1 we write to the register file
		       Src2 = 1'b1; // With 1 the Mux selects the output of EXT-32
		       ALUOP = S_SRA; //Special SRA Opcode
		       RegDest = 2'b01; // With 1, the Mux selects Rd
		       Memory_Read = 1'b0; //Doesn't read from memory
		       Memory_Write = 1'b0; //Doesn't write to memory
		       Mem2Reg = 3'b000; //With 0 the Mux selects the output from the ALU
		       IntFP = 1'b0; //Select the ALU unit
		       ArSh = 1'b1; //SrcA = I[20-16]
		    end // case: S_SRA

		    S_SRAV: begin
		       Branch = 1'b0; //With 0, the PC is incremented in 1
		       Jump = 1'b0; //So that PC gets incremented in 1
		       Write_RF = 1'b1; //With 1 we write to the register file
		       Src2 = 1'b0; // With 0 the Mux selects output B from RegFile
		       ALUOP = S_SRAV; //Special SRAV Opcode
		       RegDest = 2'b01; // With 1, the Mux selects Rd
		       Memory_Read = 1'b0; //Doesn't read from memory
		       Memory_Write = 1'b0; //Doesn't write to memory
		       Mem2Reg = 3'b000; //With 0 the Mux selects the output from the ALU
		       IntFP = 1'b0; //Select the ALU unit
		       ArSh = 1'b0; //SrcA = I[25-21]
		    end // case: S_SRAV

		    S_SRL: begin
		       Branch = 1'b0; //With 0, the PC is incremented in 1
		       Jump = 1'b0; //So that PC gets incremented in 1
		       Write_RF = 1'b1; //With 1 we write to the register file
		       Src2 = 1'b1; // With 1 the Mux selects the output of EXT-32
		       ALUOP = S_SRL; //Special SRL Opcode
		       RegDest = 2'b01; // With 1, the Mux selects Rd
		       Memory_Read = 1'b0; //Doesn't read from memory
		       Memory_Write = 1'b0; //Doesn't write to memory
		       Mem2Reg = 3'b000; //With 0 the Mux selects the output from the ALU
		       IntFP = 1'b0; //Select the ALU unit
		       ArSh = 1'b1; //SrcA = I[20-16]
		    end // case: S_SRL

		    S_SRLV: begin
		       Branch = 1'b0; //With 0, the PC is incremented in 1
		       Jump = 1'b0; //So that PC gets incremented in 1
		       Write_RF = 1'b1; //With 1 we write to the register file
		       Src2 = 1'b0; // With 0 the Mux selects output B from RegFile
		       ALUOP = S_SRLV; //Special SRLV Opcode
		       RegDest = 2'b01; // With 1, the Mux selects Rd
		       Memory_Read = 1'b0; //Doesn't read from memory
		       Memory_Write = 1'b0; //Doesn't write to memory
		       Mem2Reg = 3'b000; //With 0 the Mux selects the output from the ALU
		       IntFP = 1'b0; //Select the ALU unit
		       ArSh = 1'b0; //SrcA = I[25-21]
		    end // case: S_SRLV

		    S_MULT: begin
		       Branch = 1'b0; //With 0, the PC is incremented in 1
		       Jump = 1'b0; //So that PC gets incremented in 1
		       Write_RF = 1'b1; //With 1 we write to the register file
		       Src2 = 1'b0; // With 0 the Mux selects Output B from RegFile
		       ALUOP = S_MULT; //Special MULT Opcode
		       RegDest = 2'b01; // With 1, the Mux selects Rd
		       Memory_Read = 1'b0; //Doesn't read from memory
		       Memory_Write = 1'b0; //Doesn't write to memory
		       Mem2Reg = 3'b000; //With 0 the Mux selects the output from the ALU
		       IntFP = 1'b0; //Select the ALU unit
		       ArSh = 1'b0; //SrcA = I[25-21]
		    end // case: S_MULT

		    S_MULTU: begin
		       Branch = 1'b0; //With 0, the PC is incremented in 1
		       Jump = 1'b0; //So that PC gets incremented in 1
		       Write_RF = 1'b1; //With 1 we write to the register file
		       Src2 = 1'b0; // With 0 the Mux selects Output B from RegFile
		       ALUOP = S_MULTU; //Special MULTU Opcode
		       RegDest = 2'b01; // With 1, the Mux selects Rd
		       Memory_Read = 1'b0; //Doesn't read from memory
		       Memory_Write = 1'b0; //Doesn't write to memory
		       Mem2Reg = 3'b000; //With 0 the Mux selects the output from the ALU
		       IntFP = 1'b0; //Select the ALU unit
		       ArSh = 1'b0; //SrcA = I[25-21]
		    end // case: S_MULTU

		    S_DIV: begin
		       Branch = 1'b0; //With 0, the PC is incremented in 1
		       Jump = 1'b0; //So that PC gets incremented in 1
		       Write_RF = 1'b1; //With 1 we write to the register file
		       Src2 = 1'b0; // With 0 the Mux selects Output B from RegFile
		       ALUOP = S_DIV; //Special DIV Opcode
		       RegDest = 2'b01; // With 1, the Mux selects Rd
		       Memory_Read = 1'b0; //Doesn't read from memory
		       Memory_Write = 1'b0; //Doesn't write to memory
		       Mem2Reg = 3'b000; //With 0 the Mux selects the output from the ALU
		       IntFP = 1'b0; //Select the ALU unit
		       ArSh = 1'b0; //SrcA = I[25-21]
		    end // case: S_DIV

		    S_DIVU: begin
		       Branch = 1'b0; //With 0, the PC is incremented in 1
		       Jump = 1'b0; //So that PC gets incremented in 1
		       Write_RF = 1'b1; //With 1 we write to the register file
		       Src2 = 1'b0; // With 0 the Mux selects Output B from RegFile
		       ALUOP = S_DIVU; //Special DIVU Opcode
		       RegDest = 2'b01; // With 1, the Mux selects Rd
		       Memory_Read = 1'b0; //Doesn't read from memory
		       Memory_Write = 1'b0; //Doesn't write to memory
		       Mem2Reg = 3'b000; //With 0 the Mux selects the output from the ALU
		       IntFP = 1'b0; //Select the ALU unit
		       ArSh = 1'b0; //SrcA = I[25-21]
		    end // case: S_DIVU
		  endcase // case(Instruction[5:0])
	       end // case: 6'b000000

	       default: begin
		  Branch = 1'b0; //With 0, the PC is incremented in 1
		  Jump = 1'b0; //So that PC gets incremented in 1
		  Write_RF = 1'b0; //With 0 we don't write to the register file
		  Src2 = 1'b0; // With 0 the Mux selects Output B from RegFile
		  ALUOP = NOP; //No Operation Opcode
		  RegDest = 2'b00; // Doesn't matter
		  Memory_Read = 1'b0; //Doesn't read from memory
		  Memory_Write = 1'b0; //Doesn't write to memory
		  Mem2Reg = 3'b000; //With 0 the Mux selects the output from the ALU
		  IntFP = 1'b0; //Select the ALU unit
		  ArSh = 1'b0; //SrcA = I[25-21]
	       end // case: default
	     endcase // case(Instruction[InstWidth-1:InstWidth-6])
	  end // else: !if(Reset == 1)
     end // always @ (posedge Clock)
endmodule // decoder

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -