专题三:乘法器(一)
乘法运算在数字信号处理中也是比较常用,如常系数FIR中需要输入数据与FIR系数进行乘法运算。在FPGA实现乘法时可选择采用逻辑实现,也可使用硬资源,如Xilinx FPGA中的DSP48。相比于逻辑实现的乘法器,采用DSP48实现的乘法器速度较块,但是个数有限,如果在DSP48资源比较紧缺时,则只能采用逻辑实现乘法器。
首先介绍一下逻辑实现乘法器的方法,最常用的是移位相加法,基于此方法本文介绍全并行结构和半并行结构的乘法器。
1.全并行结构
如图1所示为两个16位无符号数a、b的全并行乘法器结构。
图1
全并行结构乘法器并行输入数据a、b,直接进行移位并且累加,所有操作都在一个时钟周期完成,输出的数据速率可以与输入数据的相同,并且输入与输出只有一个时钟周期的延时,Verilog HDL代码如下:
module multiply_lut_FP
(
input clk,
input rst,
input [15:0] a,
input [15:0] b,
output reg [31:0] p
);
//one path
reg [15:0] a_in,b_in;
always@(posedge clk)
if(rst)
begin
a_in<=16'd0;
b_in<=16'd0;
end
else
begin
a_in<=a;
b_in<=b;
end
wire [31:0] p_tmp[0:15];
generate
genvar i;
for(i=0;i<16;i=i+1)
begin:bit_mult
assign p_tmp[i] = (b_in[i]==1'b1) ? ({16'd0,a_in})<
end
endgenerate
always@(posedge clk)