天天看點

乘法器的Verilog HDL實作

兩個N位二進制數x、y的乘積用簡單的方法計算就是利用移位操作來實作。

​​

乘法器的Verilog HDL實作

module multi_CX(clk, x, y, result);

    input clk;
    input [7:0] x, y;
    output [15:0] result;

    reg [15:0] result;

    parameter s0 = 0, s1 = 1, s2 = 2;
    reg [2:0] count = 0;
    reg [1:0] state = 0;
    reg [15:0] P, T;
    reg [7:0] y_reg;

    always @(posedge clk) begin
        case (state)
            s0: begin
                count <= 0;
P <= 0;
                y_reg <= y;
T <= {{8{1'b0}}, x};
                state <= s1;
end
s1: begin
if(count == 3'b111)
state <= s2;
else begin
if(y_reg[0] == 1'b1)
P <= P + T;
                    else
                        P <= P;
y_reg <= y_reg >> 1;
                    T <= T << 1;
count <= count + 1;
                    state <= s1;
end
end
s2: begin
result <= P;
                state <= s0;
end
default: ;
endcase
end

endmodule      
乘法器的Verilog HDL實作

乘法功能是正确的,但計算一次乘法須要8個周期。是以能夠看出串行乘法器速度比較慢、時延大。但這樣的乘法器的長處是所占用的資源是全部類型乘法器中最少的,在低速的信号進行中有着廣泛的應用。

2.流水線乘法器 

一般的高速乘法器通常採用逐位并行的疊代陣列結構,将每一個操作數的N位都并行地送出給乘法器。可是一般對于FPGA來講。進位的速度快于加法的速度,這樣的陣列結構并非最優的。是以能夠採用多級流水線的形式。将相鄰的兩個部分乘積結果再加到終于的輸出乘積上,即排成一個二叉樹形式的結構,這樣對于N位乘法器須要lb(N)級來實作。

乘法器的Verilog HDL實作
module multi_4bits_pipelining(mul_a, mul_b, clk, rst_n, mul_out);

    input [3:0] mul_a, mul_b;
    input       clk;
    input       rst_n;
    output [7:0] mul_out;

    reg [7:0] mul_out;

    reg [7:0] stored0;
    reg [7:0] stored1;
    reg [7:0] stored2;
    reg [7:0] stored3;

    reg [7:0] add01;
    reg [7:0] add23;

    always @(posedge clk or negedge rst_n) begin
        if(!rst_n) begin
            mul_out <= 0;
stored0 <= 0;
            stored1 <= 0;
stored2 <= 0;
            stored3 <= 0;
add01 <= 0;
            add23 <= 0;
end
else begin
stored0 <= mul_b[0]? {4'b0, mul_a} : 8'b0;
            stored1 <= mul_b[1]? {3'b0, mul_a, 1'b0} : 8'b0;
stored2 <= mul_b[2]? {2'b0, mul_a, 2'b0} : 8'b0;
stored3 <= mul_b[3]? {1'b0, mul_a, 3'b0} : 8'b0;

            add01 <= stored1 + stored0;
add23 <= stored3 + stored2;

            mul_out <= add01 + add23;
end
end

endmodule      
乘法器的Verilog HDL實作

從圖中能夠看出,流水線乘法器比串行乘法器的速度快非常多非常多,在非快速的信号進行中有廣泛的應用。至于快速信号的乘法一般須要利用FPGA晶片中内嵌的硬核DSP單元來實作。