1. 程式人生 > 實用技巧 >基於移位相加法的乘法器的實現

基於移位相加法的乘法器的實現

先暫存

 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    [15
: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
View Code