参考链接

32位单精度浮点数的IEEE表示法

问题描述

  在使用Verilog编写模块时,有时会需要进行多个浮点数中取最大/最小值的操作,而Vivado中提供的floating-point IP核并未提供取极值的相关操作。这里实现了一个float_max模块用于获取两个输入浮点数中的最大值。

C实现

    单精度浮点数比较大小的过程见float_max函数,这里在主函数中将float_max和max函数的输出结果进行了比较,用于保证float_max的正确性。


#include <stdio.h>
#include <math.h>float float_max(float a, float b) {unsigned int a_hex = *((unsigned int*)&a);unsigned int b_hex = *((unsigned int*)&b);unsigned int a_flag = a_hex & 0x80000000;unsigned int a_floor = a_hex & 0x7f800000;unsigned int a_tail = a_hex & 0x007fffff;unsigned int b_flag = b_hex & 0x80000000;unsigned int b_floor = b_hex & 0x7f800000;unsigned int b_tail = b_hex & 0x007fffff;if (a == b) {return a;//or b}else if (a != b && a_flag > b_flag) {return b;}else if (a != b && a_flag < b_flag) {return a;}else if (a != b && a_flag == b_flag && a_flag == 0 && a_floor > b_floor) {return a;}else if (a != b && a_flag == b_flag && a_flag == 0 && a_floor < b_floor) {return b;}else if (a != b && a_flag == b_flag && a_flag == 0 && a_floor == b_floor && a_tail > b_tail) {return a;}else if (a != b && a_flag == b_flag && a_flag == 0 && a_floor == b_floor && a_tail < b_tail) {return b;}else if (a != b && a_flag == b_flag && a_flag > 0 && a_floor > b_floor) {return b;}else if (a != b && a_flag == b_flag && a_flag > 0 && a_floor < b_floor) {return a;}else if (a != b && a_flag == b_flag && a_flag > 0 && a_floor == b_floor && a_tail > b_tail) {return b;}else if (a != b && a_flag == b_flag && a_flag > 0 && a_floor == b_floor && a_tail < b_tail) {return a;}return 0;
}float max(float a, float b) {if (a > b)return a;elsereturn b;
}int main()
{float a = 0;float b = 0;for (a = -10; a < 10; a += 0.01) {for (b = -10; b < 10; b += 0.01) {if (fabs(float_max(a,b) - max(a,b)) > 1e-3) {printf("%f %f %f %f\n", a, b, float_max(a,b), max(a,b));return 0;}}}printf("done:)");return 0;
}

Verilog实现

  在Vivado中,float_max函数可改写为如下代码:

module float_max #(localparam precision = 32
) (input  [31 : 0] a,input  [31 : 0] b,output [31 : 0] c
);wire            a_flag  = a[31];wire   [7 : 0]  a_floor = a[30 : 23];wire   [22 : 0] a_tail  = a[22 : 0];wire            b_flag  = b[31];wire   [7 : 0]  b_floor = b[30 : 23];wire   [22 : 0] b_tail  = b[22 : 0];wire            a_e_b = ~(| (a[31 : 0] ^ b[31 : 0]));//wire            a_flag_g_b_flag = a_flag & (~b_flag);wire            a_flag_l_b_flag = (~a_flag) & b_flag;wire            a_flag_e_b_flag = ~(a_flag ^ b_flag);wire            a_floor_g_b_floor = a_floor > b_floor ? 1 : 0;wire            a_floor_l_b_floor = a_floor < b_floor ? 1 : 0;wire            a_floor_e_b_floor = ~(| (a_floor[7 : 0] ^ b_floor[7 : 0]));wire            a_tail_g_b_tail = a_tail > b_tail ? 1 : 0;wire            a_tail_l_b_tail = a_tail < b_tail ? 1 : 0;//wire            a_tail_e_b_tail = ~(| (a_tail[22 : 0] ^ b_tail[22 : 0]));wire            condition1 = a_e_b;//wire            condition2 = ~a_e_b & a_flag_g_b_flag;wire            condition3 = ~a_e_b & a_flag_l_b_flag;wire            condition4 = ~a_e_b & a_flag_e_b_flag & (~a_flag) & a_floor_g_b_floor;//wire            condition5 = ~a_e_b & a_flag_e_b_flag & (~a_flag) & a_floor_l_b_floor;wire            condition6 = ~a_e_b & a_flag_e_b_flag & (~a_flag) & a_floor_e_b_floor & a_tail_g_b_tail;//wire            condition7 = ~a_e_b & a_flag_e_b_flag & (~a_flag) & a_floor_e_b_floor & a_tail_l_b_tail;//wire            condition8 = ~a_e_b & a_flag_e_b_flag & (a_flag) & a_floor_g_b_floor;                           wire            condition9 = ~a_e_b & a_flag_e_b_flag & (a_flag) & a_floor_l_b_floor;                           //wire            condition10= ~a_e_b & a_flag_e_b_flag & (a_flag) & a_floor_e_b_floor & a_tail_g_b_tail;         wire            condition11= ~a_e_b & a_flag_e_b_flag & (a_flag) & a_floor_e_b_floor & a_tail_l_b_tail;         assign c = (condition1 | condition3 | condition4 | condition6 | condition9 | condition11) ? a : b;
endmodule

本人刚刚接触Verilog开发,编写的代码可能存在错误,欢迎大佬批评指正。

【Verilog】32位单精度浮点数比较大小相关推荐

  1. 32位单精度浮点数表示法

    32位单精度浮点数表示法

  2. 32位单精度浮点数存储格式

    32位单精度浮点数的存储格式: 其中s为符号位,占据1bit, f是由低23个bit组成的分数,最高位为0.5,然后是0.25,以此类推.e为2的指数幂,b为偏置(在32位单精度里b=127). 所以 ...

  3. 32位单精度浮点乘法器的FPGA实现

    摘 要: 采用Verilog HDL语言, 在FPGA上实现了32位单精度浮点乘法器的设计, 通过采用改进型Booth编码,和Wallace 树结构, 提高了乘法器的速度.本文使用Altera Qua ...

  4. 32位十六进制浮点数转换为十进制浮点数的方法

    --------------------------------------------- -- 时间:2019-01-11 -- 创建人:Ruo_Xiao -- 邮箱:xclsoftware@163 ...

  5. 用Keil验证8位和32位单片机变量占用空间大小

    关注+星标公众号,不错过精彩内容 作者 | strongerHuang 微信公众号 | 嵌入式专栏 首先问大家两个问题: 8位单片机定义一个 int 型变量,占几个字节? 32位单片机定义一个 cha ...

  6. 有一个字长32位的浮点数符号位1位_边缘计算专题:(二)别看只有0和1,数学不好的勿进!...

    一.二进制数与信息表示 1.概述 二进制的由来 德国最重要的自然科学家.数学家.物理学家.历史学家和哲学家,一个举世罕见的科学天才,和牛顿同为微积分的创建人--莱布尼兹. 在数学史上,西方史学家认为他 ...

  7. 单精度浮点数加法器电路设计

    用VerilogHDL语言设计一个符合IEEE754标准的32位单精度浮点加法器. 1 背景知识 1.1 单精度浮点数 上图中S为符号位,S为1时表示负数,S为0时表示正数; Fraction代表尾数 ...

  8. C/C++中浮点数格式学习——以IEEE75432位单精度为例

    这是浮点数的通常表示形式,在IEEE754中,单精度浮点数有如下形式: 32位单精度 单精度二进制小数,使用32个比特存储. 1 8 23位长 S Exp Fraction 31 30至23 偏正值( ...

  9. 浮点数与32位16进制互转(有代码)

    今天调试一台设备时,在交互的Modbus协议中,设定数值位用的是浮点数. 带过那么多学生,我竟然脑袋一空??! Modbus用浮点型? 浮点型与U32互转? 于是硬着头皮,重新把这块的内容,复盘了一遍 ...

最新文章

  1. MO-LTR:基于单目RGB视频的多目标定位、跟踪与重建
  2. ScrollView的基本用法丶代理方法
  3. 主机排行网重大更新,移动端自适应
  4. 6999元!红魔6S Pro推出战地迷彩主题限定套装:11月1日正式开售
  5. Ping记录时间的方法
  6. 从Google Scholar看各大科技公司科研水平
  7. ICML'21 GNN的最新研究热点
  8. 浅议.NET、ASP.NET和C#的关系
  9. oracle 判断最后一笔_美股道琼斯日线杀跌一笔结束,向上一笔的反弹顺理成章。又到金秋弯腰拾金时...
  10. Android调用高德地图服务
  11. ReportMachine 3.0技巧
  12. Geometry-enhanced molecular representation learning for property prediction|GeoGNN|将几何增强分子表示用于分子性质预测
  13. 苹果计算机访问限制,苹果手机访问限制密码忘了怎么办
  14. 同态加密之Paillier算法
  15. vip.163邮箱登录指南,163vip邮箱体验分享
  16. 微信群满100人后无法扫码进群?你们要的解决方法来了!
  17. 易语言模拟器中控源码 全新手游模拟器通用中控源码, 适用于各种游戏, 源码现成的只需要更换游戏就可以用哦
  18. 一种基于知识图谱的新闻推荐模型
  19. linux shadow文件*,Linux怎么查找shadow文件进入这样几步轻松搞定
  20. 制作XPE启动光盘的教程

热门文章

  1. oracle adf 数据validation,ORACLE ADF 问题总结
  2. 跨越50年历史河流,带你走进贝尔实验室,一探UNIX起源
  3. 发布Android应用程序过程
  4. 二维码智能巡检系统让电站设备巡检更智能
  5. 智能媒体、大数据与知识发现国际会议(IMBDKM 2023)诚邀学者关注、参与
  6. 【C语言】笔记:输入身份证号,输出出生年月
  7. 爱企查 爬取公司基本信息
  8. Java根据PDF表单模板和CSV表格批量生成证书等文件
  9. Excel使用VBA合并单列、多列单元格
  10. java zmq订阅_java zmq消息队列