关于FPGA的浮点数处理 II

关于FPGA的浮点数处理 II

语言 :Verilg HDL 、VHDL
EDA工具:ISE、Vivado、Quartus II

      • 关于FPGA的浮点数处理 II
      • 一、引言
      • 二、浮点数运算的FPGA实现
        • 1. 有符号数整数转单精度浮点数
          • (1)实现代码(Int2Fp模块)
          • (2)代码分析
        • 2. 单精度浮点数转有符号数整数
          • (1)实现代码(Fp2Int模块)
          • (2)代码分析
        • 三、结尾

  • 关键词: 调用,浮点数处理,floating point

一、引言

在FPGA中实现浮点运算是一个复杂但有用的过程,因为浮点运算在许多应用中都是必需的,如数字信号处理、图像处理和科学计算等,上篇博客中介绍了在FPGA中使用浮点数运算的背景以及实现方式,传送链接:0315 FPGA的浮点数处理 I,本篇博客注重描述浮点数在FPGA中如何将有符号整数与单精度浮点数进行转换。

二、浮点数运算的FPGA实现

1. 有符号数整数转单精度浮点数
(1)实现代码(Int2Fp模块)
 module Int2Fp(input signed [15:0]	iInteger,output[26:0]	oA		);// output fieldswire        A_s;wire [7:0]  A_e;wire [17:0] A_f;wire [15:0] abs_input ;// get output sign bitassign A_s = (iInteger < 0);// remove sign from inputassign abs_input = (iInteger < 0)? -iInteger : iInteger ;// find the most significant (nonzero) bitwire [7:0]  shft_amt;assign shft_amt = abs_input[15] ? 8'd3 :abs_input[14] ? 8'd4 : abs_input[13] ? 8'd5 :abs_input[12] ? 8'd6 : abs_input[11] ? 8'd7 :abs_input[10] ? 8'd8 : abs_input[9]  ? 8'd9 :abs_input[8]  ? 8'd10 : abs_input[7]  ? 8'd11 :abs_input[6]  ? 8'd12 : abs_input[5]  ? 8'd13 :abs_input[4]  ? 8'd14 : abs_input[3]  ? 8'd15 :abs_input[2]  ? 8'd16 : abs_input[1]  ? 8'd17 :abs_input[0]  ? 8'd18 : 8'd19;	// exponent 127 + (18-shift_amt)// 127 is 2^0// 18 is amount '1' is shiftedassign A_e = 127 + 18 - shft_amt ;// where the intermediate value is formedwire [33:0] shift_buffer ;// remember that the high-order '1' is not stored,// but is shifted to bit 18assign shift_buffer = {16'b0, abs_input} << shft_amt ;assign A_f = shift_buffer[17:0];assign oA = (iInteger==0)? 27'b0 : {A_s, A_e, A_f};endmodule //Int2Fp
(2)代码分析

Int2Fp模块的作用是将一个16位的有符号整数(iInteger)转换为一个27位的浮点数(oA)。这个转换遵循IEEE 754标准的单精度浮点数格式,其中包含符号位(1位)、指数位(8位)和尾数位(或称为小数位,17位)。

对代码分析:

1、模块声明: 定义了模块名Int2Fp,输入输出端口。
2、输入输出定义: iInteger是一个16位有符号整数,oA是一个27位的输出,包含符号位、指数位和尾数位。

3、内部信号定义: 定义了用于中间计算的wire类型信号A_s(符号位)、A_e(指数位)和A_f(尾数位)。

4、绝对值计算: 通过比较iInteger与0,计算其绝对值abs_input。

5、符号位赋值: A_s根据iInteger的符号确定,如果iInteger是负数,则A_s为1,否则为0。

6、指数位计算: 通过查找abs_input中最显著的非零位,计算出需要左移的位数shft_amt。然后根据这个位数计算出指数位A_e,公式为127 + 18 - shft_amt,其中127是偏移值,18是因为尾数位是17位,加上隐含的1位,共18位。

7、尾数位计算: 首先构造了一个34位的shift_buffer,将abs_input左移shft_amt位,然后取低17位作为尾数A_f。

