fpga系列 HDL:全连接层的浮点数加法器FADD实现

32 位 float 型的二进制存储

  • 在fpga系列 HDL:全连接层的浮点数乘法器FM实现中已经提到过32 位 float 型的二进制存储结构。
    32 位 f l o a t 型数 V = ( − 1 ) S ∗ M ∗ 2 E 32 位 float 型数V=(-1)^S*M*2^E 32float型数V=(1)SM2E
Layer 1 22 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 23 30 31 指数位E 符号位S 有效数字M(实际计算时会包含前边的“1”,存储时省略“1”) (-1)^S*M*2^E

FADD

  • 代码实现了两个 32 位浮点数的相加操作,遵循 IEEE 754 单精度浮点数标准。
// https://github.com/omarelhedaby/CNN-FPGA/blob/master/CNN-FPGA-Vivado/CNN-FPGA-Vivado.srcs/sources_1/imports/Integration%20first%20part/floatAdd.v
module floatAdd (floatA,floatB,sum);input [31:0] floatA, floatB; // 两个 32 位的输入浮点数
output reg [31:0] sum; // 输出 32 位的结果reg sign;                            // 结果的符号位
reg [7:0] exponent;                  // 结果的指数位
reg [22:0] mantissa;                 // 结果的尾数位(有效位)
reg [7:0] exponentA, exponentB;      // 分别存储两个浮点数的指数
reg [23:0] fractionA, fractionB, fraction; // 尾数(包括隐含的 1)
reg [7:0] shiftAmount; // 指数差,用于对齐             
reg cout;         always @ (floatA or floatB) beginexponentA = floatA[30:23];exponentB = floatB[30:23];fractionA = {1'b1,floatA[22:0]};fractionB = {1'b1,floatB[22:0]}; exponent = exponentA;if (floatA == 0) begin						//special case (floatA = 0)sum = floatB;end else if (floatB == 0) begin					//special case (floatB = 0)sum = floatA;end else if (floatA[30:0] == floatB[30:0] && floatA[31]^floatB[31]==1'b1) begin sum=0; // 如果 A 和 B 的数值相同但符号不同,结果为 0end else begin// 1.指数对齐if (exponentB > exponentA) beginshiftAmount = exponentB - exponentA;fractionA = fractionA >> (shiftAmount); // 将较小的指数对应的尾数右移exponent = exponentB; // 更新指数为较大的那个end else if (exponentA > exponentB) begin shiftAmount = exponentA - exponentB;fractionB = fractionB >> (shiftAmount);exponent = exponentA;end// 2.尾数相加或相减(如果两个数的符号相同,则尾数相加。如果符号不同,则进行尾数相减。)if (floatA[31] == floatB[31]) begin			//same sign{cout,fraction} = fractionA + fractionB;if (cout == 1'b1) begin // 如果有进位,尾数右移并增加指数{cout,fraction} = {cout,fraction} >> 1;exponent = exponent + 1;endsign = floatA[31];end else begin						//different signsif (floatA[31] == 1'b1) begin{cout,fraction} = fractionB - fractionA;end else begin{cout,fraction} = fractionA - fractionB;endsign = cout;if (cout == 1'b1) beginfraction = -fraction;end else beginend// 3.规范化结果,找出有效数字M的第一个“1”if (fraction [23] == 0) beginif (fraction[22] == 1'b1) beginfraction = fraction << 1;exponent = exponent - 1;end else if (fraction[21] == 1'b1) beginfraction = fraction << 2;exponent = exponent - 2;end else if (fraction[20] == 1'b1) beginfraction = fraction << 3;exponent = exponent - 3;end else if (fraction[19] == 1'b1) beginfraction = fraction << 4;exponent = exponent - 4;end else if (fraction[18] == 1'b1) beginfraction = fraction << 5;exponent = exponent - 5;end else if (fraction[17] == 1'b1) beginfraction = fraction << 6;exponent = exponent - 6;end else if (fraction[16] == 1'b1) beginfraction = fraction << 7;exponent = exponent - 7;end else if (fraction[15] == 1'b1) beginfraction = fraction << 8;exponent = exponent - 8;end else if (fraction[14] == 1'b1) beginfraction = fraction << 9;exponent = exponent - 9;end else if (fraction[13] == 1'b1) beginfraction = fraction << 10;exponent = exponent - 10;end else if (fraction[12] == 1'b1) beginfraction = fraction << 11;exponent = exponent - 11;end else if (fraction[11] == 1'b1) beginfraction = fraction << 12;exponent = exponent - 12;end else if (fraction[10] == 1'b1) beginfraction = fraction << 13;exponent = exponent - 13;end else if (fraction[9] == 1'b1) beginfraction = fraction << 14;exponent = exponent - 14;end else if (fraction[8] == 1'b1) beginfraction = fraction << 15;exponent = exponent - 15;end else if (fraction[7] == 1'b1) beginfraction = fraction << 16;exponent = exponent - 16;end else if (fraction[6] == 1'b1) beginfraction = fraction << 17;exponent = exponent - 17;end else if (fraction[5] == 1'b1) beginfraction = fraction << 18;exponent = exponent - 18;end else if (fraction[4] == 1'b1) beginfraction = fraction << 19;exponent = exponent - 19;end else if (fraction[3] == 1'b1) beginfraction = fraction << 20;exponent = exponent - 20;end else if (fraction[2] == 1'b1) beginfraction = fraction << 21;exponent = exponent - 21;end else if (fraction[1] == 1'b1) beginfraction = fraction << 22;exponent = exponent - 22;end else if (fraction[0] == 1'b1) beginfraction = fraction << 23;exponent = exponent - 23;endendendmantissa = fraction[22:0];  // 提取尾数的低 23 位作为有效尾数sum = {sign, exponent, mantissa};  // 将符号、指数和尾数组合成最终结果		end		
endendmodule

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

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

