1. 序列乘法器
兩個n位二進位制數x、y的乘積用簡單的方法計算就是利用移位操作來實現。
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 <= }, x};
state <= s1;
ends1: 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;
endend
s2: begin
result <= p;
state <= s0;
enddefault: ;
endcase
endendmodule
乘法功能是正確的,但計算一次乘法需要8個週期。因此可以看出序列乘法器速度比較慢、時延大,但這種乘法器的優點是所占用的資源是所有型別乘法器中最少的,在低速的訊號處理中有著廣泛的應用。
2.流水線乘法器
一般的快速乘法器通常採用逐位並行的迭代陣列結構,將每個運算元的n位都並行地提交給乘法器。但是一般對於fpga來講,進製的速度快於加法的速度,這種陣列結構並不是最優的。所以可以採用多級流水線的形式,將相鄰的兩個部分乘積結果再加到最終的輸出乘積上,即排成乙個二叉樹形式的結構,這樣對於n位乘法器需要lb(n)級來實現。
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;
endelse begin
stored0 <= mul_b[0]? : 8'b0;
stored1 <= mul_b[1]? : 8'b0;
stored2 <= mul_b[2]? : 8'b0;
stored3 <= mul_b[3]? : 8'b0;
add01 <= stored1 + stored0;
add23 <= stored3 + stored2;
mul_out <= add01 + add23;
endend
endmodule
從圖中可以看出,流水線乘法器比序列乘法器的速度快很多很多,在非高速的訊號處理中有廣泛的應用。至於高速訊號的乘法一般需要利用fpga晶元中內嵌的硬核dsp單元來實現。 乘法器的Verilog HDL實現
1.序列乘法器 兩個n位二進位制數x y的乘積用簡單的方法計算就是利用移位操作來實現。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...
乘法器的Verilog HDL實現
color darkred size medium 1.序列乘法器 兩個n位二進位制數x y的乘積用簡單的方法計算就是利用移位操作來實現。size color 對應的hdl 為 module multi cx clk,x,y,result input clk input 7 0 x,y output...
乘法器的Verilog HDL實現
1.序列乘法器 兩個n位二進位制數x y的乘積用簡單的方法計算就是利用移位操作來實現。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...