孩子都能学会的FPGA:第十七课——用FPGA实现定点数的乘法

news2024/9/24 15:19:55

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

上节课的IIR设计用到了定点数的乘法,直接用的是xilinx乘法器IP核。那我们自己可不可以设计出来乘法器呢?当然是可以的,乘法器的设计也有很多的方法,我们从最简单的开始设计。

FPGA要处理的数据可以分为无符号数和有符号数,我们先从无符号数说起。假如两个无符号的数相乘,应该如何求出来结果?

这儿就要回忆一下我们小学学习乘法的时候是如何列竖式计算求解的啦,如下两个4位的数相乘,我们会有数据Y的每1位分别和X相乘,每相乘1X向左移动1位。最后将4个乘完的结果加起来得到最终的结果。

其实FPGA实现乘法比我们的竖式计算要简单,因为我们列的竖式计算一般都是10进制的计算,比如y38x37,还是有一步10以内的乘法运算。而在FPGA中,数据是用2进制表示的,每一位只能是0或者1,根本不存在乘法!如果y10,那y1*(x3_x2_x1_x0_0)的结果就是0,如果y21,那y2*(x3_x2_x1_x0_0_0)的结果就是x3_x2_x1_x0_0_0,所以根本没有任何的乘法运算!

两个数相乘,如果位数分别是nm,那最大值就是2^n*2^m,就是结果的位宽是n+m,所以在设计乘法器的时候一定要考虑位数的扩展,不然很容易出现溢出造成结果错误。

下面我们先进行无符号乘法器的设计,假设数据的位宽都是8位。首先进行了输入输出和中间信号的定义,由于输入的数据都是8位的,那输出就是8+8=16位,先扩展数据位。

先用组合逻辑实现了最终要加起来的8个数,根据din1的每1位来确定加数是din0移位扩展后的数据还是0。

定义了一个计数器cnt,用于控制8个加数串行相加,结果存储在sum中。

最终数据结果和标志信号即可。

在仿真文件中产生随机数,仿真看看乘法的结果是否正确。数据都用无符号整数来显示,我们验证一下结果,比如232*92=21344,198*182=36036都是和结果一致,说明功能是正确的。

其实这儿有一个问题,那就是乘法的计算至少需要8个时钟周期,如果位数增多,需要的时钟周期更多,那能不能减少乘法器的时钟周期呢?

是可以的,因为8个加数都是已知的,如果1个时钟周期完成1次加法运算,那先用4个加法器在1个时钟周期完成8个数的两两相加,得到4个结果,再用2个加法器在1个时钟周期完成4个数的两两相加,得到2个结果,最后再用1个加法器完成2个数的相加,就可以得出最终的结果,需要3个时钟周期。

那乘法器的计算时间还可以进一步缩短吗?理论是上可以缩短到一个时钟周期完成乘法的运算,就是全部使用组合逻辑来做,多消耗一些FPGA的资源而已。我们来验证一下。将FPGA的代码修改如下,全部用组合逻辑来实现。

下面来看看仿真结果,189*6=1134,192*216=41472,和仿真的结果都是一样的,说明功能也是正确的,而且立马就可以出来仿真结果!

既然用组合逻辑可以快速的得出来乘法的结果,那为什么不用组合逻辑呢?为什么一定要选择时序逻辑?很多初学者都有这样的疑问,现在笔者好好的把原因和大家说明一下。

组合逻辑在前功能仿真的时候是不消耗仿真时间的,但是不代表组合逻辑在硬件电路中信号的传输不消耗时间!组合逻辑就是由一堆的LUT搭建起来的,信号在LUT之间传输时需要时间的。对于乘法器,位数越多,LUT使用的越多,从输入到输出需要的时间就越长!假设对于一个乘法器用组合逻辑实现,从输入到输出需要8ns,我们想一个时钟周期完成乘法器的计算,那系统时钟一个周期的时间就不能小于8ns,如果考虑一些裕量,我们取10ns,那系统时钟最快是100MHz。如果用时序逻辑来实现乘法器,将大的组合逻辑分解成两个4ns的小的组合逻辑,那系统时钟一个周期的时间可以取5ns,系统时钟最快可以达到200MHz!FPGA系统的整体性能立马提升了一倍!很多初学者总是抱怨,为什么自己设计的工程在FPGA板卡上速度上不去,别人都能跑到100MHz,自己的跑到50MHz功能就不正常了!很有可能的原因就是组合逻辑太长了!

