找回密码
 注册
关于网站域名变更的通知
查看: 699|回复: 4
打印 上一主题 下一主题

FPGA 中的有符号数乘法

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-7-30 09:23 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
FPGA中乘法器是很稀缺的资源,但也是我们做算法必不可少的资源。7系列及之前的FPGA都是25x18的DSP,UltraScale中是27x18,我们可以通过调IP Core的方式或者原语的方式来进行乘法操作。在里面可以设置有符号还是无符号数乘法。, b! \% y4 q( D, u9 L* n0 J
2 U, U( [3 B( `% P

8 q( u' z" d. ?" f6 x3 O4 I3 j; O

: _$ t: O2 J# K% }7 u
) o7 h  L+ S# c! W+ |
  C! C. c' p5 {6 \5 W4 a% P; w4 x : i1 ]7 U4 n) O5 n
+ J& S; ^8 b3 |; O. d

% I; y( h. v, S$ A1 j0 A! Y& L8 K9 [* |
7 i6 F8 w) L: i0 G$ F; e3 Q$ `
  当然,我们也可以直接使用*符合来进行乘法,对于无符号的乘法- c% X; \8 W7 Z8 J* c

* o9 \( b1 F: o: y9 f2 d/ Breg [7:0] ubyte_a;. Q: [9 ]. }# w9 y$ ?8 Z1 x; k
reg [7:0] ubyte_b;  _+ i$ M, N  `
(* use_dsp48="yes" *). q  m& l; K  [3 O) ~- O. X( W6 R9 d
output reg[15:0] u_res;
& ]$ Z7 U' x+ }' D8 J6 d6 O4 ?' D' q! o7 t/ D2 v- i) |
always @ ( posedge clk ) begin 6 [! l' U/ U" }! ?' }" A
    if(rst)2 J- \6 K4 T* A  ~. Q
        u_res <= 'b0;
5 ^) s; I8 w% G$ b5 p% r/ w    else
. s7 T9 v- d3 e* D8 j+ h        u_res <= ubyte_a * ubyte_b;* `$ \% F4 Z' F6 s5 [' S
end
* J; r3 h% t3 h: p2 H/ u; I  有符号乘法可以在Verilog中使用signed来标注。1 B; t& N5 Q9 y  ?7 @
4 m5 y* K* n3 g7 X
reg signed [7:0] byte_a;" n" I& j& N7 G% \4 u& F" o# i
reg signed [7:0] byte_b;
5 P/ t2 ?. f3 L& F/ Z/ ^5 a( c(* use_dsp48="yes" *), e0 ^+ ^, l) r1 ^
reg signed [15:0] res;; [3 c" N0 Y, O& O
1 Q$ n6 ^& W& s, I
always @ ( posedge clk ) begin ! t+ R+ @/ q- O3 P5 }: K: y
    if(rst)4 C" b% i8 B- V0 T
        res <= 'b0;6 _" m0 S, a9 A
    else: v+ F" L* a. S- ?/ r7 t$ S& @
        res <= byte_a * byte_b;
5 @+ e% Q9 |6 H/ @! W+ Tend
" |- C6 \3 H9 A0 B5 d4 p' [  当然我们也要理解有符号数乘法的原理,其实就是扩位乘法,把高位都补充为符号位。
/ w* R% p8 M3 H0 O' _6 K$ w* {3 a. \# b0 s! |" ^+ o
有符号数乘法:1 N- |# r! N) D* U: E

" s; i3 H9 |! j9 s* Y7 d. Ureg [7:0] ubyte_a;
% r7 {: T# _  c2 ?$ [" Lreg [7:0] ubyte_b;4 _9 K7 D" q. k5 v3 Q( M$ N
(* use_dsp48="yes" *)- F8 ?+ T3 u0 s+ ^
reg [15:0] res_manul;6 c/ S5 |9 O4 ?1 n/ F
0 E7 g$ K( x! x
always @ ( posedge clk ) begin1 N- n5 R' c. D' o% q
    if(rst)  I7 W$ t$ X& H6 i
        res_manul <= 'b0;6 H0 f3 T, j# k$ P6 I5 L
    else3 P4 {' d' y+ Y& f) X
        res_manul <= {{8{byte_a[7]}},ubyte_a} * {{8{ubyte_b[7]}},ubyte_b};  d7 o3 S" e. F, X# f; k+ Q& l
end
1 l5 v( ~3 o) V. ~3 R  关于乘法输出的位宽,我们知道,两个8bits的无符号数乘法,结果的位宽是16bits,但对于两个8bits有符号数的乘法,只要两个数不同时为-128,即二进制0b1000_0000,那么输出结果的高两位都是符号位,我们只需要取低15bits即可。因此,如果我们可以保证两个输入的乘数不会同时为有符号数所能表示的负数最小值,那么乘法结果的高两位都是符号位,只取其中一位即可。
$ b( K- Z; M( G/ s6 T

该用户从未签到

2#
发表于 2021-7-30 10:34 | 只看该作者
如果我们可以保证两个输入的乘数不会同时为有符号数所能表示的负数最小值,那么乘法结果的高两位都是符号位,只取其中一位即可。+ g5 _: ~; i1 m

该用户从未签到

3#
发表于 2021-7-30 13:19 | 只看该作者
FPGA中乘法器是很稀缺的资源,但也是我们做算法必不可少的资源
, C) F. M% T7 j8 M$ [* u
6 \+ w% D/ a; s
2 e+ Q7 B* I* |

该用户从未签到

4#
发表于 2021-7-30 13:29 | 只看该作者
当然我们也要理解有符号数乘法的原理,其实就是扩位乘法,把高位都补充为符号位。
5 N4 O& ~$ @" L$ e- Z# ^3 A9 j5 X
  • TA的每日心情
    奋斗
    2025-1-1 15:26
  • 签到天数: 584 天

    [LV.9]以坛为家II

    5#
    发表于 2021-8-2 15:03 | 只看该作者
    爱情里并没有谁错谁对
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-10-9 21:00 , Processed in 0.140625 second(s), 26 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表