FPGA - 数 - 加减乘除

一,数的表示

        首先,将二进制做如下解释:

        2的0次方=1

        2的1次方=2

        2的2次方=4

        2的3次方=8

        .....

        以此类推,那么任何整数,或者说任意一个自然数均可以采用这种方式来表示。

例如,序列10101001,根据上述表示方法,可以很容易推算出序列所表示的数值

        2的7次方 * 1  + 2的6次方 * 0 + 2的5次方 * 1+ 2的4次方 * 0 +

        2的3次方 * 1 + 2的2次方 * 0 + 2的1次方 * 0 + 2的0次方 * 1 = 

        128 + 0 + 32 + 0 + 8 + 0 + 0 + 1 = 169 

        通过这个方法,整个自然数都可用0 1这两个数字来代替。0与1这两个数字很容易被电子化:有电流就是 1,没有电流就是0。这就是整个现代计算机技术的根本秘密所在。


二,定点数

        几乎所有的计算机,以及包括FPGA在内的数字信号处理器件,数字和信号变量都是用二进制数来表示的。数字使用符号0和1来表示, 称为比特(Binary Digit,bit)。其中,二进制数的小数点将数字的整数部分和小数部分分开。为了与十进制数的小数点符号相区别,使用符号∆来表示二进制数的小数点。例如,十进制数11.625的二进制 数表示为1011∆101。二进制数小数点左边的4位1011代表整数部分, 小数点右边的3位101代表数字的小数部分。对于任意一个二进制数来 讲,均可由 B 个整数位和 b 个小数位组成,即        

        其对应的十进制数大小(假设该二进制数为正数) D 由 

        给出。每一个a_i的值取1或0。最左端的位 a_{(B-1)}称为最高位(Most Significant Bit ,MSB),最右端的位a_{-b}称为最低位(Least Significant Bit,LSB) 

        定点数有原码、反码和补码三种表示方法,这三种表示方法在 FPGA设计中使用得十分普遍

(1)原码

        原码是「未经更改的码」,指一个二进制数左边加上符号位后所得到的码。       

        原码表示法是指符号位加绝对值的表示法。符号位通常用0表示正号,用1表示负号。例如,二进制数 ( x )2=0∆110表示+0.75,( x )2=1∆110表示-0.75。

(2)反码 

        正数的反码与原码相同。负数的反码为原码除了符号位的所有位 取反,即可得到负数的反码。例如,十进制数-0.75的二进制原码表示 为( x )2=1∆110,其反码为1∆001

(3)补码 

        正数的补码、反码及原码完全相同

        负数的补码与反码之间有一 个简单的换算关系:补码等于反码在最低位加1。

        例如,十进制 数-0.75的二进制原码为1∆110,反码为1∆001,其补码为1∆010。

        值得 一提的是,在二进制数的运算过程中,补码最重要的特性是减法可以用加法来实现。

        原码的优点是乘除运算方便,无论正数还是负数,乘、除运算都 一样,并以符号位决定结果的正负号;若做加法则需要判断两个数符 号是否相同;若做减法,还需要判断两个数绝对值的大小,用大数减小数。

        补码的优点是加法运算方便,无论正数还是负数均可直接加, 且符号位同样参与运算,如果符号位发生进位,把进位的1去掉,余下的即结果。 

(4)原码与补码的运算对比

        由于正数的原码和补码完全相同,因此对于加法运算来讲,原码和补码的运算方式也完全相同。补码的运算优势主要体现在减法上, 我们以一个具体的例子来分析采用补码进行减法运算的优势,在进行分析之前,先要明确的是,在电路中实现比较、加法、减法等运算 时,都需要占用相应的硬件资源,且需要耗费一定的时间。因此,完成相同的运算,所需的运算步骤越少,运算效率就越高。

        假设4 bit的数 A 和 B ,其中 A 的值为6B的值为-5,则其二进制补码分别为 A补(0110)B补(1011),按照二进制逢二进一的规则完成加运算,得到10001,舍去最高位1,取低4 bit的数,可得到0001,即十进制数1,结果正确。运算过程如下图:

        假设 A 的值为-6B的值为5,则其二进制补码分别为 A补(1010) B补(0101), 按照二进制逢二进一的规则完成加运算,得到1111,(负数补码到原码的转换:除去符号位以外全部取反加1)即(0000 + 1 = 0001),即十进制数-1, 结果正确,运算过程如下图:

        从上面的例子可以看出,当采用补码时,无论加法运算还是减法运算,均可通过加法运算来实现,这对电路的设计是十分方便的。


三,FPGA的加减乘除 

