在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2268|回复: 2

[转贴] FPGA 中的有符号数乘法

[复制链接]
发表于 2020-2-16 09:56:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
原创:猫叔 来源:科学计算technomania

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

882181576a3942e9b708c1f511508e47.jpg

当然,我们也可以直接使用*符合来进行乘法,对于无符号的乘法





  1. reg [7:0] ubyte_a;
  2. reg [7:0] ubyte_b;
  3. (* use_dsp48="yes" *)
  4. output reg[15:0] u_res;
  5. always @ ( posedge clk ) begin
  6. if(rst)
  7. u_res <= 'b0;
  8. else
  9. u_res <= ubyte_a * ubyte_b;
  10. end


复制代码

有符号乘法可以在verilog中使用signed来标注。




  1. reg signed [7:0] byte_a;
  2. reg signed [7:0] byte_b;
  3. (* use_dsp48="yes" *)
  4. reg signed [15:0] res;
  5. always @ ( posedge clk ) begin
  6. if(rst)
  7. res <= 'b0;
  8. else
  9. res <= byte_a * byte_b;
  10. end


复制代码

当然我们也要理解有符号数乘法的原理,其实就是扩位乘法,把高位都补充为符号位。

有符号数乘法:




  1. reg [7:0] ubyte_a;
  2. reg [7:0] ubyte_b;
  3. (* use_dsp48="yes" *)
  4. reg [15:0] res_manul;
  5. always @ ( posedge clk ) begin
  6. if(rst)
  7. res_manul <= 'b0;
  8. else
  9. res_manul <= {{8{byte_a[7]}},ubyte_a} * {{8{ubyte_b[7]}},ubyte_b};
  10. end


复制代码

关于乘法输出的位宽,我们知道,两个8bits的无符号数乘法,结果的位宽是16bits,但对于两个8bits有符号数的乘法,只要两个数不同时为-128,即二进制0b1000_0000,那么输出结果的高两位都是符号位,我们只需要取低15bits即可。因此,如果我们可以保证两个输入的乘数不会同时为有符号数所能表示的负数最小值,那么乘法结果的高两位都是符号位,只取其中一位即可。

发表于 2020-2-23 14:00:56 | 显示全部楼层
那么乘法结果的高两位都是符号位,只取其中一位即可。
发表于 2022-1-1 09:51:10 | 显示全部楼层
那要是遇到两个有符号数都是-128,该咋整?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-2 00:17 , Processed in 0.018995 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表