上面介绍了无符号位的乘法器设计,那有符号位的乘法器应该如何设计呢?思路很简单,把符号位提取出来,剩下的位数按照无符号位的处理方式处理即可。完成无符号位的计算后,最后加上符号位即可。但是有一点需要注意,在FPGA内部,有符号的数据是按照补码来进行运算的,所以并不是把符号位去掉剩余的数据就是就是取得绝对值,比如-58,在FPGA中用11000110来表示,如果去掉最高位1,剩余得1000110就是70,直接取值是不正确的。对负数需要先取反加1,得到0111010,才是58。乘法符号的判断大家都知道,正正得正,正负得负,负负得正,这很明显可以用异或来表示。

代码进行了稍微的更改,首先是去掉符号位数据位宽减少了。其次就是得出结果的符号位,同时将输入的数据从补码转换回去。

其它的设计与无符号乘法器基本一致,就是输出结果如果是负数还有取补码回去。

最后看看仿真的结果,-92*(-97)=8924,88*(-63)=-5544,和仿真结果是一致的,功能设计正确。

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

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

相关文章

SpringBoot-监听Nacos动态修改日志级别

目录 一、pom文件 二、项目配置文件 三、日志配置文件 四、日志监听类 五、日志动态修改服务类 线上系统的日志级别一般都是 INFO 级别,有时候需要查看 WARN 级别的日志,所以需要动态修改日志级别。微服务项目中使用 Nacos 作为注册中心&#xff0c…

什么是网络攻击?阿里云服务器可以避免被攻击吗?

网络攻击是指:损害网络系统安全属性的任何类型的进攻动作。进攻行为导致网络系统的机密性、完整性、可控性、真实性、抗抵赖性等受到不同程度的破坏。 网络攻击有很多种,网络上常见的攻击有DDOS攻击、CC攻击、SYN攻击、ARP攻击以及木马、病毒等等,所以再…

CTO对生活和工作一点感悟

陌生人,你好啊。 感谢CSDN平台让我们有了隔空认识,交流的机会。 我是谁? 我呢,毕业快11年,在网易做了几年云计算,后来追风赶上了大数据的浪潮,再到后来混迹在AI、智能推荐等领域。 因为有一颗…

SS8847T 双通道 H 桥驱动芯片 替代DRV8847

SS8847E是一款双桥电机驱动器,具有两个H桥驱动器,可以驱动两个直流有刷电机,一个双极步进电机,螺线管或其他感性负载。该器件的工作电压范围为 2.7V 至 15V,每通道可提供高达 1.0A 的负载电流。每个H桥的输出驱动器模块…