相关文章

工业机器人9公里远距离图传模块,无人机低延迟高清视界,跨过距离限制

在科技日新月异的今天&#xff0c;无线通信技术正以未有的速度发展&#xff0c;其中&#xff0c;图传模块作为连接现实与数字世界的桥梁&#xff0c;正逐步展现出其巨大的潜力和应用价值。今天&#xff0c;我们将聚焦一款引人注目的产品——飞睿智能9公里远距离图传模块&#x…

LiveKit的agent介绍

概念 LiveKit核心概念&#xff1a; Room&#xff08;房间&#xff09;Participant&#xff08;参会人&#xff09;Track&#xff08;信息流追踪&#xff09; Agent 架构图 ​ 订阅信息流 ​ agent交互流程 客户端操作 加入房间 房间创建方式 手动 赋予用户创建房间的…

JavaScript - Api学习 Day03 (日期对象、节点操作、两种定时器、本地存储)

文章目录 一、日期对象1.1 实例化1.2 日期对象方法 二、节点操作2.1 父子兄弟节点1. 父节点查找2. 子节点查找3. 兄弟关系查找 2.2 增删节点1. 创建节点 - createElement2. 添加节点2.1 appendChild() 方法2.2 insertBefore() 方法2.3. 克隆节点 - cloneNode 3. 删除节点3.1 re…

[数据集][目标检测]抽烟检测数据集VOC+YOLO格式22559张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;22559 标注数量(xml文件个数)&#xff1a;22559 标注数量(txt文件个数)&#xff1a;22559 标…

408算法题leetcode--第一天

参考 参考题单 1523. 在区间范围内统计奇数数目 1523. 在区间范围内统计奇数数目思路&#xff1a;数据量有 1 0 9 10^9 109&#xff0c;所以遍历求解会超时&#xff1b;而(low, high)区间中的奇数 (0, high) - (0, low - 1)的奇数时间和空间复杂度&#xff1a;O(1) class …

flink中slotSharingGroup() 的详解

在 Apache Flink 中&#xff0c;slotSharingGroup() 是一个用于控制算子&#xff08;operator&#xff09;之间资源共享的机制。它允许多个算子共享相同的 slot&#xff08;即资源容器&#xff09;。Slot 是 Flink 中的资源单位&#xff0c;slot 共享可以提高资源利用率&#x…

VisualStudio环境搭建C++

Visual Studio环境搭建 说明 C程序编写中&#xff0c;经常需要链接头文件(.h/.hpp)和源文件(.c/.cpp)。这样的好处是&#xff1a;控制主文件的篇幅&#xff0c;让代码架构更加清晰。一般来说头文件里放的是类的申明&#xff0c;函数的申明&#xff0c;全局变量的定义等等。源…

echarts图 图例跑上面去了 不在右边

legend 中缺少 "right": "1%", "top": "center",

PyTorch----模型运维与实战

一、PyTorch是什么 PyTorch 由Facebook开源的神经网络框架&#xff0c;专门针对 GPU 加速的深度神经网络&#xff08;DNN&#xff09;编程。 二、PyTorch安装 首先确保你已经安装了GPU环境&#xff0c;即Anaconda、CUDA和CUDNN 随后进入Pytorch官网​​​​​​PyTorch 官…