(1)加减操作

        FPGA中的二进制数可以分为定点数浮点数两种格 式,虽然浮点数的加法和减法运算相对于定点数而言,在运算步聚和 实现难度上都要复杂得多,但浮点数的加法和减法运算仍然是通过将浮点数分解为定点数运算以及移位等步骤来实现的。

        例如,对于两个二进制数00101和00110, 当进行加法运算时,Verilog HDL的编译器按二进制规则逐位相加,结果为01011。如果设计者将这两个二进制数看成无符号整数,则表示5+6=11;如果将这两个二进制数的小数点放在最高位与次高位之间, 即0∆0101和0∆0110,则表示0.3125+0.375=0.6875。

        需要注意的是,与十进制数运算规则相同,在进行二进制数的加法和减法运算时,参与运算的两个二进制数的小数点位置必须对齐, 且结果的小数点位置也必须相同。 


        Verilog HDL如何表示负数呢?

        例如,二进制数1111,在程序中是表示15还是-1?方法十分简单。

        在声明端口或信号时,默认的是无符号数,如果需要将某个数指定为有符号数,则只需在声明时增加关键字signed即可。

        例如,wire signed[7:0] number;”表示将number 声明为8 bit的有符号数,在对其进行运算时自动按照有符号数来处理。


        结合二进制数的运算规则可以得出以下几点结论:

  • B bit的二进制数,如当成无符号整数,表示的范围为0~2^B-1;如当成有符号整数,表示的范围为-2^{B-1}2^B-1
  • 如果二进制数的表示范围没有溢出,将运算数据均看成无符号数或有符号数,则运算结果正确。
  • 两个B bit的二进制数进行加法和减法运算,若要运算结果 不溢出,则需要 B +1 bit的数存放运算结果。
  • 两个二进制数进行加法和减法运算,只要输入数据相同,不 论有符号数还是无符号数,其运算结果的二进制数就完全相同。

        虽然在二进制数的加法和减法运算中,不论有符号数还是无符号数,两个二进制数的运算结果的二进制数形式完全相同,

        但在Verilog HDL中,仍然有必要根据设计需要采用关键字signed对信号进行声明。 例如,在进行比较运算时,对于无符号数据,1000大于0100;对于有符号数据,1000小于0100


        在实际的工程设计中,经常会遇到多于两个操作数的加法运算 (由于补码的加法和减法运算相同,因此仅讨论加法运算)

        在进行FPGA设计中还经常遇到这样一种情况,例如,有3个4 bit 的数参与加法运算,前两个数的加法结果需要用5 bit的数存储,但通过设计能保证最终的运算结果范围为-8~7,即只需用4 bit的数表示,在设计电路时,是否需要采用5 bit的数存储中间运算结果呢?

        为了弄清楚这个问题,我们通过2个例子来验证一下。

例子1:

        假设3个 4 bit的数进行加法运算: A =7、 B =3、 C =-4, A + B + C =6。

        根据二进制数 的运算规则,首先计算 D = A + B =10,如果中间结果也采用4 bit的数表 法,则结果为-6(去掉最高位),即 D 的值为-6,再计算 D + C = E =-10, 由于结果用4 bit的数表示,去掉最高位符位号,值为6,即 E =6,结果正确。上面的运算过程如图所示

 例子2:

        假设3个 4 bit的数进行加法运算: A =7、 B =9、 C =-4, A + B + C =12。

        根据二进制数 的运算规则,首先计算 D = A + B =16

        从运算结果看,如果采用补码进行运算,即使中间运算结果需要用5 bit的数表示,只要最终结果仅需用4 bit的数表示,则在实际电路设计时,中间运算结果仅用4 bit的数运算,也能最终得到正确的结果 

        得出结论即:当多个数进行加法运算时,如果最终的运算结果需要用 N bit 的数表示,则整个运算过程,包括中间运算结果均用 N bit的数表示, 不需考虑中间变量运算溢出的问题


