Advertisement
vaz985

Untitled

May 26th, 2017
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.07 KB | None | 0 0
  1. module pipe(
  2.  
  3. input clk,// Para a placa
  4. input rst,
  5. output[31:0] out_valor1,
  6. output[31:0] out_valor2,
  7. output[31:0] out_valor3
  8. );
  9.  
  10. reg[31:0] decode_IR;
  11. reg[31:0] execute_IR;
  12. reg[31:0] memory_IR;
  13. reg[31:0] wback_IR;
  14.  
  15. reg [9:0] PC; // Contador de programa do MIPS
  16. reg [9:0] PC_decode;
  17. reg [9:0] PC_execute;
  18.  
  19. reg halt;
  20. reg jump_enable;
  21.  
  22. reg [31:0] IR; // Registrador de instrução do MIPS
  23.  
  24. wire [31:0] out_mem_inst; //saída da memória de instruções
  25. wire [31:0] out_mem_data; //saída da memória de dados
  26. wire signal_wren;
  27.  
  28. wire [4:0] signal_rd; // utilizado para "criar" o multiplexador que seleciona o registrador de destino do MIPS
  29. wire [31:0] signal_dado_a_ser_escrito; // utilizado para "criar" o multiplexador que seleciona qual dado será salvo no banco de registradores do MIPS
  30.  
  31. wire [31:0] dado_lido_1; // dado lido do banco de registardores
  32. wire [31:0] dado_lido_2; // dado lido do banco de registardores
  33.  
  34. wire [31:0] signal_reg_para_a_placa; // para a placa
  35.  
  36.  
  37. // DECODE
  38. reg[5:0] ex_opcode;
  39. reg[31:0] ex_a;
  40. reg[31:0] ex_b;
  41. reg[4:0] ex_dest;
  42. reg[25:0] ex_address;
  43. reg[31:0] ex_immediate;
  44. // EXECUTE
  45. reg[31:0] mem_saidaULA;
  46. reg[4:0] mem_dest;
  47. reg[31:0] mem_b;
  48. reg[5:0] mem_opcode;
  49. //
  50. reg[31:0] wb_write;
  51. reg[4:0] wb_dest;
  52.  
  53.  
  54. // instanciando a memória de instruções (ROM)
  55. mem_inst mem_i(.address(PC),
  56. .clock(clk),
  57. .q(out_mem_inst));
  58.  
  59. // instanciando a memória de dados (RAM)
  60. mem_data mem_d(.address(mem_saidaULA[9:0]),
  61. .clock(clk),
  62. .data(mem_b),
  63. .wren(signal_wren),
  64. .q(out_mem_data));
  65. //para a placa para a placa
  66.  
  67. // instanciando o banco de registardores
  68. banco_de_registradores br(.reset(rst),
  69. .br_in_clk(clk),
  70. .br_in_rs_decode(decode_IR[25:21]),
  71. .br_in_rt_decode(decode_IR[20:16]),
  72. .br_in_rd_decode(signal_rd),
  73. .br_in_data(wb_write),
  74. .br_out_R_rs(dado_lido_1),
  75. .br_out_R_rt(dado_lido_2));
  76.  
  77.  
  78. assign wb_enable = ( wback_IR[31:26] == 6'b000000 || wback_IR[31:26] == 6'b001000 ) ? 1 : 0 ;
  79. assign signal_wren = ( memory_IR[31:26] == 6'b101011 ) ? 1 : 0 ;
  80.  
  81. always@(posedge clk) begin
  82. if(rst == 1'b1) begin
  83. decode_IR <= 32'b0;
  84. PC <= 10'b0;
  85. halt <= 1'b1;
  86. jump_enable <= 0;
  87. end
  88. else
  89. begin
  90. if(halt == 1'b1) begin
  91. halt <= 1'b0;
  92. PC <= PC + 1;
  93. end
  94. else
  95. begin
  96. if(jump_enable == 0) begin
  97. PC <= PC + 1;
  98. PC_decode <= PC;
  99. decode_IR <= out_mem_inst;
  100. end
  101. else begin
  102. PC <= PC_execute;
  103. decode_IR <= out_mem_inst;
  104. end
  105. end
  106. end
  107.  
  108. //Decode
  109. if( decode_IR[31:26] == 6'b001000 || decode_IR[31:26] == 6'b100011 ) begin
  110. ex_dest <= decode_IR[20:16];
  111. end
  112. else begin
  113. ex_dest <= decode_IR[15:11];
  114. end
  115.  
  116. ex_a <= dado_lido_1;
  117. ex_b <= dado_lido_2;
  118.  
  119. ex_immediate <= {{16{decode_IR[15]}}, decode_IR[15:0]};
  120. execute_IR <= decode_IR;
  121.  
  122. //Execute
  123. if ( execute_IR[31:26] == 6'b000000 ) begin
  124. //ADD
  125. if ( execute_IR[5:0] == 6'b100000 ) begin
  126. mem_saidaULA <= ex_a + ex_b;
  127. mem_dest <= ex_dest;
  128. end
  129. //SUB
  130. else if ( execute_IR[5:0] == 6'b100010 ) begin
  131. mem_saidaULA <= ex_a - ex_b;
  132. mem_dest <= ex_dest;
  133. end
  134. end
  135. // ADDI
  136. else if ( execute_IR[31:26] == 6'b001000 ) begin
  137. mem_saidaULA <= ex_a + ex_immediate;
  138. mem_dest <= ex_dest;
  139. end
  140. //load
  141. else if( execute_IR[31:26] == 6'b100011 ) begin
  142. mem_saidaULA <= ex_a + ex_immediate;
  143. mem_dest <= ex_dest;
  144. end
  145. //store
  146. else if( execute_IR[31:26] == 6'b101011 ) begin
  147. mem_saidaULA <= ex_a + ex_immediate;
  148. mem_b <= ex_b;
  149. end
  150.  
  151. memory_IR <= execute_IR;
  152. //Fim execute
  153.  
  154. //Memory
  155.  
  156. if( memory_IR[31:26] == 6'b000000 || memory_IR[31:26] == 6'b001000 ) begin
  157. wb_write <= mem_saidaULA;
  158. wb_dest <= mem_dest;
  159. end
  160. if( memory_IR[31:26] == 6'b100011 ) begin
  161. wb_write <= out_mem_data;
  162. wb_dest <= mem_dest;
  163. end
  164.  
  165. wback_IR <= memory_IR;
  166. //Writeback
  167.  
  168.  
  169. end
  170. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement