Advertisement
Guest User

Untitled

a guest
Apr 26th, 2017
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module controlUnit(regWrite, pcSrc, regDst, aluOp, aluSrc, branch, memWrite, memRead, memtoReg, address, funct, immediate, rs, rt, rd, shamt, type, opcode, zeroFlag, instruction, clk);
  2.     output reg regWrite, aluSrc, branch, memWrite, memRead, memtoReg, regDst, pcSrc = 0;
  3.     output reg [2:0] aluOp;
  4.     input zeroFlag, clk;
  5.     input [31:0] instruction;
  6.     output reg [25:0] address = 0;
  7.     output reg [5:0] funct = 0;
  8.     output reg [15:0] immediate  = 0;
  9.     output reg [4:0] rs = 0;
  10.     output reg [4:0] rt = 0;
  11.     output reg [4:0] rd = 0;
  12.     output reg [4:0] shamt = 0;
  13.     output reg [2:0] type = 0;
  14.     output [5:0] opcode;
  15.     assign opcode = instruction[31:26];
  16.    
  17.     always@(posedge clk)
  18.     begin
  19.         if(instruction[31:26]==0)
  20.         begin
  21.             address = 0;
  22.             rs = instruction[25:21];
  23.             rt = instruction[20:16];
  24.             rd = instruction[15:11];
  25.             shamt = instruction[10:6];
  26.             funct = instruction[5:0];
  27.         end
  28.     else
  29.         begin
  30.             rs = instruction[25:21];
  31.             rt = instruction[20:16];
  32.             address = instruction[15:0];
  33.         end
  34.     end
  35.  
  36.     always@(instruction)
  37.     begin
  38.     if (opcode == 0)
  39.         begin
  40.             branch = 0 ;
  41.             pcSrc = 0 ;
  42.             regWrite = 1 ;
  43.             regDst = 1 ;
  44.             aluSrc = 0 ;
  45.             memRead = 0 ;
  46.             memWrite = 0 ;
  47.             memtoReg=0;
  48.             if(funct == 6'h24)
  49.                 aluOp = 3'b010;
  50.             else if (funct == 6'h25)
  51.                 aluOp = 3'b100;
  52.             else if (funct == 6'h20)
  53.                 aluOp = 3'b000;
  54.             else if (funct == 6'h22)
  55.                 aluOp = 3'b001;
  56.             else if (funct == 6'h2A)
  57.                 aluOp = 3'b101;
  58.             else if (funct == 6'h2)
  59.                 aluOp = 3'b110;
  60.             else if (funct == 6'h0)
  61.                 aluOp = 3'b111;
  62.             end
  63.         else if (opcode == 6'h8) //ADI
  64.         begin
  65.             branch = 0 ;
  66.             pcSrc = 1 ;
  67.             regWrite = 1 ;
  68.             regDst = 0 ;
  69.             aluSrc = 1 ;
  70.             aluOp = 3'b000;
  71.             memRead = 0 ;
  72.             memWrite = 0 ;
  73.             memtoReg= 0;
  74.         end
  75.         else if (opcode == 6'hD) //ORI
  76.         begin
  77.             branch = 0 ;
  78.             pcSrc = 1 ;
  79.             regWrite = 1 ;
  80.             regDst = 0 ;
  81.             aluSrc = 1 ;
  82.             aluOp = 3'b100;
  83.             memRead = 0 ;
  84.             memWrite = 0 ;
  85.             memtoReg= 0;
  86.         end
  87.         else if (opcode == 6'hC) //ANDI
  88.         begin
  89.             branch = 0 ;
  90.             pcSrc = 1 ;
  91.             regWrite = 1 ;
  92.             regDst = 0 ;
  93.             aluSrc = 1 ;
  94.             aluOp = 3'b010;
  95.             memRead = 0 ;
  96.             memWrite = 0 ;
  97.             memtoReg= 0;
  98.         end
  99.         else if(opcode == 6'h23) //LW
  100.         begin
  101.             branch = 0 ;
  102.             pcSrc = 0 ;
  103.             regWrite = 1 ;
  104.             regDst = 0 ;
  105.             aluSrc = 1 ;
  106.             aluOp = 3'bxxx;
  107.             memRead = 1 ;
  108.             memWrite = 0 ;
  109.             memtoReg= 1;
  110.         end
  111.         else if (opcode == 6'h2B) //SW
  112.         begin
  113.             branch = 0 ;
  114.             pcSrc = 0 ;
  115.             regWrite = 0 ;
  116.             regDst = 1'bx ;
  117.             aluSrc = 1 ;
  118.             aluOp = 3'bxxx;
  119.             memRead = 0 ;
  120.             memWrite = 1 ;
  121.             memtoReg= 1'bx;
  122.         end
  123.         else if (opcode == 6'h4) //BEQ
  124.         begin
  125.             branch = 1 ;
  126.             pcSrc = 1 ;
  127.             regWrite = 0 ;
  128.             regDst = 1'bx ;
  129.             aluSrc = 0 ;
  130.             aluOp = 3'bxxx;
  131.             memRead = 0 ;
  132.             memWrite = 0 ;
  133.             memtoReg= 1'bx;
  134.         end
  135.         else if(opcode ==6'h5) //BNE
  136.         begin
  137.             branch = 1 ;
  138.             pcSrc = 1 ;
  139.             regWrite = 0 ;
  140.             regDst = 1'bx ;
  141.             aluSrc = 0 ;
  142.             aluOp = 3'bxxx;
  143.             memRead = 0 ;
  144.             memWrite = 1 ;
  145.             memtoReg= 1'bx;
  146.         end
  147.     end
  148. endmodule
  149.  
  150. module mux_2x1_32b(result,i1,i2,select);
  151.     output [31:0] result ;
  152.     input [31:0] i1;
  153.     input [31:0] i2;
  154.     input select ;
  155.     assign result= (select)?i1:i2;
  156. endmodule
  157.  
  158. module mux_2x1_5b(result,i1,i2,select);
  159.     output [4:0] result;
  160.     input [4:0] i1,i2;
  161.     input select ;
  162.     assign result = (select)?i1:i2;
  163. endmodule
  164.  
  165. module ALU(out, zeroflag, input1, input2, aluOperation, clk);
  166.     input [31:0] input1, input2;
  167.     input [2:0] aluOperation;
  168.     input clk;
  169.     output reg [31:0] out;
  170.     output reg zeroflag = 1'b0;
  171.  
  172.     always@(posedge clk)
  173.     begin
  174.         if(input1 == input2)
  175.             zeroflag = 1;
  176.         else
  177.             zeroflag = 0;
  178.     end
  179.  
  180.     always@(posedge clk)
  181.     begin
  182.     case(aluOperation)
  183.         0: out = input1 + input2;
  184.         1: out = input1 - input2;
  185.         2: out = input1 & input2;
  186.         3: out = input1 << input2;
  187.         4: out = input1 | input2;
  188.         5: out = input1 < input2;
  189.         6: out = input1 >> input2 ;
  190.         default : out = 31'b0;
  191.     endcase
  192.     end
  193. endmodule
  194.  
  195. module id_stage(pcSrc, memToReg, regWrite, memWrite, branch, memRead, aluSrc, aluOp, regDst, pc_out, read_data_1, read_data_2, sign_extended_bit, rs, rt, rd, pc_in, instruction,writeData ,clk);
  196.      output pcSrc, memToReg, memRead, memWrite, branch, zero, regWrite;
  197.      output aluSrc, regDst;
  198.      output[2:0] aluOp;
  199.      output [31:0] pc_out;
  200.      output [31:0] read_data_1, read_data_2, sign_extended_bit ;
  201.      input [31:0] pc_in, instruction, writeData;
  202.      input clk;
  203.      wire [25:0] address;
  204.      wire [5:0] funct;
  205.      wire [15:0] immediate;
  206.      output wire [4:0] rs, rt, rd;
  207.      wire [4:0] shamt;
  208.      wire [2:0] type;
  209.      wire [5:0] opcode;
  210.  
  211.     assign opcode = instruction[31:26];
  212.  
  213.     controlUnit ctrlunit(regWrite, pcSrc, regDst, aluOp, aluSrc, branch, memWrite, memRead, memtoReg, address, funct, immediate, rs, rt, rd, shamt, type, opcode, zero, instruction, clk);
  214.     assign sign_extended_bit = $signed(immediate);
  215.     rf rf(read_data_1, read_data_2, clk, rs, rt, rd, writeData, regWrite);
  216. endmodule
  217.  
  218. module rf(read_data_1, read_data_2, clk, read_reg_1, read_reg_2, write_reg, write_data, regWrite);
  219.     output reg [31:0] read_data_1, read_data_2;
  220.     input clk;
  221.     input [4:0] read_reg_1, read_reg_2, write_reg;
  222.     input [31:0] write_data;
  223.     input regWrite;
  224.     reg [31:0] registers[31:0];
  225.  
  226.     always@(read_reg_1, read_reg_2)
  227.     begin
  228.         read_data_1 <= (read_reg_1==0)? 32'b0 : registers[read_reg_1];
  229.         read_data_2 <= (read_reg_2==0)? 32'b0 : registers[read_reg_2];
  230.     end
  231.  
  232.     always @(posedge clk)
  233.     begin
  234.         if(regWrite)
  235.         begin
  236.             registers[write_reg] <= write_data;
  237.         end
  238.     end
  239. endmodule
  240.  
  241. module instruction_memory(instruction, read_address);
  242.     parameter N = 1;
  243.     output [31:0] instruction;
  244.     input [31:0] read_address;
  245.     reg [31:0] memory [0:0];
  246.     initial
  247.     begin
  248.         $readmemb("instructions.txt", memory);
  249.     end
  250.     assign instruction = memory[read_address];
  251. endmodule
  252.  
  253. module if_stage(pc, instruction, pcSrc, offset, clk);
  254.     output reg [31:0] pc = 32'b0;
  255.     output [31:0] instruction;
  256.  
  257.     input pcSrc, clk;
  258.     input [31:0] offset;
  259.    
  260.     always@(posedge clk)
  261.         begin
  262.             pc = (pcSrc)?(offset):(pc+1);
  263.         end
  264.     instruction_memory mem_(instruction, pc);
  265. endmodule
  266.  
  267. module shift_add(result, in1, in2);
  268.     output reg [31:0] result;
  269.     input [31:0] in1, in2;
  270.     reg input2;
  271.  
  272.     always@(in1, in2)
  273.     begin
  274.         input2 = in2 << 2;
  275.         result = in1 + input2;
  276.     end
  277. endmodule
  278.  
  279. module ex_stage(new_pc, zero, aluResult, muxout, aluSrc, aluOp, regDst, pc, rs_in, rt_in, sign_extended_bit, rt, rd, clk);
  280.     output zero;
  281.     output [31:0] new_pc;
  282.     output [31:0] aluResult;
  283.     output [4:0] muxout;
  284.     input [31:0] pc;
  285.     input [2:0] aluOp;
  286.     input [31:0] rs_in, rt_in, sign_extended_bit ;
  287.     input clk, aluSrc, regDst;
  288.     input [4:0] rt, rd;
  289.     shift_add shiftadd(new_pc, pc, sign_extended_bit); //new_pc is the output of the adder
  290.     wire [31:0] selected_operand ;
  291.     mux_2x1_32b mux32(selected_operand, rt_in, sign_extended_bit, aluSrc); // selected_operand  is the value ouput of the mux
  292.     ALU alu(aluResult, zero, rs_in, selected_operand, aluOp, clk);
  293.     mux_2x1_5b mux5(muxout, rt, rd, regDst); //2x1MuxOut is the output of the lower mux
  294. endmodule
  295.  
  296. module main;
  297.     reg clk = 1'b0;
  298.     wire pcSrc = 1'b0;
  299.     wire [31:0] pc;
  300.     wire [31:0] instruction;
  301.     wire [31:0] offset;
  302.     wire regWrite, aluSrc, branch, memWrite, memRead, memtoReg, regDst;
  303.     wire [25:0] address;
  304.     wire [5:0] funct;
  305.     wire [15:0] immediate;
  306.     wire [4:0] rs;
  307.     wire [4:0] rt;
  308.     wire [4:0] rd;
  309.     wire [4:0] shamt;
  310.     wire [2:0] type;
  311.     wire [2:0] aluOp;
  312.     wire [31:0] pc_out, pc_in, read_data_1, read_data_2, sign_extended_bit, writeData;
  313.     wire [4:0] Rt_field, Rd_field;
  314.     wire [4:0] muxout;
  315.     wire [31:0] aluResult;
  316.    
  317.    
  318.     if_stage if_stage(pc, instruction, pcSrc, offset, clk);
  319.     id_stage id_stage(pcSrc, memToReg, regWrite, memWrite, branch, memRead, aluSrc, aluOp, regDst, pc_out, read_data_1, read_data_2, sign_extended_bit, rs, rt, rd, pc, instruction, writeData,clk);
  320.     ex_stage ex_stage(offset, zero, aluResult, muxout, aluSrc, aluOp, regDst, pc, read_data_1, read_data_2, sign_extended_bit, rt, rd, clk);
  321.    
  322.     initial #300 $finish;
  323.     initial
  324.         begin
  325.             repeat (1)
  326.             #10 clk = ~clk;
  327.         end
  328.    
  329.     initial
  330.     begin
  331.         $monitor("Clk:%d, PC:%d, I:%d, PCSrc: %d, memToReg: %d, regWrite: %d, memWrite: %d, branch: %d, memRead: %d, aluSrc: %d, aluOp: %d, regDst: %d, pc_out: %d, read_data_1: %d, read_data_2: %d, seb: %d, rs: %d, rt: %d, rd: %d, writedata: %d, offset: %d, zero: %d, result: %d, muxout: %d, aluSrc: %d",
  332.         clk, pc, instruction, pcSrc, memToReg, regWrite, memWrite, branch, memRead, aluSrc, aluOp, regDst, pc_out, read_data_1, read_data_2, sign_extended_bit, rs, rt, rd, writeData, offset, zero, aluResult, muxout, aluSrc);
  333.     end
  334.    
  335. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement