本文转载自:FPGA入门到精通微信公众号
FPGA开发中遇到乘法运算的概率非常高,不管是信号处理,还是图像处理,都需要掌握F乘法运算的使用方法。
今天我们就来聊一聊“FPGA中乘法运算的N种实现方式”。
一、直接使用乘法符“*”
直接在verilog代码中调用乘法符“*”,剩下的就让编译器自动判断和优化,决定最终是用LUT还是硬件乘法器DSP实现。
如果明确要求使用“硬件乘法器DSP”,则可以在寄存器变量声明前面,添加“(* use_dsp48 = "yes" * )”,如下:
wire [11:0] a, b;
(* use_dsp48="yes" *) wire [23:0] sum;
assign sum = a*b;
这种方法的优点是写起代码简单,易移植代码,推荐使用该方式。
注意事项:
(1)存储乘法运算结果的寄存器位宽,等于2个乘数的位宽之和。
(2)建议乘法运算结果再打一拍,至少保持2个周期的延迟,改善代码时序,可兼容更高时钟频率下运行。
二、调用乘法器IP“Multiplier”
xilinx乘法器IP支持有符号数和无符号数,也有两种资源消耗模式可选,一个是“使用LUT”,一个是“使用硬件乘法器DSP”。
1、打开IP
在vivado中打开IP库“IP Catalog”,选择“Multiplier”
2、basic界面配制参数
Multiplier Type:
Parallel Multiplier:并行乘法器。
Constant Coefficient Multiplier:恒定系数乘法器。
Input Options:
Data Type:Signed有符号数、 Unsigned无符号数。
Width:操作数位宽。
Multiplier Construction: 使用LUT或乘法器DSP。
Optimization Options:Area Optimized 资源优先或Speed Optimized速度优先。
3、Output and Control 输出控制界面
Output Product Range:
Use Custom Output Width:自定义输出宽度。
Pipelining and Control Signals:
Pipeline Stages: 流水线级数选择
Clock Enable:时钟使能。
Synchronous Clear: 同步清除。
SCLR/CE Priority: 设置SCLR引脚和CE引脚的优先级。
三、小结
FPGA开发中,优先推荐使用DSP资源,如果DSP资源有限时,可考虑使用LUT资源实现,可以使用Multiplier这个IP,也可以考虑自己写。