Advertisement
aidanozo

Untitled

Dec 6th, 2024
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. `timescale 1ns / 1ps
  2.  
  3. module Execute #(
  4.     parameter p_data_width = 16
  5. )(
  6.     output [p_data_width-1:0] out_t1, // ALU output
  7.     input [p_data_width-1:0] i_ir, // RI code
  8.     input [p_data_width-1:0] i_t1, // T1 value
  9.     input [p_data_width-1:0] i_t2, // T2 value
  10.     input i_w_clk, // Clock
  11.     input i_w_reset, // Reset
  12.     input i_w_write_t1, // T1 Write Enable
  13.     input i_w_write_t2, // T2 Write Enable
  14.     input i_w_carry // Carry
  15.     );
  16.    
  17.     localparam ADC  = 4'd0;
  18.     localparam AND  = 4'd1;
  19.     localparam OR   = 4'd2;
  20.     localparam SHL  = 4'd3;
  21.     localparam SHR  = 4'd4;
  22.     localparam SAR  = 4'd5;
  23.    
  24.     wire l_w_t1_we;
  25.     wire l_w_t1_oe;
  26.     wire [p_data_width-1:0] l_w_t1_out;
  27.    
  28.     register #(.p_data_width(p_data_width)) instanta_t1(
  29.         .o_w_out(l_w_t1_out),
  30.         .i_w_clk(i_w_clk),
  31.         .i_w_reset(i_w_reset),
  32.         .i_w_in(i_t1),
  33.         .i_w_we(l_w_t1_we),
  34.         .i_w_oe(l_w_t1_oe)
  35.     );
  36.    
  37.     wire l_w_t2_we;
  38.     wire l_w_t2_oe;
  39.     wire [p_data_width-1:0] l_w_t2_out;
  40.    
  41.     register #(.p_data_width(p_data_width)) instanta_t2(
  42.         .o_w_out(l_w_t2_out),
  43.         .i_w_clk(i_w_clk),
  44.         .i_w_reset(i_w_reset),
  45.         .i_w_in(i_t2),
  46.         .i_w_we(l_w_t2_we),
  47.         .i_w_oe(l_w_t2_oe)
  48.     );
  49.    
  50.     wire [3:0] l_w_opcode;
  51.     wire l_w_alu_oe;
  52.    
  53.     ALU alu(
  54.     .o_w_out(out_t1),
  55.     .i_w_in1(l_w_t1_out),
  56.     .i_w_in2(l_w_t2_out),
  57.     .i_w_opcode(l_w_opcode),
  58.     .i_w_carry(i_w_carry),
  59.     .i_w_oe(l_w_alu_oe)
  60.     );
  61.    
  62.     localparam STATE_INITIAL = 3'd0;
  63.     localparam STATE_T1_WRITE = 3'd1;
  64.     localparam STATE_T2_WRITE = 3'd2;
  65.     localparam STATE_T_OUT = 3'd3;
  66.     localparam STATE_ALU_EXEC = 3'd4;
  67.     localparam STATE_ALU_OUT = 3'd5;
  68.     localparam STATE_RESTART = 3'd6;
  69.  
  70.     reg [2:0] l_r_state;
  71.     reg [2:0] l_r_next_state;
  72.    
  73.     // Sequential block
  74.     always @(posedge i_w_clk) begin
  75.         if(i_w_reset == 1'b0) begin
  76.             l_r_state <= STATE_INITIAL;
  77.         end else begin
  78.             l_r_state <= l_r_next_state;
  79.         end
  80.     end
  81.    
  82.     // Auxiliary reg variables
  83.     reg l_r_t1_we;
  84.     reg l_r_t1_oe;
  85.     reg l_r_t2_we;
  86.     reg l_r_t2_oe;
  87.     reg [3:0] l_r_opcode;
  88.     reg l_r_alu_oe;
  89.    
  90.     // Combinational block
  91.     always @(*) begin
  92.         case(l_r_state)
  93.             // Initial state
  94.             STATE_INITIAL:
  95.                 if (i_w_write_t1) begin
  96.                     l_r_next_state = STATE_T1_WRITE;
  97.                 end
  98.                 else begin
  99.                     l_r_next_state = STATE_INITIAL;
  100.                 end
  101.             // Input value is written into T1    
  102.             STATE_T1_WRITE: begin
  103.                 l_r_t1_we = 1;
  104.                 // Verify the number of operands
  105.                 if (i_ir[1] == 1) begin
  106.                     if (i_w_write_t2) begin
  107.                         l_r_next_state = STATE_T2_WRITE;
  108.                      end
  109.                      else begin
  110.                         l_r_next_state = STATE_T1_WRITE;
  111.                      end
  112.                  end
  113.                  else begin
  114.                     l_r_next_state = STATE_T_OUT;
  115.                  end
  116.              end
  117.              // [Optional] Input value is written into T2
  118.              STATE_T2_WRITE: begin
  119.                 l_r_t2_we = 1;
  120.                 l_r_next_state = STATE_T_OUT;
  121.              end
  122.              // T1 and T2 output signals are enabled
  123.              STATE_T_OUT: begin
  124.                 l_r_t1_oe = 1;
  125.                 l_r_t2_oe = 1;
  126.                 l_r_next_state = STATE_ALU_EXEC;
  127.              end
  128.              // T1 and T2 output signals are disabled and the correct value is assigned to the OPCODE
  129.              STATE_ALU_EXEC: begin
  130.                 l_r_t1_oe = 0;
  131.                 l_r_t2_oe = 0;
  132.                 if (!i_ir[1]) begin
  133.                     // Operation code verification
  134.                     case(i_ir[6:4])
  135.                         3'b100: begin
  136.                             l_r_opcode = 4'd3;
  137.                         end
  138.                         3'b101: begin
  139.                             l_r_opcode = 4'd4;
  140.                         end
  141.                         3'b110: begin
  142.                             l_r_opcode = 4'd5;
  143.                         end
  144.                     endcase
  145.                 end
  146.                 else begin
  147.                     // Operation code verification
  148.                     case(i_ir[6:4])
  149.                         3'b001: begin
  150.                             l_r_opcode = 4'd0;
  151.                         end
  152.                         3'b100: begin
  153.                             l_r_opcode = 4'd1;
  154.                         end
  155.                         3'b101: begin
  156.                             l_r_opcode = 4'd2;
  157.                         end
  158.                     endcase
  159.                 end
  160.                 l_r_next_state = STATE_ALU_OUT;
  161.              end
  162.              // ALU output signal is enabled
  163.              STATE_ALU_OUT: begin
  164.                 l_r_alu_oe = 1;
  165.                 l_r_next_state = STATE_RESTART;
  166.              end
  167.              // ALU output signal is disabled and the loop restarts
  168.              STATE_RESTART: begin
  169.                 l_r_alu_oe = 0;
  170.                 l_r_next_state = STATE_INITIAL;
  171.              end                
  172.         endcase    
  173.     end
  174.    
  175.     // Assign auxiliary reg variables to wires
  176.     assign l_w_t1_we = l_r_t1_we;
  177.     assign l_w_t1_oe = l_r_t1_oe;
  178.     assign l_w_t2_we = l_r_t2_we;
  179.     assign l_w_t2_oe = l_r_t2_oe;
  180.     assign l_w_opcode = l_r_opcode;
  181.     assign l_w_alu_oe = l_r_alu_oe;
  182.    
  183. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement