17.定浮点数与有符号数

定点数

  FPGA中运算效率最高的就是截位,其次乘法也可以用DSP单元进行实现。所以除以一个数经常先乘以一个较大的数据然后做截位操作。比如在均值滤波的时候,需要除以9,这时候就可以先乘以7281,然后除以 2 16 2^{16} 216次方。可以近似等价于除以9

有符号数

  FPGA中的数据运算经常涉及到有符号数据。

module signed_calcu(

);
/*******************************************************************/
wire    [7:0]   a1          ;
wire    [7:0]   b1          ;

wire    [8:0]   c1_add      ;   //两数相加   最大位宽加1
wire    [15:0]  c1_mult     ;   //两数相乘   最大位宽相加

assign  a1  =   26      ;
assign  b1  =   105     ;

assign  c1_add      =   a1  + b1    ;
assign  c1_mult     =   a1  * b1    ;


/*******************************************************************/ 
wire    [7:0]   a2          ;
wire    [7:0]   b2          ;

wire    [8:0]   a2_s        ;
wire    [8:0]   b2_s        ;

wire    [8:0]   c2_add1     ;
wire    [8:0]   c2_add2     ;

wire    [15:0]  c2_mult1    ;
wire    [15:0]  c2_mult2    ;

assign  a2  =   -40     ;
assign  b2  =   200     ;

assign  a2_s    =   $signed (a2     ) ;  //使用系统函数将数据转化为有符号数
assign  a2_s    =   $signed (1'b0,b2) ;  //使用系统函数将数据转化为有符号数

assign  c2_add1     =   a2 + b2     ;   //不使用系统函数直接相加
assign  c2_add1     =   $signed(a2)     +   $signed({1'b0,b2});     //使用系统函数相加

assign  c2_mult1    =   a2 * b2     ;   //不使用系统函数相乘
assign  c2_mult2    =   $signed(a2) * $signed({1'b0,b2});  //

/*
    signed  系统函数会将数据的最高位复制下来放到最前面,他是不能直接识别真负数的
    如果不用系统函数,在verilog里面直接写负数会将其补码视为无符号整数,如 -40会被看作 216

*/

/*******************************************************************/ 
wire    [7:0]   a3          ;
wire    [7:0]   b3          ;

wire    [8:0]   a3_s        ;
wire    [8:0]   b3_s        ;

wire    [8:0]   c3_add1     ;
wire    [8:0]   c3_add2     ;

wire    [15:0]  c3_mult1    ;
wire    [15:0]  c3_mult2    ;

assign  a3  =   -40     ;
assign  b3  =   -200    ;

assign  a3_s    =   $signed (1'b0,a3) ;  //使用系统函数将数据转化为有符号数
assign  a3_s    =   $signed (1'b0,b3) ;  //使用系统函数将数据转化为有符号数

assign  c3_add1     =   a3 + b3     ;   //不使用系统函数直接相加
assign  c3_add1     =   $signed (1'b0,a3)     +   $signed({1'b0,b2});     //使用系统函数相加

assign  c2_mult1    =   a2 * b2     ;   //不使用系统函数相乘
assign  c2_mult2    =   $signed (1'b0,a3) * $signed({1'b0,b2});  //使用系统函数相乘


endmodule 




endmodule

相关推荐

  1. 17.点数符号

    2024-05-16 11:28:07       14 阅读
  2. C语言-整数点数:内存存储的差异

    2024-05-16 11:28:07       21 阅读
  3. 点数精度问题

    2024-05-16 11:28:07       38 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-16 11:28:07       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-16 11:28:07       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-16 11:28:07       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-16 11:28:07       20 阅读

热门阅读

  1. 代码随想录算法训练营第七天|

    2024-05-16 11:28:07       10 阅读
  2. JVM

    2024-05-16 11:28:07       10 阅读
  3. 第二天:深入部署与配置

    2024-05-16 11:28:07       12 阅读
  4. Unity3D 打造3D Astar寻路系统详解

    2024-05-16 11:28:07       17 阅读
  5. 创建空List的两种方法

    2024-05-16 11:28:07       9 阅读
  6. 在 CentOS 系统中升级 Python 版本

    2024-05-16 11:28:07       9 阅读
  7. GIN框架_模板渲染

    2024-05-16 11:28:07       10 阅读
  8. C++后端领域聚焦——存储系统和分布式系统

    2024-05-16 11:28:07       14 阅读
  9. NAT(网络地址转换)模式

    2024-05-16 11:28:07       10 阅读
  10. spring 约定优于配置 spring boot约定大于配置

    2024-05-16 11:28:07       12 阅读
  11. Springboot整合RabbitMq

    2024-05-16 11:28:07       12 阅读
  12. 【GoLang基础】函数体的注意事项和细节讨论

    2024-05-16 11:28:07       13 阅读
  13. Linux写个脚本执行一系列命令

    2024-05-16 11:28:07       10 阅读