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

FPGA设计中的加法乘法

[复制链接]
  • TA的每日心情
    开心
    2019-11-19 15:19
  • 签到天数: 1 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2019-5-31 09:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

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

    x
    FPGA设计中的加法乘法

    , l* F  t" H: k) f  ~. C) ]/ B/ y: j0 c  V6 d
        加减乘,在fpga设计中,使用verilog hdl语言来描述,简单的很,直接就是+、-、*,没有任何疑问,但是计算过程中的信号的位宽,却值得认真揣摩。; W7 S) s, A' Q, D" I
    7 `9 n3 l2 K+ p. r( `2 t
        数学运算,必然涉及到有符号数与无符号数的区别,因此在写hdl代码时,必须明确参与运算的信号是否是有符号数。建议:参与运算的符号要么都是有符号数,要么都是无符号数,不建议使用有符号数与无符号数进行数学运算,如果在参与运算的两个信号一个是有符号数,而另外一个是无符号数的话,建议把无符号数扩展一位,将其转换成有符号数来进行处理。& |% y3 R3 }- H
        无符号数扩展成有符号数的方法(以verilog为例):' s' u, ]8 |2 v( h! H% c7 v
        input [7:0] data;
    . B% h& P$ N' b" Z+ }( r; M+ h9 k    wire  [8:0] data_r;
    9 s: Z$ z8 c8 m* [6 ?2 ~* N! S  Z    assign data_r = {data[7],data};
    * C2 G" Z  D. z1 m0 S6 J* A: X' y0 W! H
        加法运算中的位宽处理:$ a( k9 e# c1 u1 l
        input [7:0] data_a;6 r" a: v( c9 {- p$ P
        input [7:0] data_b;
    4 s1 N8 d* M* A6 K& t" N- }! i    output [8:0] data_x;
    * w7 C% [+ \' ~! j+ O9 F  h    wire [8:0] data_x;( W% [0 s( S0 c8 L% {
        assign data_x = data_a + data_b;# [1 d% f# K- i2 x% c" B( Y
        如上面的代码,在做加法运算的时候,建议:
    3 ?# ^0 Q# T# ^; A    1、加法运算符两边的信号,位宽一致;6 V9 H& N" @) h5 V/ L. w. F
        2、加法运算符两边的信号,要么都是有符号数,要么都是无符号数;! ]; u+ V+ p+ l; v1 Q1 T
        2、考虑到加法可能产生进位,输出信号比输入信号多1bit即可。
    5 p* a! n) E- X- Z6 g
    - v  K% Y( X; Z! _- ?( S7 }* ]    乘法运算中的位宽处理:- a) X) U' i: m; c; @5 B( H
        1. 两个无符号数相乘: t8 X, q3 |3 h3 Z1 ?8 V
        input [7:0] data_a;
    0 w7 o. W- ^- X    input [4:0] data_b;7 K  @4 f& E6 e6 Q! R' k
        output [12:0] data_x;$ G" R9 a+ N5 [' ^2 {  f9 U* K
        wire   [12:0] data_x;4 _( P6 M- z. I  @( `* J" O; N
        assign data_x = data_a * data_b;
    2 y3 U0 H" h- v. o    两个无符号数相乘,输出信号位宽直接定义成两个输入信号位宽之和即可。) m+ r+ e; E! k! \3 \
       
    7 f. J! a4 s% ]- y, k    2. 两个有符号数相乘. \+ U2 e& x4 ^# u8 B
        reg signed [7:0] data_a;
    7 ^$ V$ m( V7 R" X2 l$ C9 \    reg signed [4:0] data_b;
    ! B# D) R+ K* a, }( M0 ~. h    output [12:0] data_x;9 L( W) ]" G# A! e) ?3 [: G
        wire signed  [11:0] data_x;7 x+ ^. ^  L# Z! S
        assign data_x = data_a * data_b;$ g# [, w3 e4 D
        两个有符号数相乘,考虑到符号位可以合并成一位,输出信号位宽定义成两个输入信号位宽之和-1即可。
    / [. K6 F; f# p: ~, c3 t, |2 G  t# D' y* U! w- Y* |
        3. 平方运算
    8 y; J  m6 w7 R# B9 T    如果输入信号是无符号数,则输出信号位宽等于输入信号位宽2倍;
    2 d; L* B3 R5 v! {+ Z: v  U    如果输入信号是有符号数,则输出信号位宽等于输入信号位宽2倍-2
    # F! P: i2 k) f" v# i% k/ L& B! [; L2 r* z3 f1 y+ r

    9 `, H/ X2 I$ i0 f( L3 O" J" |2 G- V/ D% j0 V, K  D6 a- u* h( }

    该用户从未签到

    2#
    发表于 2019-5-31 16:00 | 只看该作者
    发帖是心得 回帖是美德
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-8-4 10:06 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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