verilog 乘法_FPGA 中的有符号数乘法
FPGA中乘法器是很稀缺的资源,但也是我们做算法必不可少的资源。7系列及之前的FPGA都是25x18的DSP,UltraScale中是27x18,我们可以通过调IP Core的方式或者原语的方式来进行乘法操作。在里面可以设置有符号还是无符号数乘法。

当然,我们也可以直接使用*符合来进行乘法,对于无符号的乘法
reg [7:0] ubyte_a;reg [7:0] ubyte_b;(* use_dsp48="yes" *)output reg[15:0] u_res;always @ ( posedge clk ) begin if(rst) u_res <= 'b0; else u_res <= ubyte_a * ubyte_b;end
有符号乘法可以在Verilog中使用signed来标注。
reg signed [7:0] byte_a;reg signed [7:0] byte_b;(* use_dsp48="yes" *)reg signed [15:0] res;always @ ( posedge clk ) begin if(rst) res <= 'b0; else res <= byte_a * byte_b;end
当然我们也要理解有符号数乘法的原理,其实就是扩位乘法,把高位都补充为符号位。
有符号数乘法:
reg [7:0] ubyte_a;reg [7:0] ubyte_b;(* use_dsp48="yes" *)reg [15:0] res_manul;always @ ( posedge clk ) begin if(rst) res_manul <= 'b0; else res_manul <= {{8{byte_a[7]}},ubyte_a} * {{8{ubyte_b[7]}},ubyte_b};end
关于乘法输出的位宽,我们知道,两个8bits的无符号数乘法,结果的位宽是16bits,但对于两个8bits有符号数的乘法,只要两个数不同时为-128,即二进制0b1000_0000,那么输出结果的高两位都是符号位,我们只需要取低15bits即可。因此,如果我们可以保证两个输入的乘数不会同时为有符号数所能表示的负数最小值,那么乘法结果的高两位都是符号位,只取其中一位即可。
往期文章:
-
为什么推荐使用XPM?
-
FPGA资料分享
-
RAM IP Core中 Write First Read First和No Change的区别
-
__Vivado调试小结:ILA debug中的数据也许并不可信
-
FPGA复位的正确打开方式
-
如何使用Git进行Vivado工程的管理
-
大家一致避免使用的锁存器为什么依然存在于FPGA中?我们对锁存器有什么误解?
-
影响FPGA时序的进位链(Carry Chain), 你用对了么??
-
Virtex7 Microblaze下DDR3测试
-
Matlab高效编程技巧
-
生成Verilog HDL例化模板
-
DCM/DLL/PLL/MMCM区别
FPGA时序约束教程:
-
FPGA时序约束理论篇之建立保持时间
-
FPGA时序约束理论篇之时序路径与时序模型
3. FPGA时序约束理论篇之IO约束
4. FPGA时序约束理论篇之时钟周期约束
5. FPGA时序约束理论篇之两种时序例外
6. FPGA时序约束理论篇之xdc约束优先级
7. FPGA时序约束实战篇之梳理时钟树
8. FPGA时序约束实战篇之主时钟约束
9. FPGA时序约束实战篇之衍生时钟约束
10. FPGA时序约束实战篇之延迟约束
11. FPGA时序约束实战篇之伪路径约束
12. FPGA时序约束实战篇之多周期路径约束
13. Vivado时序约束辅助工具
14. FPGA时序约束之Tcl命令的对象及属性