8、输出赋值: 如果输入iInteger为0,则输出oA为0;否则,将符号位、指数位和尾数位组合起来赋值给oA。

这个模块实现了整数到浮点数的转换,但需要注意的是,这个转换并没有考虑特殊情况,比如输入为0时,指数位和尾数位应该如何处理,以及如何处理溢出或非规格化数的情况。此外,这个实现也没有包括舍入逻辑,这在实际的浮点数运算中是非常重要的。

2. 单精度浮点数转有符号数整数
(1)实现代码(Fp2Int模块)
module Fp2Int(input	 [26:0]	iA,output reg [15:0]	oInteger);// Extract fields of A and B.wire        A_s;wire [7:0]  A_e;wire [17:0] A_f;assign A_s = iA[26];assign A_e = iA[25:18];assign A_f = iA[17:0];wire [15:0] max_int = 16'h7fff ; //32768wire [33:0] shift_buffer ;// form (1.A_f) and shift it to postiionassign shift_buffer = {15'b0, 1'b1, A_f}<<(A_e-127) ;// If exponent less than 127, oInteger=0// If exponent greater than 127+14 oInteger=max value// Between these two values://	set up input mantissa with 1.mantissa //	   and the "1." in the lowest bit of an extended word.// 	shift-left by A_e-127// If the sign bit is set, negate oIntegeralways @(*) beginif (A_e < 127) oInteger = 16'b0;else if (A_e > 141) beginif (A_s) oInteger = -max_int;else     oInteger = max_int;endelse beginif (A_s) oInteger = -shift_buffer[33:18];else     oInteger = shift_buffer[33:18];endendendmodule //Fp2Int
(2)代码分析

Fp2Int的模块,它的作用是将一个27位的浮点数(iA)转换为一个16位的有符号整数(oInteger)。这个转换同样遵循IEEE 754标准的单精度浮点数格式。
对代码分析:

1、模块声明: 定义了模块名Fp2Int,输入输出端口。

2、输入输出定义:iA是一个27位的浮点数输入,oInteger是一个16位的有符号整数输出。

33、信号提取: 从iA中提取符号位A_s、指数位A_e和尾数位A_f。

4、最大整数值定义: 定义了一个16位的最大正整数max_int。

5、中间变量定义: 定义了一个34位的shift_buffer,用于存储转换后的整数。

6、浮点数到整数的转换: 构造了一个中间值(1.A_f),然后根据指数位A_e和偏移量127进行左移操作,得到shift_buffer。

7、条件判断:
如果指数位A_e小于127,表示浮点数的值小于1,整数输出为0。
如果指数位A_e大于127加上15(因为16位整数可以表示的数值范围是-32768到32767),则根据符号位A_s,设置整数输出为最大正整数或其负数。
如果指数位在127和127+15之间,将shift_buffer的低16位赋值给整数输出,根据符号位A_s决定是正数还是负数。
**8、always块:**使用always块来描述浮点数到整数的转换逻辑。

这个模块实现了浮点数到整数的转换,但同样没有考虑特殊情况,比如当指数位等于127且尾数位非零时,应该如何处理。此外,这个实现也没有包括舍入逻辑,这在实际的浮点数运算中是非常重要的。

需要注意的是,代码中有几个潜在的问题:

shift_buffer的左移操作可能会导致溢出,因为当A_e大于127时,左移操作可能会超过34位。
当A_e等于127时,需要检查尾数位A_f是否为0,以确定是否应该舍入。
当A_e大于127且小于141时,需要考虑舍入规则,以确定最终的整数输出。

三、结尾

本篇博客注重描述浮点数在FPGA中如何将有符号整数与单精度浮点数进行转换。**这两个Verilog代码模块分别实现了整数到浮点数以及浮点数到整数的转换。**第一个模块Int2Fp接受一个16位有符号整数作为输入,将其转换为符合IEEE 754标准的27位单精度浮点数输出,包括符号位、指数和尾数。第二个模块Fp2Int则执行相反的操作,它将27位单精度浮点数作为输入,转换为16位有符号整数作为输出。在转换过程中,两个模块都考虑了正负符号、指数偏移以及尾数的位移,但都没有实现舍入逻辑,这在实际应用中是必要的,以确保数值的准确性和避免溢出。下一篇文章将继续在此基础上描述单精度浮点数乘、加、开方、绝对值等操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/31497.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MYSQL杀掉会话

