Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2016
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.87 KB | None | 0 0
  1. module machine(clk, reset);
  2. input clk, reset;
  3.  
  4. wire [31:0] PC;
  5. wire [31:2] next_PC, PC_plus4, PC_target;
  6. wire [31:0] inst;
  7.  
  8. wire [31:0] imm = {{ 16{inst[15]} }, inst[15:0] }; // sign-extended immediate
  9. wire [4:0] rs = inst[25:21];
  10. wire [4:0] rt = inst[20:16];
  11. wire [4:0] rd = inst[15:11];
  12.  
  13. wire [4:0] wr_regnum;
  14. wire [2:0] ALUOp;
  15.  
  16. wire RegWrite, BEQ, ALUSrc, MemRead, MemWrite, MemToReg, RegDst, MFC0, MTC0, ERET;
  17. wire PCSrc, zero, negative;
  18. wire [31:0] rd1_data, rd2_data, B_data, alu_out_data, load_data, wr_data, old_wr_data;
  19.  
  20.  
  21. register #(30, 30'h100000) PC_reg(PC[31:2], next_PC[31:2], clk, /* enable */1'b1, reset);
  22. assign PC[1:0] = 2'b0; // bottom bits hard coded to 00
  23. adder30 next_PC_adder(PC_plus4, PC[31:2], 30'h1);
  24. adder30 target_PC_adder(PC_target, PC_plus4, imm[29:0]);
  25. mux2v #(30) branch_mux(next_PC, PC_plus4, PC_target, PCSrc);
  26. assign PCSrc = BEQ & zero;
  27.  
  28. instruction_memory imem (inst, PC[31:2]);
  29.  
  30. mips_decode decode(ALUOp, RegWrite, BEQ, ALUSrc, MemRead, MemWrite, MemToReg, RegDst, MFC0, MTC0, ERET,
  31. inst);
  32.  
  33. regfile rf (rd1_data, rd2_data,
  34. rs, rt, wr_regnum, wr_data,
  35. RegWrite, clk, reset);
  36.  
  37. mux2v #(32) imm_mux(B_data, rd2_data, imm, ALUSrc);
  38. alu32 alu(alu_out_data, zero, negative, ALUOp, rd1_data, B_data);
  39.  
  40. data_mem data_memory(load_data, alu_out_data, rd2_data, and1_out, and2_out, clk, reset);
  41.  
  42. mux2v #(32) wb_mux(old_wr_data, alu_out_data, load_data, MemToReg);
  43. mux2v #(5) rd_mux(wr_regnum, rt, rd, RegDst);
  44.  
  45.  
  46.  
  47. //wire modifications
  48. /* wire c0:wr_data;
  49. assign c0:wr_data = rd2_data;
  50.  
  51. wire t:data;
  52. assign t:data = rd2_data;
  53.  
  54. wire t:address;
  55. assign t:address = alu_out_data;*/
  56.  
  57. //datapath modification
  58. wire [31:0] hexWire;
  59. assign hexWire = 32'h80000180;
  60.  
  61. wire [29:0] eret_mux_out;
  62. wire [29:0] te_mux_out;
  63.  
  64.  
  65. wire and1_out, and2_out;
  66. wire [29:0] EPC;
  67.  
  68. wire TakenInterrupt;
  69. wire c0_rd_data;
  70. wire NotIO;
  71. wire TimerAddress;
  72. wire TimerInterrupt;
  73.  
  74.  
  75.  
  76. mux2v #(30) eret_mux(eret_mux_out, next_PC, EPC, ERET);
  77.  
  78. mux2v #(30) te_mux(te_mux_out, eret_mux_out, hexWire[31:2],TakenInterrupt);
  79.  
  80. mux2v #(32) wr_data_mux(wr_data, old_wr_data, c0_rd_data, MFC0 );
  81.  
  82.  
  83.  
  84. and a1(and1_out,MemRead, NotIO);
  85. and a2(and2_out, MemWrite, NotIO);
  86.  
  87. not n1(NotIO, TimerAddress);
  88.  
  89. //timer and cp0 at bottom of diagram
  90.  
  91. cp0 c1(c0_rd_data, EPC, TakenInterrupt,
  92. inst[15:11], rd2_data, next_pc, TimerInterrupt,
  93. MTC0, ERET, clock, reset);
  94.  
  95. timer tim1(TimerInterrupt, TimerAddress, load_data,
  96. alu_out_data, rd2_data, MemRead, MemWrite, clock, reset);
  97.  
  98.  
  99.  
  100.  
  101.  
  102.  
  103. endmodule // machine
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement