【Verilog】32位单精度浮点数比较大小
参考链接
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位单精度浮点数比较大小相关推荐
- 32位单精度浮点数表示法
32位单精度浮点数表示法
- 32位单精度浮点数存储格式
32位单精度浮点数的存储格式: 其中s为符号位,占据1bit, f是由低23个bit组成的分数,最高位为0.5,然后是0.25,以此类推.e为2的指数幂,b为偏置(在32位单精度里b=127). 所以 ...
- 32位单精度浮点乘法器的FPGA实现
摘 要: 采用Verilog HDL语言, 在FPGA上实现了32位单精度浮点乘法器的设计, 通过采用改进型Booth编码,和Wallace 树结构, 提高了乘法器的速度.本文使用Altera Qua ...
- 32位十六进制浮点数转换为十进制浮点数的方法
--------------------------------------------- -- 时间:2019-01-11 -- 创建人:Ruo_Xiao -- 邮箱:xclsoftware@163 ...
- 用Keil验证8位和32位单片机变量占用空间大小
关注+星标公众号,不错过精彩内容 作者 | strongerHuang 微信公众号 | 嵌入式专栏 首先问大家两个问题: 8位单片机定义一个 int 型变量,占几个字节? 32位单片机定义一个 cha ...
- 有一个字长32位的浮点数符号位1位_边缘计算专题:(二)别看只有0和1,数学不好的勿进!...
一.二进制数与信息表示 1.概述 二进制的由来 德国最重要的自然科学家.数学家.物理学家.历史学家和哲学家,一个举世罕见的科学天才,和牛顿同为微积分的创建人--莱布尼兹. 在数学史上,西方史学家认为他 ...
- 单精度浮点数加法器电路设计
用VerilogHDL语言设计一个符合IEEE754标准的32位单精度浮点加法器. 1 背景知识 1.1 单精度浮点数 上图中S为符号位,S为1时表示负数,S为0时表示正数; Fraction代表尾数 ...
- C/C++中浮点数格式学习——以IEEE75432位单精度为例
这是浮点数的通常表示形式,在IEEE754中,单精度浮点数有如下形式: 32位单精度 单精度二进制小数,使用32个比特存储. 1 8 23位长 S Exp Fraction 31 30至23 偏正值( ...
- 浮点数与32位16进制互转(有代码)
今天调试一台设备时,在交互的Modbus协议中,设定数值位用的是浮点数. 带过那么多学生,我竟然脑袋一空??! Modbus用浮点型? 浮点型与U32互转? 于是硬着头皮,重新把这块的内容,复盘了一遍 ...
最新文章
- MO-LTR:基于单目RGB视频的多目标定位、跟踪与重建
- ScrollView的基本用法丶代理方法
- 主机排行网重大更新,移动端自适应
- 6999元!红魔6S Pro推出战地迷彩主题限定套装:11月1日正式开售
- Ping记录时间的方法
- 从Google Scholar看各大科技公司科研水平
- ICML'21 GNN的最新研究热点
- 浅议.NET、ASP.NET和C#的关系
- oracle 判断最后一笔_美股道琼斯日线杀跌一笔结束,向上一笔的反弹顺理成章。又到金秋弯腰拾金时...
- Android调用高德地图服务
- ReportMachine 3.0技巧
- Geometry-enhanced molecular representation learning for property prediction|GeoGNN|将几何增强分子表示用于分子性质预测
- 苹果计算机访问限制,苹果手机访问限制密码忘了怎么办
- 同态加密之Paillier算法
- vip.163邮箱登录指南,163vip邮箱体验分享
- 微信群满100人后无法扫码进群?你们要的解决方法来了!
- 易语言模拟器中控源码 全新手游模拟器通用中控源码, 适用于各种游戏, 源码现成的只需要更换游戏就可以用哦
- 一种基于知识图谱的新闻推荐模型
- linux shadow文件*,Linux怎么查找shadow文件进入这样几步轻松搞定
- 制作XPE启动光盘的教程