确实&#xff0c;你可以通过 performance_schema.events_statements_current 表来查找当前正在执行的语句的会话ID&#xff08;通常称为 THREAD_ID&#xff09;&#xff0c;然后使用 KILL 命令来终止该会话。不过&#xff0c;需要注意的是 events_statements_current 表中只包含…

新手项目经理如何快速成长?做好这些让你变优秀

随着国内企业精细化发展的步伐不断加快&#xff0c;企业内部在项目立项、项目运营、项目分析等板块的管理要求越来越高&#xff0c;对项目经理的岗位需求也越来越高。一个合格的项目经理需要对项目的初期、中期、后期进行全局的把控。初为项目经理&#xff0c;项目小白如何才能…

14、Spring之Bean生命周期~推断构造方法

14、Spring之Bean生命周期~推断构造方法 推断构造方法determineConstructorsFromBeanPostProcessors()方法autowireConstructor()方法instantiateBean()方法instantiateUsingFactoryMethod()方法 推断构造方法 spring在创建Bean对象的会调用createBeanInstance()方法进行实例化…

神经压缩文本训练:提升大型语言模型效率的新方法

随着大型语言模型&#xff08;LLMs&#xff09;在各个领域的广泛应用&#xff0c;其训练和部署的效率问题日益凸显。传统的子词标记化方法&#xff0c;如Byte Pair Encoding (BPE) 或 Unigram&#xff0c;虽然能够在一定程度上压缩文本&#xff0c;但其压缩率通常只有4倍左右。…

Kubernetes部署Kanboard看板管理平台

【云原生】Kubernetes部署Kanboard项目管理平台 文章目录 【云原生】Kubernetes部署Kanboard项目管理平台介绍资源列表基础环境一、检查k8s环境1.1、检查工作节点状态1.2、检查系统pod状态 二、编辑kanboard.yaml文件2.1、创建项目目录2.2、编辑kanboard.yaml文件 三、部署Kanb…

ubuntu22.04安装初始化

目录 1. 概述2. 修改参数3. 修改限制4. 修改源6. 虚拟机关闭swap分区7. 配置系统信息7.1 设置主机名7.2 设置时区7.3 安装常用工具包7.4 设置时间同步7.5 关闭 selinux 1. 概述 CentOS 7 马上就停止支持服务了&#xff0c;未雨绸缪&#xff0c;整理Ubuntu 22.04的 初始化脚本。…

日常工作中常用的管理工具

日常工作中常用的管理工具 SWOT分析法&#xff1a; 帮你清晰地把我全局&#xff0c;分析自己在资源方面的优势域劣势&#xff0c;把握环境提供的机会&#xff0c;防范可能存在的风险与威胁&#xff0c;对我们的成功有非常重要的意义 PDCA循环规则&#xff1a; 每一项工作&#…

如何使用LiveTargetsFinder生成实时活动主机URL列表

关于LiveTargetsFinder LiveTargetsFinder是一款功能强大的实时活动主机生成工具&#xff0c;该工具可以为广大研究人员以自动化的形式生成可供分析和测试的实时活动主机URL列表&#xff0c;并通过MassDNS、Masscan和Nmap自动过滤出无法访问的主机。 我们只需要提供一个域名作…

用shell脚本写一个猜数小游戏

1.用if语句写&#xff1a; num1$[RANDOM%101]fun() { read -p "please input a number between 0~9 : " numif (( $num < 0 || $num > 10 )) thenecho "请输入0-10以内的数字"fun elif (( $num > $num1 )) thenecho "请猜的small一点"…

代码随想录第30天|贪心算法

122.买卖股票的最佳时机II 给你一个整数数组 prices &#xff0c;其中 prices[i] 表示某支股票第 i 天的价格。 在每一天&#xff0c;你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买&#xff0c;然后在 同一天 出售。 返回 你能获得…

前端XLSX解析Excel数据处理多种日期格式转换问题

一、实现思路 最近在开发一个Excel解析预览的功能&#xff0c;发现在解析Excel导入时间的时候会存在一个离谱的问题就是Excel的时间和XlSX解析之后获取的时间会不一致 例如 2024/6/19 获取的时间为 Wed Jun 19 2024 23:59:17 GMT0800&#xff0c;少了43秒&#xff0c;为了解决…

SAP PP学习笔记23 - 生产订单(制造指图)的元素2 - 决济规则(结算规则)

上一章讲了生产订单&#xff08;制造指图&#xff09;画面的基本元素。 SAP PP学习笔记22 - 生产订单&#xff08;制造指图&#xff09;的元素1-CSDN博客 本章继续讲生产订单上面的其他元素。 1&#xff0c;Settlement rule&#xff08;决济规则(结算规则)&#xff09;概要 M…

springboot容器功能

springboot容器 容器功能Spring注入组件的注解Component&#xff0c;Controller&#xff0c;Service&#xff0c;Repository案例演示 Configuration应用实例传统方式使用Configuration 注意事项和细节 Import应用实例 ConditionalConditional介绍应用实例 ImportResource应用实…

Microsoft Office免费下载安装

文章目录 前言一、下载Office Tool Plus二、部署步骤1.移除本机低版本office2.部署设置3.开始部署 前言 本人一直支持国产WPS&#xff08;因为正版Microsoft Office需要花钱&#xff09;。直到某天接触到一款免费部署Microsoft Office的软件——Office Tool Plus&#xff0c;简…

C++ //CCF-CSP计算机软件能力认证 202406-1 矩阵重塑(其一)

CCF-CSP计算机软件能力认证 202406-1 矩阵重塑&#xff08;其一&#xff09; 题目背景 矩阵&#xff08;二维&#xff09;的重塑&#xff08;reshape&#xff09;操作是指改变矩阵的行数和列数&#xff0c;同时保持矩阵中元素的总数不变。 题目描述 矩阵的重塑操作可以具体…

BEV端到端视觉论文合集|从不同的视角解析BEV感知技术

随着自动驾驶技术的不断发展&#xff0c;基于摄像头的感知系统已成为关键&#xff0c;而Bird’s Eye View (BEV)大模型在其中发挥着重要作用。BEV大模型是一种将摄像头捕捉到的2D图像转换为自上而下视角的3D感知的技术&#xff0c;使得车辆能够更好地理解周围环境。 BEV大模型…

centos7 ntp 时间同步

centos7 ntp 时间同步 Centos7服务器通过Chrony设置时间同步 timedatectl命令的使用 https://blog.csdn.net/yy8623977/article/details/123519718 Linux(openEuler、CentOS8)基于chrony企业内网NTP服务器搭建实验 https://blog.csdn.net/xzzteach/article/details/13840889…

高职人工智能专业实训课之“图像识别基础”

一、前言 随着人工智能技术的迅猛发展&#xff0c;高职院校对人工智能专业实训课程的需求日益迫切。唯众人工智能教学实训平台作为一所前沿的教育技术平台&#xff0c;致力于为学生提供高效、便捷的人工智能实训环境&#xff0c;特别在“图像识别基础”这一关键课程中&#xf…

ubuntu多版本cuda如何指定cuda版本

本文作者&#xff1a; slience_me ubuntu多版本cuda如何指定cuda版本 文章目录 ubuntu多版本cuda如何指定cuda版本1. 关于cuda设置1.1 查看当前安装的 CUDA 版本1.2 下载并安装所需的 CUDA 版本1.3 设置环境变量1.4 验证切换1.5 安装对应的 NVIDIA 驱动程序 2. 设置环境变量2.1…

【机器学习 复习】第5章 朴素贝叶斯分类器

一、概念 1.贝叶斯定理&#xff1a; &#xff08;1&#xff09;就是“某个特征”属于“某种东西”的概率&#xff0c;公式就是最下面那个公式。 2.朴素贝叶斯算法概述 &#xff08;1&#xff09;是为数不多的基于概率论的分类算法&#xff0c;即通过考虑特征概率来预测分类。 …