【机器学习】高斯网络的基本概念和应用领域以及在python中的实例

引言 高斯网络&#xff08;Gaussian Network&#xff09;通常指的是一个概率图模型&#xff0c;其中所有的随机变量&#xff08;或节点&#xff09;都遵循高斯分布 文章目录 引言一、高斯网络&#xff08;Gaussian Network&#xff09;1.1 高斯过程&#xff08;Gaussian Proces…

细说STM32F407通用定时器的基础知识

目录 一、通用定时器功能概述 二、细说2通道定时器的功能 1.时钟信号和触发控制器 2.时基单元工作原理 (1)计数寄存器(CNT) (2)预分频寄存器(PSC) (3)自动重载寄存器(ARR) (4)时基单元的控制位 3.捕获/比较通道 三、生成PWM波 1.生成PWM波的原理 2.与生成PWM波相关的HA…

2023下半年软考网络规划

【考情分析】2023下半年软考网络规划设计师机考考情分析-真题解析公开课视频&#xff01;_哔哩哔哩_bilibili2023年11月软考网络规划设计师案例分析解析与考后复盘_哔哩哔哩_bilibili全网首发&#xff01;2023年下半年软考【高级】网规真题试卷--案例分析&#xff08;部分回忆版…

表观遗传系列1:DNA 甲基化以及组蛋白修饰

1. 表观遗传 表观遗传信息很多为化学修饰&#xff0c;包括 DNA 甲基化以及组蛋白修饰&#xff0c;即DNA或蛋白可以通过化学修饰添加附加信息。 DNA位于染色质&#xff08;可视为微环境&#xff09;中&#xff0c;并不是裸露的&#xff0c;因此DNA分子研究需要跟所处环境结合起…

Tuxera NTFS for Mac破解版下载 Tuxera NTFS for Mac2023激活码 mac电脑ntfs磁盘软件

Tuxera NTFS for Mac是一款优秀的Mac系统完全读写软件&#xff0c;提供Fat32、NTFS、Exfat、mac os扩展格式的转换&#xff0c;稳定性好&#xff0c;传输速度极快。Tuxera NTFS for Mac功能丰富&#xff0c;能修复NTFS卷、创建NTFS磁盘映像、创建NTFS分区等等。同时软件支持所有…

【EI会议末轮截稿通知】第三届电子信息技术国际学术会议(EIT 2024)

第三届电子信息技术国际学术会议&#xff08;EIT 2024&#xff09; The 3rd International Conference on Electronic Information Technology 重要信息 大会官网&#xff1a;www.ic-eit.net 三轮截稿时间&#xff1a;2024年9月16日23:59分&#xff08;后续不再征稿&#x…

【C++登堂入室】类和对象(中)——类的6个默认成员函数

目录 一、类的6个默认成员函数 ​编辑二、构造函数 2.1 概念 2.2 特性 三、析构函数 3.1 概念 3.2 特性 四、拷贝构造函数 4.1 概念 4.2 特征 五、赋值运算符重载 5.1 运算符重载 5.2 赋值运算符重载 5.3 前置和后置重载 六、日期类的实现 七、const成员 八、…

对称加密

一、可用的对称加密算法 序列算法 分组算法 二、分组算法 三、初始化向量 四、链接模式 ecb 模式 五、数据补齐方案 cbc 模式 六、AEAD

本地安装Ollama+WebUI

本地安装OllamaWebUI B站教程地址&#xff1a;https://www.bilibili.com/video/BV1Kz421h7Jk/?spm_id_from333.337.search-card.all.click&vd_source42b07826977d09765ec11b9fa06715e5 一、下载Ollama https://ollama.com/download 支持mac、linux、windows 选择在ubu…

鸿蒙原生应用元服务开发-仓颉基础数据类型元组类型

元组&#xff08;Tuple&#xff09;可以将多个不同的类型组合在一起&#xff0c;成为一个新的类型。元组类型使用 (T1, T2, …, TN) 表示&#xff0c;其中 T1 到 TN 可以是任意类型&#xff0c;不同类型间使用逗号&#xff08;,&#xff09;连接。元组至少是二元&#xff0c;例…

Tranformer分布式特辑

随着大模型的发展&#xff0c;如何进行分布式训练也成了每位开发者必备的技能。 1. 单机训练 CPU OffloadingGradient Checkpointing 正向传播时&#xff0c;不存储当前节点的中间结果&#xff0c;在反向传播时重新计算&#xff0c;从而起到降低显存占用的作用 Low Precision…