(2)乘法操作

        加法及减法运算在数字电路中实现相对较为简单,在采用综合工 具进行设计综合时,RTL电路图中加法和减法运算会被直接综合成加法器或减法器乘法运算在其他软件编程语言中实现也十分简单,但用 门电路、加法器、触发器等基本逻辑单元实现乘法运算却不是一件容易的事。、

        在采用Xilinx公司FPGA/CPLD进行设计时,如果选用的目标器件(如FPGA)内部集成了专用的乘法器IP核,则Verilog HDL中的乘法运算在综合成电路时将直接综合成乘法器,否则综合成由LUT等基本元件组成的乘法电路。与加法和减法运算相比,乘法器需要占用成倍的硬件资源。当然,在实际FPGA工程设计中,需要用到乘法运算时,可以尽量使用FPGA中的乘法器IP核,这种方法不仅不需要占用硬件资源,还可以达到很高的运算速度。

        在FPGA设计中,乘法运算可分为信号与信号的乘法运算,以及常数与信号的乘法运算。对于信号与信号的乘法运算,通常只能使用乘法器IP核来实现;对于常数与信号的乘法运算,可以通过 移位、加法、减法运算来实现。信号 A 与常数的乘法运算如下:

        A ×16= A 左移4位

        A ×20= A ×16 + A ×4 = A 左移4位 + A 左移2位

        A ×27= A ×32 - A ×4 - A =  A 左移5位 - A 左移2位  - A

        需要注意的是,由于乘法运算结果的位宽比乘数的位宽大,因此 在通过移位、加法和减法运算实现乘法运算前,需要扩展数据位宽, 以免出现数据溢出现象


(3)除法操作

        在Verilog HDL编译环境中,除法、指数、求模、求余 等操作均无法在Verilog HDL中直接进行相关运算。实际上,通过基本逻辑单元构建这几种运算也是十分复杂的工作。如果要用Verilog HDL 实现这些运算,一种方法是使用提供的IP核或使用商业IP核; 另一种方法是将这几种运算分解成加法、减法、移位等运算来实现。

        Xilinx的FPGA一般都提供除法器IP核。对于信号与信号的除法运算,最好的方法是采用提供的除法器IP核;对于除数是常量的除法运算,则可以采取加法、减法、移位运算来实现除法运算。下面 是一些信号 A 与常数进行除法运算。

        A ÷2 ≈ A 右移1位

        A ÷3 ≈ A ×(0.25+0.0625+0.0156) ≈ A 右移2位+ A 右移4位+ A 右移6位

        A ÷4 ≈ A 右移2位

        A ÷5 ≈ A ×(0.125+ 0.0625+0.0156) ≈ A 右移3位+ A 右移4位+ A 右移6位

        需要说明的是,与普通乘法运算不同,常数乘法通过左移运算可以得到完全准确的结果,而除数是常数的除法运算却不可避免地存在 运算误差。采用分解方法的除法运算只能得到近似正确的结果,且分解运算的项数越多,精度越高


参考:杜勇.Xilinx FPGA 数字信号处理设计[M].电子工业出版社:202003.339.

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

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

相关文章

Unity贪吃蛇改编【详细版】

Big and small greedy snakes 游戏概述 游戏亮点 通过对称的美感,设置两条贪吃蛇吧,其中一条加倍成长以及加倍减少,另一条正常成长以及减少,最终实现两条蛇对整个界面的霸占效果。 过程中不断记录两条蛇的得分情况&#xff0c…

【Unity】RPG2D龙城纷争(二)关卡、地块

更新日期:2024年6月12日。 项目源码:后续章节发布 索引 简介地块(Block)一、定义地块类二、地块类型三、地块渲染四、地块索引 关卡(Level)一、定义关卡类二、关卡基础属性三、地块集合四、关卡初始化五、关…

VCG显示——汉字,数字,图像

详细的介绍资料: 【从零开始走进FPGA】 玩转VGA http://www.cnblogs.com/spartan/archive/2011/08/16/2140546.html 【FPGA实验】基于DE2-115平台的VGA显示_vga接口实验 de2-115-CSDN博客 【FPGA】VGA显示文字、彩条、图片——基于DE2-115-CSDN博客 一.VCG原理 1.1…

时序预测 | MATLAB实现TCN-Transformer时间序列预测

时序预测 | MATLAB实现TCN-Transformer时间序列预测 目录 时序预测 | MATLAB实现TCN-Transformer时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.MATLAB实现TCN-Transformer时间序列预测; 2.运行环境为Matlab2023b及以上; 3.data为数…

Python **运算符(python**kwargs:参数解包)(kwargs:keyword arguments)

文章目录 Python中的 ** 运算符:参数解包参数解包基础语法和示例 在函数定义中使用 **示例代码 使用场景和好处1. 灵活性:使用 **kwargs 允许函数设计得更加灵活,可以接受未来可能增加的新参数而无需修改函数定义。2. 可读性和可维护性&#…

Kali中安装和使用docker的学习笔记

一、常见命令 ctrl 、shift、 : 窗口变大; ctrl 、- :窗口变小; ctrl L: 清屏 ; sudo su : 切换root 用户; ip addr / ifconfig: 获取IP地址; systemctl start ssh…

B端颜值无所谓?麻痹自己可以,麻痹业务人员和客户试一试。

很多老铁觉得B端系统颜值和体验无所谓,功能好就行了,我不认同这种说法,我觉得优秀的B端系统应该是内外兼修的,而不是偏科的。你想一想你费尽研发的系统,就是因为颜值问题,你的业务人员没信息推销&#xff0…

