数的表示形式
1FPGA中的二进制数可以分为定点数和浮点数两种格式。负数的表示形式1补码原码的优点是乘除运算方便无论正负数乘除运算都一样并以符号位决定结果的正负号若做加法则需要判断两个数符号是否相同若做减法还需要判断两个数绝对值的大小而后用大数减小数。补码的优点是加法运算方便无论正负数均可直接加且符号位同样参与运算如果符号位发生进位把进位的1去掉余下的即为结果。2负数的补码负数的补码等于数据的位宽减去负数的绝对值例如-16d600等于-16h258等于2^16-60016hfda8-16h258和16hfda8个位相加等于16其余位相加等于15。3计算机的减法减去一个数等于加上另一个整数同余数这个数与减数的绝对值相加正好等于模。这个数正好等于减数的补码。所以负数补码正好等于模减去负数的绝对值FPGA数的加/减法1B比特的二进制数如当做无符号整数表示的范围为如当做有符号整数表示的范围为2如果二进制数的表示范围没有溢出将运算数据均当做无符号数或有符号数则运算结果正确3两个B比特的二进制数做加/减法运算如要确保运算结果不溢出需要B1位数据存放运算结果4两个二进制数据进行加/减法运算只要输入数据相同则不论是当做有符号数还是无符号数其运算结果的二进制数完全相同。FPGA乘法运算乘法运算在其他软件编程语言中实现也十分简单但用门电路、加法器、触发器等基本数字电路元件实现乘法功能却不是一件容易的事。用Xilinx公司器件做FPGA/CPLD设计时如果选用的目标器件内部集成了专用的硬件乘法器核则VHDL语言的乘法运算符在综合成电路时将直接综合成硬件乘法器否则综合成由LUT等基本元件组成的乘法电路设计中遇到的乘法运算可分为信号与信号之间的运算以及常数与信号之间的运算。对于信号与信号之间的运算通常只能使用乘法器核实现而对于常数与信号之间的运算则可以通过移位及加减法实现。信号A与常数相乘运算操作的分解例子如下。A×16A左移4位A×20A×16A×4A左移4位A左移2位A×27A×32−A×4−AA左移5位−A左移2位−A需要注意的是由于乘法运算结果的数据位数比乘数的数据位数多因此在用移位及加法操作实现乘法运算前需要将数据位数进行扩展以免出现数据溢出现象。1对于字长分别为M、N的数据进行乘法运算需要采用MN位字长的数据才能得到准确的结果。2对于乘法运算不需要通过扩展位数来对齐乘数的小数点位置。当乘数为小数时乘法结果的小数位位数等于两个乘数的小数位位数之和。3当需要对乘法运算结果截取时为保证得到正确的结果只能取高位而舍去低位数据这样相当于降低了运算结果的精度。4只有当两个乘数均为所能表示的最小负数最高位为1其余位均为0时才有可能出现最高位与次高位不同的情况。也就是说只有在这种情况下才需要MN位字长的数据来存放准确的最终结果其他情况下实际上均有两位相同的符号位只需要MN−1位字长即可存放准确的运算结果。乘加运算中的有效数据位前面讨论运算结果的有效数据位时都是指参加运算的信号均是变量的情况。在数字信号处理中通常会遇到乘加运算的情况一个典型的例子是有限脉冲响应Finite Impulse ResponseFIR滤波器的设计。当乘法系数是常量时最终运算结果的有效数据位需要根据常量的大小来重新计算。比如需要设计一个FIR滤波器假设滤波器系数为[13−3874999974−3813]如果输入数据为N比特的二进制数则滤波器输出最少需要采用多少位来准确表示呢显然要保证运算结果不溢出我们需要计算滤波器输出的最大值并以此推算输出的有效数据位数。方法其实十分简单只需要计算所有滤波器系数绝对值之和再计算表示该绝对值之和所需的最小无符号二进制数据位n则滤波器输出的有效数据位数为Nn。对于这个实例可知滤波器绝对值之和为448至少需要9比特二进制数表示因此n9。FPGA除法对于信号与信号之间的除法运算最好的方法是采用ISE提供的现成IP核而对于除数是常量的除法运算则可以采取加、减、移位运算来完成除法功能。下面是一些信号A与常数相除运算操作的分解例子。A÷2≈A右移1位A÷3≈A×(0.250.06250.0156)≈A右移2位A右移4位A右移6位A÷4≈A右移2位A÷5≈A×(0.125 0.06250.0156)≈A右移3位A右移4位A右移6位指数指数性质若a0 且对于任意正实数 N指数形式对数形式换底公式不同底数的对数可互相转换运算规则增长速度远慢于线性函数n是 “高效算法” 的典型复杂度比如这是因为不同场景下 “log” 的默认底数约定不同算法 / 计算机领域log默认指以 2 为底因为计算机是二进制系统比如二分法、位运算都和 2 相关计算器 / 数学教材非计算机方向log默认指以 10 为底的常用对数记为lg而自然对数用ln表示。