乘法器的Verilog HDL實現

2021-08-25 15:07:29 字數 2524 閱讀 7524

[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 [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

對應的功能**圖為:

[img]

[color=darkred][size=medium]乘法功能是正確的,但計算一次乘法需要8個週期。因此可以看出序列乘法器速度比較慢、時延大,但這種乘法器的優點是所占用的資源是所有型別乘法器中最少的,在低速的訊號處理中有著廣泛的應用。

疑問:功能**圖顯示延遲不止8個時鐘週期,不知道是為什麼?。。。[/size][/color]

[color=darkred][size=medium]2.流水線乘法器

一般的快速乘法器通常採用逐位並行的迭代陣列結構,將每個運算元的n位都並行地提交給乘法器。但是一般對於fpga來講,進製的速度快於加法的速度,這種陣列結構並不是最優的。所以可以採用多級流水線的形式,將相鄰的兩個部分乘積結果再加到最終的輸出乘積上,即排成乙個二叉樹形式的結構,這樣對於n位乘法器需要lb(n)級來實現。[/size][/color]

下面是用verilog hdl實現乙個4位的流水線乘法器:

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

功能**圖為:

[img]

[color=darkred][size=medium]從圖中可以看出,流水線乘法器比序列乘法器的速度快很多很多,在非高速的訊號處理中有廣泛的應用。至於高速訊號的乘法一般需要利用fpga晶元中內嵌的硬核dsp單元來實現。[/size][/color]

乘法器的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實現

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實現

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...