北方工业大学24计算机考研情况,学硕专硕都是国家线复试!

北方工业大学(North China University of Technology,NCUT),简称“北方工大”,位于北京市,为一所以工为主、文理兼融,具有学士、硕士、博士培养层次的多科性高等学府,是中华人民共和…

GitLab教程(四):分支(branch)和合并(merge)

文章目录 1.分支(branch)(1)分支的概念(2)branch命令 2.合并(merge)(1)三个命令pullfetchmergegit fetchgit mergegit pull (2)合并冲…

【计算机网络仿真实验-实验2.6】带交换机的RIP路由协议

实验2.6 带交换机的rip路由协议 1. 实验拓扑图 2. 实验前查看是否能ping通 不能 3. 三层交换机配置 switch# configure terminal switch(config)# hostname s5750 !将交换机更名为S5750 S5750# configure terminal S5750(config)#vlan 10 S5750(config-vlan)#exit S57…

PyTorch 维度变换-Tensor基本操作

以如下 tensor a 为例,展示常用的维度变换操作 >>> a torch.rand(4,3,28,28) >>> a.shape torch.Size([4, 3, 28, 28])view / reshape 两者功能完全相同: a.view(shape) >>> a.view(4,3,28*28) ## a.view(4,3,28,28) 可恢复squeeze…

【LLM】吴恩达『微调大模型』课程完全笔记

Finetuning Large Language Models 版权说明: 『Finetuning Large Language Models』是DeepLearning.AI出品的免费课程,版权属于DeepLearning.AI(https://www.deeplearning.ai/)。 本文是对该课程内容的翻译整理,只作为教育用途,不…

数据分析必备:一步步教你如何用matplotlib做数据可视化(2)

1、Matplotlib Anaconda Anaconda是Python和R编程语言的免费开源发行版,用于大规模数据处理,预测分析和科学计算。 该分发使包管理和部署变得简单容易。 Matplotlib和许多其他有用的(数据)科学工具构成了分发的一部分。 包版本由包管理系统Conda管理。 …

旅游网站(携程旅行网页学习 vue3+element)

旅游网站 1. 创建项目 在你要创建项目的路径下打开vscode,新建终端,然后输入vue ui,进入Vue项目管理器。选择“创建”,确定项目路径,并点击“在此创建新项目”。在项目文件夹中输入项目名称,点击下一步;选…

CMU最新论文:机器人智慧流畅的躲避障碍物论文详细讲解

CMU华人博士生Tairan He最新论文:Agile But Safe: Learning Collision-Free High-Speed Legged Locomotion 代码开源:Code: https://github.com/LeCAR-Lab/ABS B站实际效果展示视频地址:bilibili效果地址 我会详细解读论文的内容,让我们开始吧…

Python读取wps中的DISPIMG图片格式

需求: 读出excel的图片内容,这放在微软三件套是很容易的,但是由于wps的固有格式,会出现奇怪的问题,只能读出:类似于 DISPIMG(“ID_2B83F9717AE1XXXX920xxxx644C80DB1”,1) 【该DISPIMG函数只有wps才拥有】 …

关于使用‘rt-thread-master‘包从新创建对应开发板型号工程遇到相关问题

问题1:裁剪完成后在ENV中使用命令每次使用scons --targetmdk5重新生成工程后在工程中自己选择的单片机型号会变成默认问题 解决: 通过生成的“template.uvprojx”打开工程,在devicezhong 更改成自己要选择的单片机型号,然后保存;再次通过&qu…

IDEA创建SpringBoot项目教程,讲解超详细!!!(2024)

前言 在创建Spring Boot项目时,为了确保项目的顺利构建和运行,我们依赖于JDK(Java开发工具包)和Maven仓库。 JDK作为Java编程的基础,提供了编译和运行Java应用程序所需的核心类库和工具。 JDK安装配置教程&#xff1…

大数据工程师如何做到数据可视化?

好的数据可视化作品都是通过不断的数据对比分析实战出来的。 今天给大家带来一篇大数据工程师干货,从多角度解析做数据可视化的重要性,并解读一些适用的应用场景。大数据工程师们刷到这篇文章时一定要进来看看,满满的干货。 目录 1. 什么是数…

【Java】图书管理系统-控制台输出

项目原码压缩包在我主页的资源中免费领取。(在IDEA中运行,启动类在src -> Main 中运行) 图书管理系统 设计一个简单的控制台输出的图书管理系统,我们首先需要明确其基本功能、设计内容以及设计要求。这个系统可以包括以下几个…