基於移位相加法的乘法器的實現
阿新 • • 發佈:2020-07-19
先暫存
1 module mul_add( 2 input sclk , 3 input s_rst_n , 4 5 //input start , 6 input [7:0] x , // 乘數 7 input [7:0] y , // 被乘數 8 9 output reg [15View Code:0] result 10 ); 11 12 //========================================================================\ 13 // =========== Define Parameter and Internal signals =========== 14 //========================================================================/ 15 reg [7:0] cnt ;16 reg [15:0] x_r ; // 乘數的中間變數 17 reg [7:0] y_r ; // 被乘數的中間變數 18 reg [15:0] result_r ; // 運算結果的中間變數 19 reg [2:0] state ; // 20 21 parameter S0 = 3'd0 ; 22 parameter S1 = 3'd1 ; 23 parameter S2 = 3'd2 ; 24 25 //============================================================================= 26 //**************************** Main Code ******************************* 27 //============================================================================= 28 29 30 31 always @ (posedge sclk or negedge s_rst_n) begin 32 if(s_rst_n == 1'b0) begin 33 result <= 0; 34 cnt <= 0; 35 y_r <= 0; 36 state <= S0; 37 end 38 else begin 39 case(state) 40 S0:begin 41 x_r <= {8'd0,x}; 42 y_r <= y; 43 cnt <= 0; 44 result_r <= 0; 45 state <= S1; 46 end 47 48 S1:begin 49 if(cnt == 7) 50 state <= S2; 51 else begin 52 if(y_r[0] == 1'b1) 53 result_r <= result_r + x_r; // 和左移零位相似 54 else 55 result_r <= result_r; 56 y_r <= y_r >> 1; // 被乘數右移一位 57 x_r <= x_r << 1; // 乘加一次後,被乘數左移一位 58 cnt <= cnt + 1'b1; 59 state <= S1; 60 end 61 end 62 63 S2:begin 64 result <= result_r; 65 state <= S0; 66 end 67 default:; 68 endcase 69 end 70 end 71 endmodule