关于FPGA的浮点数处理 II

2024-06-22 07:44
文章标签 浮点数 处理 ii fpga

本文主要是介绍关于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位有符号整数作为输出。在转换过程中,两个模块都考虑了正负符号、指数偏移以及尾数的位移,但都没有实现舍入逻辑,这在实际应用中是必要的,以确保数值的准确性和避免溢出。下一篇文章将继续在此基础上描述单精度浮点数乘、加、开方、绝对值等操作。

这篇关于关于FPGA的浮点数处理 II的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1083685

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

从0到1,AI我来了- (7)AI应用-ComfyUI-II(进阶)

上篇comfyUI 入门 ,了解了TA是个啥,这篇,我们通过ComfyUI 及其相关Lora 模型,生成一些更惊艳的图片。这篇主要了解这些内容:         1、哪里获取模型?         2、实践如何画一个美女?         3、附录:               1)相关SD(稳定扩散模型的组成部分)               2)模型放置目录(重要)

Thymeleaf:生成静态文件及异常处理java.lang.NoClassDefFoundError: ognl/PropertyAccessor

我们需要引入包: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>sp

jenkins 插件执行shell命令时,提示“Command not found”处理方法

首先提示找不到“Command not found,可能我们第一反应是查看目标机器是否已支持该命令,不过如果相信能找到这里来的朋友估计遇到的跟我一样,其实目标机器是没有问题的通过一些远程工具执行shell命令是可以执行。奇怪的就是通过jenkinsSSH插件无法执行,经一番折腾各种搜索发现是jenkins没有加载/etc/profile导致。 【解决办法】: 需要在jenkins调用shell脚

学习记录:js算法(二十八):删除排序链表中的重复元素、删除排序链表中的重复元素II

文章目录 删除排序链表中的重复元素我的思路解法一:循环解法二:递归 网上思路 删除排序链表中的重复元素 II我的思路网上思路 总结 删除排序链表中的重复元素 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 图一 图二 示例 1:(图一)输入:head = [1,1,2]输出:[1,2]示例 2:(图

明明的随机数处理问题分析与解决方案

明明的随机数处理问题分析与解决方案 引言问题描述解决方案数据结构设计具体步骤伪代码C语言实现详细解释读取输入去重操作排序操作输出结果复杂度分析 引言 明明生成了N个1到500之间的随机整数,我们需要对这些整数进行处理,删去重复的数字,然后进行排序并输出结果。本文将详细讲解如何通过算法、数据结构以及C语言来解决这个问题。我们将会使用数组和哈希表来实现去重操作,再利用排序算法对结果

8. 自然语言处理中的深度学习:从词向量到BERT

引言 深度学习在自然语言处理(NLP)领域的应用极大地推动了语言理解和生成技术的发展。通过从词向量到预训练模型(如BERT)的演进,NLP技术在机器翻译、情感分析、问答系统等任务中取得了显著成果。本篇博文将探讨深度学习在NLP中的核心技术,包括词向量、序列模型(如RNN、LSTM),以及BERT等预训练模型的崛起及其实际应用。 1. 词向量的生成与应用 词向量(Word Embedding)

使用协程实现高并发的I/O处理

文章目录 1. 协程简介1.1 什么是协程?1.2 协程的特点1.3 Python 中的协程 2. 协程的基本概念2.1 事件循环2.2 协程函数2.3 Future 对象 3. 使用协程实现高并发的 I/O 处理3.1 网络请求3.2 文件读写 4. 实际应用场景4.1 网络爬虫4.2 文件处理 5. 性能分析5.1 上下文切换开销5.2 I/O 等待时间 6. 最佳实践6.1 使用 as