Advertisement
Guest User

Untitled

a guest
Feb 25th, 2020
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.80 KB | None | 0 0
  1. module main #(parameter WL1 = 32, WL2 = 32, WL = 32, WLinput = 5, WLcon = 6, WLsign = 16, WLalu = 4)
  2. (
  3. output signed [WL-1:0] ALUout,
  4. output [WL-1:0] result
  5. );
  6. wire clk;
  7. wire rst;
  8. wire [((WL1 > WL2 ? WL1+1:WL2+1)-1):0] PCp1;
  9. wire [WL-1:0] PCbefore;
  10. wire [WL-1:0] PCBranch;
  11. wire PCsel;
  12. wire [WL-1:0] PCjump;
  13. wire [WL-1:0] PC;
  14.  
  15. wire [WLcon-1:0] opco,funct;
  16. wire zero, jump, RDsel, ALUnSel, branch, MWE, MRFSel; //control signal values from control unit
  17. wire [1:0] ALUop; //alu opcode from control unit
  18. wire RFWE;
  19. wire [3:0] ALUsel;
  20. wire [WL-1:0] ALUIn2;
  21. wire [WLalu:0] shamt;
  22.  
  23. wire [WL-1:0] D1,D2; //read data ports from register file, and write data from register file
  24. //address ports for output
  25. wire [WLinput-1:0] rs;
  26. wire [WLinput-1:0] rd;
  27. wire [WLinput-1:0] rt; //write address port from register file
  28. wire [WLinput-1:0] rtd;
  29. wire [WL-1:0] Jaddr;
  30.  
  31. //wire [WLinput-1:0] IMA; //5 bit input of address from instruction memory
  32. wire [WL-1:0] inst; //output 32 bit instruction from instruction memory
  33.  
  34. wire [WL-1:0] Simm;
  35. wire [WLsign-1:0] Imm; //variables for sign extension module
  36.  
  37. wire signed [WL-1:0] DMout;
  38. wire signed [WL-1:0] ALUDM;
  39.  
  40. clk c1(.clk(clk), .rst(rst)); //calling clock to start first rising edge
  41.  
  42. //mux #(.WL(WL)) mux0(
  43. PC #(.WL(WL)) p1(.clk(clk), .PC_input(PC), .PC_result(result)); //instantiating PC to 0
  44.  
  45. adder #(.WL1(WL1), .WL2(WL2), .WL0((WL1 > WL2 ? WL1+1:WL2+1))) a1(.x(result), .y(1), .out(PCp1));
  46. //pc is incremented by adder and the new address is written into th epC on the next rising edge of clk
  47.  
  48. instruction #(.WLinput(WLinput), .WL(WL)) in1(.IMA(result), .instruction(inst));
  49. //instruction memory takes in textfile with program counter giving the address point
  50.  
  51. assign opco = inst[31:26];
  52. assign funct = inst[5:0];
  53. control #(.WLcon(WLcon)) con1(.rst(rst), .opcode(opco), .RFWE(RFWE),.RFDsel(RDsel), .ALUInSel(ALUnSel), .Branch(branch), .DMWE(MWE), .MtoRFSel(MRFSel), .ALUop(ALUop), .ALUsel(ALUsel), .Jump(jump), .funct(funct));
  54.  
  55.  
  56. assign rs = inst[25:21]; //rs
  57. assign rt = inst[20:16];
  58. assign rd = inst[15:11];
  59. assign shamt = inst[10:6];
  60. assign Jaddr = inst[25:0];
  61. //RF_module #(.WL(WL), .WLinput(WLinput)) rf1(.RFRD1(D1), .RFRD2(D2), .RFRA1(rs), .RFRA2(rt), .WA(WA), .WD(WD), .rst(rst), .clk(clk), .WE(RFWE));
  62. //calling register file with instruction memory 5 bit read address, and write enable from control unit
  63.  
  64. assign Imm = inst[15:0];
  65. SIMM #(.WLsign(WLsign), .WL(WL)) sim1(.unextended(Imm), .extended(Simm));
  66. //sign extends the 16 bit immediate and puts into Simm
  67.  
  68. RF_module #(.WL(WL), .WLinput(WLinput)) rf1(.RFRD1(D1), .RFRD2(D2), .RFRA1(rs), .RFRA2(rt), .WA(rtd), .WD(ALUDM), .clk(clk), .rst(rst), .WE(RFWE));
  69.  
  70. adder #(.WL1(WL1), .WL2(WL2), .WL0((WL1 > WL2 ? WL1+1:WL2+1))) a2(.x(Simm), .y(PCp1), .out(PCBranch));
  71.  
  72. mux #(.WL(WL)) mux1(.in1(D2), .in2(Simm), .sel(ALUnSel), .out(ALUIn2));
  73.  
  74. ALU_module #(.WL(WL), .WLalu(WLalu)) alu1(.ALU_in1(D1), .ALU_in2(ALUIn2), .ALU_sel(ALUsel), .ALU_out(ALUout), .zero_or_nah(zero), .shamt(shamt));
  75. //alu generates a 32 bit ALUout and a ZERO FLAG THAT INDICATES WHERE ALUOUT == 0
  76. assign PCjump = {PCp1[31:26], Jaddr};
  77. assign PCsel = branch & zero;
  78. mux #(.WL(WL)) mux3(.in1(PCp1), .in2(PCBranch), .sel(PCsel), .out(PCbefore));
  79. mux #(.WL(WL)) mux5(.in1(PCbefore), .in2(PCjump), .sel(jump), .out(PC));
  80.  
  81. data #(.WL(WL), .WLinput(WLinput)) data1(.DMWD(D2), .DMWE(MWE), .clk(clk), .DMA(ALUout), .DMRD(DMout));
  82. //data is read from data memory onto DMRD ports then written back to destination register specified by rt
  83.  
  84. mux #(.WL(WL)) mux2(.in1(rt), .in2(rd), .sel(RDsel), .out(rtd));
  85. mux #(.WL(WL)) mux4(.in1(ALUout), .in2(DMout), .sel(MRFSel), .out(ALUDM));
  86. //load word
  87. //RF_module #(.WL(WL), .WLinput(WLinput)) rf2(.RFRD1(D1), .RFRD2(D2), .RFRA1(rs), .RFRA2(rt), .WA(rtd), .WD(ALUDM), .clk(clk), .rst(rst), .WE(RFWE));
  88.  
  89. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement