aidanozo

Untitled

Nov 10th, 2024
26
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module sequential_multiplier #(
  2.     parameter p_data_width = 4
  3. )(
  4.     output wire [(2*p_data_width-1):0] o_w_out,
  5.     output wire [(p_data_width-1):0] o_w_disp_a,
  6.     output wire [(p_data_width-1):0] o_w_disp_b,
  7.     input wire [(p_data_width-1):0] i_w_a,
  8.     input wire [(p_data_width-1):0] i_w_b,
  9.     input wire i_w_clk,
  10.     input wire i_w_reset,
  11.     input wire i_w_write,
  12.     input wire i_w_multiply,
  13.     input wire i_w_display
  14. );
  15.  
  16.     wire l_w_a_we;
  17.     wire l_w_a_oe;
  18.     wire [(p_data_width-1):0] l_w_a_out;
  19.     register #(.p_data_width(p_data_width)) l_m_register_0 (
  20.         .o_w_out(l_w_a_out),
  21.         .o_w_disp_out(o_w_disp_a),
  22.         .i_w_clk(i_w_clk),
  23.         .i_w_reset(i_w_reset),
  24.         .i_w_in(i_w_a),
  25.         .i_w_we(l_w_a_we),
  26.         .i_w_oe(l_w_a_oe)
  27.     );
  28.  
  29.     wire l_w_b_we;
  30.     wire l_w_b_oe;
  31.     wire [(p_data_width-1):0] l_w_b_out;
  32.     register #(.p_data_width(p_data_width)) l_m_register_1 (
  33.         .o_w_out(l_w_b_out),
  34.         .o_w_disp_out(o_w_disp_b),
  35.         .i_w_clk(i_w_clk),
  36.         .i_w_reset(i_w_reset),
  37.         .i_w_in(i_w_b),
  38.         .i_w_we(l_w_b_we),
  39.         .i_w_oe(l_w_b_oe)
  40.     );
  41.    
  42.  
  43.     wire l_w_c_we;
  44.     wire l_w_c_oe;
  45.     wire [(2*p_data_width-1):0] l_w_c_out;
  46.     wire [(2*p_data_width-1):0] l_w_c_in;
  47.     assign l_w_c_in = (l_w_a_out * l_w_b_out);
  48.     register #(.p_data_width(2*p_data_width)) l_m_register_2 (
  49.         .o_w_out(l_w_c_out),
  50.         .i_w_clk(i_w_clk),
  51.         .i_w_reset(i_w_reset),
  52.         .i_w_in(l_w_c_in),
  53.         .i_w_we(l_w_c_we),
  54.         .i_w_oe(l_w_c_oe)
  55.     );
  56.  
  57.     localparam STATE_INITIAL = 2'd0;
  58.     localparam STATE_WRITE = 2'd1;
  59.     localparam STATE_MULTIPLY = 2'd2;
  60.     localparam STATE_DISPLAY = 2'd3;
  61.  
  62.     reg [1:0] l_r_state;
  63.     reg [1:0] l_r_next_state;
  64.  
  65.     always @(posedge i_w_clk) begin
  66.         if(i_w_reset == 1'b0) begin
  67.             l_r_state <= STATE_INITIAL;
  68.         end else begin
  69.             l_r_state <= l_r_next_state;
  70.         end
  71.     end
  72.  
  73.     always @(*) begin
  74.         l_r_next_state = i_w_write ?
  75.                             STATE_WRITE :
  76.                             (i_w_multiply ?
  77.                                 STATE_MULTIPLY :
  78.                                 (i_w_display ?
  79.                                     STATE_DISPLAY :
  80.                                     STATE_INITIAL));
  81.     end
  82.  
  83.     assign l_w_a_we = l_r_state == STATE_WRITE;
  84.     assign l_w_a_oe = l_r_state == STATE_MULTIPLY;
  85.     assign l_w_b_we = l_r_state == STATE_WRITE;
  86.     assign l_w_b_oe = l_r_state == STATE_MULTIPLY;
  87.     assign l_w_c_we = l_r_state == STATE_MULTIPLY;
  88.     assign l_w_c_oe = l_r_state == STATE_DISPLAY;
  89.  
  90.     assign o_w_out = l_w_c_out;
  91.  
  92. endmodule
Add Comment
Please, Sign In to add comment