孩子都能学会的FPGA:第二十课——用FPGA实现定点数的开方运算

(原创声明:该文是作者的原创,面向对象是FPGA入门者,后续会有进阶的高级教程。宗旨是让每个想做FPGA的人轻松入门作者不光让大家知其然,还要让大家知其所以然!每个工程作者都搭建了全自动化的仿真环境,只需要双击top_tb.bat文件就可以完成整个的仿真(前提是安装了modelsim),降低了初学者的门槛。如需整个工程请留言(WX:Blue23Light),不收任何费用,但是仅供参考,不建议大家获得资料后从事一些商业活动!

前面的定点数的乘法和除法运行,至少我们还是能列竖式进行计算,所以用FPGA实现还算简单。但是对于本节要讲的开方运算,我们好像在数学书本上没有学习过如何进行计算。我们对于一些比较小的数的开方,我们可以根据乘法口诀大体推算出来,比如64=8*8,那64的平方根就是8,但是对于比较大的数,比如12345678这样的数,我们很难张口就算出了。

定点数的平方根,还是由一些算法能够实现的,我们以《基于FPGA的数字信号处理》[高亚军 编著] 这本书上Restoring 算法为例进行设计。下面是书上手工计算一个定点数平方根的过程。

第一步:将被开方数由低位至高位每两位分为一组;

第二步: 由高两位06开始,对应的平方根为2,即Q(2)=2。将Q(2)左移1位并与6相减获得部分余数 r2=2;

第三步:r2与D(3)D(2)合并构成 214,讲Q(2)左移1位为4,根据[4Q(1)]xQ(1)≤214,确定Q(1)=4,并获得部分余数r1=38;

第四步:r1与D(1)D(0)合并构成 3858 , [Q(2)Q(1)]左移 1 位为 48 , 根据[48Q(0)]xQ(0)3858确定Q(0)=7, 并获得部分余数r0,此即为最终余数R。

可见,该算法是一种迭代的过程,每次迭代获得平方根的某一位。这其实就是恢复余数(Restoring) 算法。

上面是书上的原话,大家可以理解一下,这种方法用在10进制数的开方计算上还是挺麻烦的,主要是中间有乘法运算,比如4Q(1)48Q(0)。书上由10进制推导出2进制数据的开方运行,使用了Restoring算法和Non-Restoring 算法来求数据的平方根,中间还有一些公式的推导,看的比较眼花缭乱,有兴趣的读者可以好好的看一下。下面是Restoring算法的计算过程图。

书中还给出了被开方数为8bit 的开方运算电路结构,如下所示。

其实二进制的开方运算非常简单,根本不需要涉及乘法除法和加法,只需要减法就可以完成。将被开方数从低位到高位2位一组进行处理。二进制的2位只能是11,10,01,和00,其中11,10,01的平方根是01,00的平方根是00,从高位到低位进行判断,假如当前是第k步,用前面所有步计算的平方根结果Q[n:k+1]连接01和当前的余数进行比较,来确定当前这一步的Q(k)是0还是1,如果Q(k)是1,减去当前结果的平方值;如果Q(k)是0,保持余数不变即可。

下面我们通过FPGA来实现8位无符号整数的开方运算。由于2位数进行1次计算,所以8位无符号整数的开发运算其实只需要4次计算就可以得出结果,如下定义的开方运算次数SQUARE_CNT=4

余数的运算如下所示,从高到底依次取余数的两位和前面计算结果与01的连接进行比较,来确定余数是减去当前的的平方值还是保持不变。

同余数的处理,来当前确定平方根的值到底是1还是0。

最后完成计算后,将结果锁存输出即可。

在仿真文件中产生随机数,双击sim文件夹下面的top_tb.bat文件,完成功能仿真。

仿真结果如下所示,我们测试几个数据42=6*6+7;232=15*15+7;92=9*9+11;结果都是正确的,FPGA设计实现的功能正常。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Cysteine Protease inhibitor半胱氨酸蛋白酶抑制剂

Cysteine Protease inhibitor 半胱氨酸蛋白酶抑制剂 921625-62-9 英文名称:Cysteine Protease inhibitor 中文名称:半胱氨酸蛋白酶抑制剂 化学名称:5-氨基-3-苯基-1,2,4-噻二唑 CAS:921625-62-9 外观:固体粉末 分子…

如何打印社保参保凭证

西安市: 陕西政务服务网: 个人服务 珠海市: 广东政务服务网: 用户登录 | 珠海市人力资源和社会保障网上服务平台 武汉市: 湖北政务服务网: 湖北政务服务网

基于Springboot的秒杀系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的秒杀系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构&#xf…

Cesium 顶点吸附和区域拾取

Cesium 顶点吸附和区域拾取 基于深度实现可以自定义拾取范围大小 // 顶点吸附// const result pickAreaHelper.pickNearest(viewer.scene, movement.endPosition, 32, 32);// 区域拾取const result pickAreaHelper.pickArea(viewer.scene, movement.endPosition, 32, 32);顶…

maven篇---第三篇

系列文章目录 文章目录 系列文章目录前言一、如何解决依赖传递引起的版本冲突?二、说说maven的依赖原则三、说说依赖的解析机制?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享…

硬件基础:MOS管

MOSFET概述 MOSFET由MOS(Metal Oxide Semiconductor金属氧化物半导体)FET(Field Effect Transistor场效应晶体管)这个两个缩写组成,即全称为金属氧化物场效应管,简称MOS管。 即通过给金属层(M-金属铝)的栅极和隔着氧化层(O-绝缘层SiO2)的源极施加电压&am…

【Erlang进阶学习】4、进程与消息传递

在Erlang系统中,进程都是轻量级的,意味着创建进程只需要花费微不足道的时间和极少的内存。 1、进程间不共享内存,而是通过消息传递来通信。 2、消息从发送进程的栈上复制到接收进程的堆上。 3、由于多个进程并发地在独立的内存空间执行&#…

easyrecovery2024最新破解版激活密钥

平时很多人都会把自己工作时,或者生活中的数据存储在我们的电脑上,很多时候,由于我们的误操作或者是其它某些问题,很容易就会误删除一些文件数据了,尤其是一些电脑出现故障,总是会导致数据丢失,…

【flink番外篇】1、flink的23种常用算子介绍及详细示例(1)- map、flatmap和filter

Flink 系列文章 1、Flink 专栏等系列综合文章链接 文章目录 Flink 系列文章一、Flink的23种算子说明及示例1、maven依赖2、java bean3、map4、flatmap5、Filter 本文主要介绍Flink 的3种常用的operator(map、flatmap和filter)及以具体可运行示例进行说明…

kubernetes(k8s)容器内无法连接同所绑定的Service ClusterIP问题记录

kubernetes(k8s)容器内无法连接同所绑定的Service ClusterIP问题记录 1. k8s环境 k8s使用kubernetes-server-linux-amd64_1.19.10.tar.gz 二进制bin 的方式手动部署 k8s 版本: [rootmaster ~]# kubectl version Client Version: version.Info{Major:"1", Minor:&…

【python】——函数

🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL&#xff1a…

【改进YOLOV8】融合动态蛇形卷积&DCNV2的草莓分级分割分割系统

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 随着计算机视觉技术的不断发展,图像分割成为了一个重要的研究领域。图像分割可以将图像中的不同对象或区域进行分离,从而更好地理解图像内…

在 App 设计工具的代码视图中管理代码

目录 管理组件、函数和属性 识别代码中的可编辑部分 编写 App 管理 UI 组件 管理回调 在 App 中共享数据 在多个位置运行的单一源代码 创建输入参数 为您的 App 添加帮助文本 限制您的 App 一次只运行一个实例 修复代码问题和运行时错误 个性化代码视图外观 更改颜…

线程的使用1

1. 创建一个线程 1.1 创建线程练习 线程实际上是应用层的概念,在 Linux 内核中,所有的调度实体都被称为任务 (task) , 他们之间的区别是:有些任务自己拥有一套完整的资源,而有些任务彼此之间共享一套资源 对此函数的使…

【C++】简单的C++程序编译

一、简单的C程序 //prog.cc int main() {return 0; }二、编译 1. win11命令终端 cc prog.cc 2. win11 Visual Studio命令终端 cl /EHsc /W4 prog.cc 3. GNU编译器 g -Wall -o prog prog.cc 三、运行 1.win11 prog 2.Unix/Linux ./prog 四、查看返回值 1.win11 路…

本地存储与复杂数据类型转换

1. 本地存储介绍 2.1 本地存储分类 - localStorage // 存储一个名字localStorage.setItem(uname, abc)// 获取名字console.log(localStorage.getItem(uname));// 删除本地存储 只删名字// localStorage.removeItem(uname)// 改localStorage.setItem(uname, aaa)// 存一个年龄 …

网络运维与网络安全 学习笔记2023.11.30

网络运维与网络安全 学习笔记 第三十一天 今日目标 实现AP自动注册、配置WLAN业务参数、无线终端通过wifi互访 实现AP自动注册 项目背景 企业内网的大量AP已经通过DHCP的方式获得IP地址 为了实现后期大量AP的统一管理,希望通过AC实现集中控制 在AC设备上&#…

企业培训私有化解决方案PlayEdu

本文应网友 林枫 的要求而折腾; 什么是 PlayEdu ? PlayEdu 是一款适用于搭建内部培训平台的开源系统,旨在为企业/机构打造自己品牌的内部培训平台。PlayEdu 基于 Java MySQL 开发;采用前后端分离模式;前端采用 React1…

idea保存时自动删除不用的import

1、File->setting 2、Editor->General->Auto Import 按照操作,即可实现!!!!!!!

关于开展人工智能专业人员“自然语言及语音处理设计开发工程师”专项培训的通知

“人工智能技术与咨询”发布 工业与信息化部电子工业标准化研究院于2022年7月1日发布《人工智能从业技术人员要求》,现针对已发布标准于1月3日至7日在北京举办《自然语言与语音处理设计开发工程师》中级人才培养,下边是具体文件通知请大家查阅。行业人才…
最新文章