2023年安全员-A证证模拟考试题库及安全员-A证理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2023年安全员-A证证模拟考试题库及安全员-A证理论考试试题是由安全生产模拟考试一点通提供,安全员-A证证模拟考试题库是根据安全员-A证最新版教材,安全员-A证大纲整理而成(含2023年…

navigator.clipboard is undefined in JavaScript issue [Fixed]

navigator.clipboard 在不安全的网站是无法访问的。 在本地开发使用localhost或127.0.0.1没有这个问题。因为它不是不安全网站。 在现实开发中,可能遇到测试环境为不安全网站。 遇到这个问题,就需要将不安全网站标记为非不安全网站即可。 外网提供了3…

python动态加载内容抓取问题的解决实例

问题背景 在网页抓取过程中,动态加载的内容通常无法通过传统的爬虫工具直接获取,这给爬虫程序的编写带来了一定的技术挑战。腾讯新闻(https://news.qq.com/)作为一个典型的动态网页,展现了这一挑战。 问题分析 动态…

【开源视频联动物联网平台】视频接入网关的用法

视频接入网关是一种功能强大的视频网关设备,能够解决各种视频接入、视频输出、视频转码和视频融合等问题。它可以在应急指挥、智慧融合等项目中发挥重要作用,与各种系统进行对接,解决视频能力跨系统集成的难题。 很多视频接入网关在接入协议…

Go 语言输出文本函数详解

Go语言拥有三个用于输出文本的函数: Print()Println()Printf() Print() 函数以其默认格式打印其参数。 示例 打印 i 和 j 的值: package mainimport "fmt"func main() {var i, j string "Hello", "World"fmt.Print(…

【力扣:526】优美的排列

状态压缩动态规划 原理如下: 遍历位图可以得到所有组合序列,将这些序列的每一位看作一个数,取序列中1总量的值作为每轮遍历的位,此时对每个这样的位都能和所有数进行匹配,因为一开始就取的是全排列,并且我们…

MySQL表的查询、更新、删除

查询 全列查询 指定列查询 查询字段并添加自定义表达式 自定义表达式重命名 查询指定列并去重 select distinct 列名 from 表名 where条件 查询列数据为null的 null与 (空串)是不同的! 附:一般null不参与查询。 查询列数据不为null的 查询某列数据指定…

陈嘉庚慈善践行与卓顺发的大爱传承

陈嘉庚慈善践行,了解陈嘉庚后人与卓顺发的大爱传承。 2023年11月25日,卓顺发太平绅士以及陈家后人在分享他们对慈善领域见解的过程中,特别强调了慈善在促进社会和谐以及推动社会进步方面的关键作用。同时,他们深入探讨了如何在当今社会中继续传扬和实践家国情怀以及…

C++ CryptoPP使用AES加解密

Crypto (CryptoPP) 是一个用于密码学和加密的 C 库。它是一个开源项目,提供了大量的密码学算法和功能,包括对称加密、非对称加密、哈希函数、消息认证码 (MAC)、数字签名等。Crypto 的目标是提供高性能和可靠的密码学工具,以满足软件开发中对…

什么是木马

木马 1. 定义2. 木马的特征3. 木马攻击流程4. 常见木马类型5. 如何防御木马 1. 定义 木马一名来源于古希腊特洛伊战争中著名的“木马计”,指可以非法控制计算机,或在他人计算机中从事秘密活动的恶意软件。 木马通过伪装成正常软件被下载到用户主机&…

strstr 的使用和模拟实现

就位了吗?如果坐好了的话,那么我就要开始这一期的表演了哦! strstr 的使用和模拟实现: char * strstr ( const char * str1, const char * str2); Returns a pointer to the first occurrence of str2 in str1, or a null pointer if str2 i…

030 - STM32学习笔记 - ADC(四) 独立模式多通道DMA采集

030 - STM32学习笔记 - ADC(四) 独立模式多通道DMA采集 中断模式和DMA模式进行单通道模拟量采集,这节继续学习独立模式多通道DMA采集,使用到的引脚有之前使用的PC3(电位器),PA4(光敏…

Peter算法小课堂—高精度乘法

给大家看个小视频13 高精度算法 乘法_哔哩哔哩_bilibili 乘法竖式 大家觉得Plan A好,还是Plan B好呢(对于计算机来说)?那显然是B啦 x*y问题 mul思路:mul()函数返回x数组乘y数组的积,保存在z数组。根据上…

基于SpringBoot的旅游网站的设计与实现

摘 要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势,旅游网站当然也不能排除在外,随着旅游网站的不断成熟,它彻底改变了过去传统的旅游网站方式,不仅使旅游管理…

three.js结合vue

作者:baekpcyyy🐟 1.搭建环境 ps:这里要按照node.js在之前有关vue搭建中有介绍 新建文件夹并在vsc终端中打开 1.输入vite创建指令 npm init vitelatest然后我们cd进入刚才创建的目录下 npm install安装所需依赖 npm run dev启动该项目 …

Python正则表达式:match()和search()函数全面解读

更多资料获取 📚 个人网站:ipengtao.com 在Python中,正则表达式是强大的工具,能够用于文本匹配、搜索和替换。re模块提供了许多函数来处理正则表达式,其中match()和search()是两个常用的函数。本文将深入探讨这两个函…