【CNN-FPGA开源项目解析】卷积层01--floatMult16模块

文章目录

    • (基础)半精度浮点数的表示和乘运算
      • 16位半精度浮点数
      • 浮点数的乘运算
    • floatMult16完整代码
    • floatMult16代码逐步解析
      • 符号位sign判断
      • 指数exponent计算
      • 尾数fraction计算
      • 尾数fraction的标准化和舍位
      • 整合为最后的16位浮点数结果[sign,exponent,fraction]
    • 其他
      • 变量宽度表
      • always敏感列表
      • 特殊情况处理

(基础)半精度浮点数的表示和乘运算

16位半精度浮点数

在这里插入图片描述

浮点数的乘运算

根本原理式:
X = X S ⋅ 2 X E Y = Y S ⋅ 2 Y E X ⋅ Y = ( X S ∗ Y S ) ⋅ 2 X E + Y E X = X_{S} · 2^{X_{E}} \\ Y = Y_{S} · 2^{Y_{E}} \\ X·Y = (X_{S}*Y_{S}) · 2^{X_{E} + Y_{E}} X=XS2XEY=YS2YEXY=(XSYS)2XE+YE
基本流程:

  • 判符号。

  • 算尾数:结果的尾数是输入两数的尾数之积。(未标准化)

  • 算指数:结果的指数是输入两数的指数之和。(未标准化)

  • 标准化和舍位:

    ① 结果化为二级制(1.xx)的形式,取出尾数。

    ② 舍去低位,保留高位。


floatMult16完整代码

完整代码:

`timescale 100 ns / 10 psmodule floatMult16 (floatA,floatB,product);input [15:0] floatA, floatB;
output reg [15:0] product;reg sign;
reg signed [5:0] exponent; //6th bit is the sign
reg [9:0] mantissa;
reg [10:0] fractionA, fractionB;	//fraction = {1,mantissa}
reg [21:0] fraction;always @ (floatA or floatB) beginif (floatA == 0 || floatB == 0) beginproduct = 0;end else beginsign = floatA[15] ^ floatB[15];exponent = floatA[14:10] + floatB[14:10] - 5'd15 + 5'd2;fractionA = {1'b1,floatA[9:0]};fractionB = {1'b1,floatB[9:0]};fraction = fractionA * fractionB;if (fraction[21] == 1'b1) beginfraction = fraction << 1;exponent = exponent - 1; end else if (fraction[20] == 1'b1) beginfraction = fraction << 2;exponent = exponent - 2;end else if (fraction[19] == 1'b1) beginfraction = fraction << 3;exponent = exponent - 3;end else if (fraction[18] == 1'b1) beginfraction = fraction << 4;exponent = exponent - 4;end else if (fraction[17] == 1'b1) beginfraction = fraction << 5;exponent = exponent - 5;end else if (fraction[16] == 1'b1) beginfraction = fraction << 6;exponent = exponent - 6;end else if (fraction[15] == 1'b1) beginfraction = fraction << 7;exponent = exponent - 7;end else if (fraction[14] == 1'b1) beginfraction = fraction << 8;exponent = exponent - 8;end else if (fraction[13] == 1'b1) beginfraction = fraction << 9;exponent = exponent - 9;end else if (fraction[12] == 1'b0) beginfraction = fraction << 10;exponent = exponent - 10;end mantissa = fraction[21:12];if(exponent[5]==1'b1) begin //exponent is negativeproduct=16'b0000000000000000;endelse beginproduct = {sign,exponent[4:0],mantissa};endend
endendmodule

floatMult16代码逐步解析

符号位sign判断

​ 正正得正,负负得正,正负得负。用异或运算即可。

sign = floatA[15] ^ floatB[15];

指数exponent计算

​ floatA与floatB的指数相加,初步得到了乘法结果的指数(尚未标准化)。

  • 后面进行标准化时,指数要随着"尾数小数点"的移动而变化。
exponent = floatA[14:10] + floatB[14:10] - 5'd15 + 5'd2;

尾数fraction计算

​ floatA与floatB的尾数相乘,初步得到了乘法结果的尾数(尚未标准化)。

  • 输入的两个浮点数是上一级操作完成的。fraction为省略整数1的小数部分,因此运算时需要先把这个整数1还回去。
  • 此步得到的运算结果尚未经历标准化。
  • 两个10bit的二进制相乘结果先暂存为20bit,避免在乘法过程中造成精度损失。后续再进行移位和舍位。
//输入的两个浮点数A,B都是标准的。把整数1先借回去,以便参与运算。
fractionA = {1'b1,floatA[9:0]};
fractionB = {1'b1,floatB[9:0]};
//尾数相乘
fraction = fractionA * fractionB;

尾数fraction的标准化和舍位

​ 通过小数点的移动,将运算结果变为二进制(1.xx)的形式。尾数即取小数点后(xx)的部分。同时,在这个过程中"指数"要同步发生变化。

  • 尾数小数点"左移n位",二进制右移:指数+n。
  • 尾数小数点"右移n位",二进制左移:指数-n。

代码的思路是:

  • 从乘法结果尾数的高位开始,寻找到最高位的1。通过左移,将"这一位"变为最高位。

  • 半精度浮点数尾数位只取5位。舍去低位。

标准化:

		if (fraction[21] == 1'b1) beginfraction = fraction << 1;exponent = exponent - 1; end else if (fraction[20] == 1'b1) beginfraction = fraction << 2;exponent = exponent - 2;end else if (fraction[19] == 1'b1) beginfraction = fraction << 3;exponent = exponent - 3;end else if (fraction[18] == 1'b1) beginfraction = fraction << 4;exponent = exponent - 4;end else if (fraction[17] == 1'b1) beginfraction = fraction << 5;exponent = exponent - 5;end else if (fraction[16] == 1'b1) beginfraction = fraction << 6;exponent = exponent - 6;end else if (fraction[15] == 1'b1) beginfraction = fraction << 7;exponent = exponent - 7;end else if (fraction[14] == 1'b1) beginfraction = fraction << 8;exponent = exponent - 8;end else if (fraction[13] == 1'b1) beginfraction = fraction << 9;exponent = exponent - 9;end else if (fraction[12] == 1'b0) beginfraction = fraction << 10;exponent = exponent - 10;end 

舍位:

		mantissa = fraction[21:12];

整合为最后的16位浮点数结果[sign,exponent,fraction]

使用"拼接"语法,最后结果product为16位。

product = {sign,exponent[4:0],mantissa};

其他

变量宽度表

input [15:0] floatA, floatB;
output reg [15:0] product;reg sign;
reg signed [5:0] exponent; 
reg [9:0] mantissa;
reg [10:0] fractionA, fractionB;
reg [21:0] fraction;

always敏感列表

本模块为纯组合逻辑,非时序。因此只要有数据输入,便触发模块功能,开始运算。

always @ (floatA or floatB)	begin/* -------------------- */ 
end

特殊情况处理

  • 输入两个数都是0时,输出也为0。
if (floatA == 0 || floatB == 0) beginproduct = 0;
end
  • 不允许指数为负数。在半精度浮点数中,指数本来只有5位。但是代码中的变量设置为6位,其中多出的最高一位是符号位。通过这一位,我们来判断指数的正负。

(这一点从上面操作fraction只进行左移也可以看出来。)

if(exponent[5]==1'b1) begin product=16'b0000000000000000;
end

学习文章:二进制浮点数以及二进制浮点数算术运算
开源项目github-URL:CNN-FPGA

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

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

相关文章

Aspose转pdf乱码问题

一、问题描述 ​ 在centos服务器使用aspose.word转换word文件为pdf的时候显示中文乱码(如图)&#xff0c;但是在win服务器上使用可以正常转换 二、问题原因 由于linux服务器缺少对应的字库导致文件转换出现乱码的 三、解决方式 1.将window中字体(c:\windows\fonts)放到linux…

leetcode刷题 二维数组 八方向

题目描述 输入&#xff1a;board [[0,1,0],[0,0,1],[1,1,1],[0,0,0]] 输出&#xff1a;[[0,0,0],[1,0,1],[0,1,1],[0,1,0]] 题目分析:就是以二维数组某个元素为中心&#xff0c;寻找周围八个方向的元素&#xff0c;按照题目要求修改二维数组元素返回&#xff1b; 拷贝一份二…

ElementUI实现登录注册+axios全局配置+CORS跨域

一、搭建项目 1.1 安装 Element-UI 先确保是否安装了vue-cli脚手架工具 !!! 安装vue脚手架可以看看我的上一篇博客 构建好项目后通过npm安装element-ui cd 项目根路径 #进入新建项目的根目录 npm install element-ui -S #安装…

AUTOSAR 面试知识回顾

如果答不上来&#xff0c;就讲当时做了什么 1. Ethernet基础: 硬件接口&#xff1a; ECU到PHY&#xff1a; data 是MII总线&#xff0c; 寄存器控制是SMI总线【MDCMDIO两根线, half duplex】PHY输出(100BASE-T1)&#xff1a; MDI总线&#xff0c;2 wire 【T1: twisted 1 pair …

C#__简单使用TCP/UDP发送消息

Socket(套接字、插口) TCP和UCP的区别&#xff1a; 1、基于连接和无连接 2、对系统资源的要求&#xff08;TCP较多&#xff0c;UCP少&#xff09; 3、UDP程序结构简单 4、流模式和数据报模式 5、TCP保证数据正确性和数据先后顺…

关于地址存放的例题

unsigned int a 0x1234; unsigned char b *(unsigned char*)&a; 上面代码大端存储和小端存储的值分别是多少&#xff1f; 大端存储的是把高位地址存放在低位地址处&#xff0c;低位存放到高位。小端是高位存放在高位&#xff0c;低位在低位。因为a是整型&#xff0c;所…

GraphQL基础知识与Spring for GraphQL使用教程

文章目录 1、数据类型1.1、标量类型1.2. 高级数据类型 基本操作2、Spring for GraphQL实例2.1、项目目录2.2、数据库表2.3、GraphQL的schema.graphql2.4、Java代码 3、运行效果3.1、添加用户3.2、添加日志3.3、查询所有日志3.4、查询指定用户日志3.5、数据订阅 4、总结 GraphQL…

C 语言简单入门

C 语言发展历史|标准 1972年&#xff0c;丹尼斯里奇&#xff08;Dennis Ritch&#xff09;和肯汤普逊&#xff08;Ken Tompson&#xff09;在贝尔实验室开发 UNIX 操作系统时基于 B 语言设计出 C 语言。 1987年&#xff0c;布莱恩柯林汉&#xff08;Brian Kernighan&#xff…

数据库基础理论

什么是数据库&#xff1f; 数据&#xff1a;描述事物的符号记录&#xff0c;可以是数字、文字、图形、图像、声音、语言等&#xff0c;数据有多种形式&#xff0c;他们都是可以经过数字化后存入计算机。 数据库&#xff1a;存储数据的仓库&#xff0c;是长期存放在计算机内、…

世界前沿技术发展报告2023《世界信息技术发展报告》(三)量子信息技术

&#xff08;三&#xff09;量子信息技术 1. 概述2. 量子计算2.1 阿里巴巴达摩院成功研制两比特量子芯片&#xff0c;单比特操控精度超99.97%2.2 加拿大Xanadu公司开发出可编程光量子计算机2.3 美国英伟达公司为经典-量子混合计算推出开发架构2.4 日本国家自然科学研究所开发出…

SpringBoot实战

ISBN: 978-7-115-43314-5 作者&#xff1a;【美】Craig Walls 译者&#xff1a;丁雪丰 页数&#xff1a;209页 阅读时间&#xff1a;2022-12-27 推荐指数&#xff1a;★★★☆☆ 阅读本书还是要有一定的基础的&#xff0c;如果想要入门级还是不行&#xff0c; 建议入门级可以看…

python+nodejs+php+springboot+vue 法律知识分享科普系统平台

在设计过程中&#xff0c;充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 要想实现法律知…

数字图像基础,数字图像处理中的基础内容(数字图像处理概念 P2)

文章目录 人类视觉系统构造数字图像生成采样和量化像素之间的基本关系 人类视觉系统构造 锥状体&#xff1a;明亮的视野杆状体&#xff1a;微光或暗视野图像成像原理&#xff1a;类似照相机亮度适应现象&#xff1a;人的视觉不能同时在一个范围内工作同时对比现象&#xff1a;…

el-select的某一项选中后显示id

环境: vue3element-plus 今天在使用elementui的下拉组件的时候发现有一个选项在选中后显示的是id.找了会没看到问题,后来想到会不会是没有设置key的原因(之前看到说vue3可以不用设置key),果然加上key就可以了

变量、因子、缺失值、类型转换、剔除多余变量、随机抽样、用R使用SQL、trim、na.rm=TRUE、数据标准化应用

变量&#xff1a;名义型、有序型、连续型变量 名义型&#xff1a;普通事件类型&#xff0c;如糖尿病I型和糖尿病II型。 有序型&#xff1a;有顺序的事件类型&#xff0c;如一年级、二年级和三年级。 连续型&#xff1a;表示有顺序的数量&#xff0c;如年龄。 因子&#xff1a;…

基于Python+Django的热门旅游景点数据分析系统的设计与实现(源码+lw+部署文档+讲解等)

前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb;…

C++项目:仿muduo库实现高性能高并发服务器

文章目录 一、实现目标二、前置知识&#xff08;一&#xff09;HTTP服务器1.概念 &#xff08;二&#xff09;Reactor模型&#xff1a;1.概念2.分类&#xff08;1&#xff09;单Reactor单线程&#xff1a;单I/O多路复用业务处理。&#xff08;2&#xff09;单Reactor多线程&…

ultraEdit正则匹配多行(xml用)

在ultraEdit中&#xff0c;我想选取<channel到</channel>之间的多行&#xff08;进行删除&#xff09;。在perl模式下&#xff0c;命令为“<channel[\s\S]?</channel>”。下面是xml文件&#xff1a; <!--This XML file does not appear to have any sty…

在北京多有钱能称为富

背景 首先声明&#xff0c;此讨论仅限个人的观点&#xff0c;因为我本身不富嘛&#xff0c;所以想法应该非常局限。 举个栗子 富二代问我朋友&#xff0c;100~1000w之间&#xff0c;推荐一款车&#xff1f; 一开始听到这个问题的时候&#xff0c;有被唬住&#xff0c;觉得预…

Linux知识

文章目录 一、Apt1、查看操作系统信息2、换源3、比较4、用法5、ubuntu获取源码 二、pkg-config三、调试glibc四、问题 一、Apt 1、查看操作系统信息 使用以下命令查看本机的操作系统和位数信息&#xff1a; uname -m && cat /etc/*release输出&#xff1a; x86_64 D…