锁相环技术原理及FPGA实现(第二章2.1)

        数字信号是指时间和幅度均是离散的信号,时间离散是指信号在时间上的不连续性,且通常是等间隔的;幅度离散是指信号的幅度值只能取某个区间上的有限值,而不能取区间上的任意值。当使用计算机或专用硬件处理时域离散信号时,因受寄存器或字长限制,这时的信号实际上就是数字信号。物理世界上的原始信号大多是模拟信号,在进行数字信号处理之前需要将模拟信号数字化,数字化的过程中会带来误差。本章将对数的表示及运算、有限字长效应等内容展开讨论。与 DSP、 CPU 不同, FPGA没有专用的 CPU 或运算处理单元,程序运行的过程其实是庞大电路的工作过程,几乎每个加、减、乘、除等操作都需要相应的硬件资源来完成。 Altera 公司的 FPGA 开发套件 QuartusII 提供了丰富且性能优良的常用运算模块及其他专用知识产权(IP)核,熟练掌握并应用这些 IP 不仅可以提高设计效率,还可以有效提高系统的性能。本章将详细介绍几种最常用的运算处理模块,并在后续章节中使用这些模块进行设计。

2.1 FPGA 中数的表示

2.1.1 莱布尼兹与二进制

在德国图灵根著名的郭塔王宫图书馆(Schlossbiliothke zu Gotha)保存着一份弥足珍贵
的手稿,其标题为: “1 与 0,一切数字的神奇渊源,这是造物主的秘密美妙的典范。因为
一切无非都来自上帝。”这是德国通才大师莱布尼兹(Gottfried Wilhelm Leibniz,见图 2-1)
的手迹。但是,关于这个神奇美妙的数字系统,莱布尼兹只有几页异常精炼的描述。用现
代人熟悉的表达方式,我们可以对二进制做如下的解释。

        以此类推,把等号右边的数字相加,就可以获得任意一个自然数,或者说任意一个自然数均可以采用这种方式进行分解。我们只需要说明的是采用了 2 的几次方,而舍掉了 2的几次方。二进制的表述序列都从右边开始,第一位是 2 的 0 次方,第二位是 2 的 1 次方,第三位是 2 的 2 次方,以此类推。一切采用 2 的次方的位置,我们就用 1 来标志;一切舍掉 2 的次方的位置,我们就用 0 来标志。例如,对于序列 11100101,根据上述表示方法,可以很容易推算出序列所表示的数值。

        在这个例子中,十进制数字 229 就可以表述为二进制数字 11100101。任何一个二进制数字最左边的一位都是 1。通过这个方法,用 1 到 9 和 0 这十个数字表述的整个自然数列都可用 0 和 1 这两个数字来代替。 0 与 1 这两个数字很容易被电子化:有电流就是 1,没有电流就是 0。这就是整个现代计算机技术的根本秘密所在。
        1679 年,莱布尼兹写了题为“二进制算术”的论文,对二进制进行了充分的讨论,并建立了二进制的表示及运算。随着电子 计算机 的广泛应用,二进制进一步大显身手。因为电子计算机是用电子元件的不同状态来表示不同的数码的,如果要用十进制就要求元件能准确地变化出十种状态,这在技术上是非常难实现的。二进制只有两个数码,只需两种状态就能实现,这正如一个开关只有开和关两种状态。如果用开表示 0,关表示 1,那么一个开关的两种状态就可以表示一个二进制的数。由此我们不难想象,五个 开关 就可以表示五个二进制的数,这样运算起来就非常方便。

2.1.2 定点数表示

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

        给出。每一个 ai 的值取 1 或 0。最左端的位 aB-1 称为最高位(Most Significant Bit,MSB),最右端的位 a-b 称为最低位(Least Significant Bit, LSB)。式(2-2)是当二进制数正数时与十进制数之间的对应关系,当二进制数为负数时,数值与十进制数的对应关系与二进制数表示形式有关。

        表示一个数的一组数字称为字,而一个字包含位的数目称为字长。字长的典型值是一个为 2 的幂次方的正整数,如 8、 16、 32 等。字的大小通常用字节(Byte)来表示,一个字节有 8 个比特。
        2.定点数的三种形式
        定点数有三种表示形式:原码、反码及补码。这三种表示方法在 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 的二进制原码表示为(x)2=1Δ110,反码为 1Δ001,其补码为 1Δ010。值得一提的是,如果将二进制数的符号位定在最右边,即二进制数表示整数,则负数的补码与负数绝对值之间也有一个简单的运算关系:补码当作正整数,补码的整数值+原码绝对值的整数值=2B。还是上面相同的例子,十进制数-0.75 的二进制原码表示为(x)2=1Δ110,反码为 1Δ001,其补码为 1Δ010。补码 1Δ010的符号位定在最末位,且当作正整数 1010Δ,十进制数为 10,原码 1Δ110 的符号位定在最末位,且取绝对值的整数 0110Δ,十进数为 6,则 10+6=16=24。在二进制运算过程中,补码最重要的特性是可以将减法用加法运算的规则实现。
        原码的优点是乘除运算方便,不论正负数,乘除运算都一样,并以符号位决定结果的正负号;若做加法则需要判断两个数符号是否相同;若做减法,还需要判断两个数绝对值的大小,而后用大数减小数。补码的优点是加减法运算方便,不论正负数均可直接相加,且符号位同样参与运算。

2.1.3 浮点数表示

        1.浮点数的定义及标准
        浮点数是属于 有理数 中某特定子集的数的数字表示,在 计算机 中用来近似表示任意某个实数。 具体地说,这个实数由一个整数或定点数(即 尾数 )乘以某个 基数 的整数次幂 得到,这种表示方法类似于基数为 10 的 科学记数法 。一个浮点数 A 由 m 和 e 两个数来表示, 即A=m×be。 在任意一个这样的数字表示系统中我们需要确定两个参数: 基数 b(记数系统的基)和 精度 B(使用多少位来存储)。 m(即尾数 )是 B 位二进制数,如±d  ddd…ddd。如果 m 的第一位是非 0 整数, m 称作规格化后的数据。一些数据格式使用一个单独的符号位 s(代表+或者-)来表示正负,这样 m 必须是正的。 e 在浮点数据中表示基的指数。采用这种表示方法,可以在某个固定长度的存储空间内表示定点数无法表示的更大范围的数。此外,浮点数表示法通常还包括一些特别的数值: +∞和-∞(正负无穷大),以及 NaN(Not a Number)等。无穷大用于数太大而无法表
示的时候, NaN 则指示非法操作或者出现一些无法定义的结果。
        大部分计算机采用二进制(b=2)的表示方法。 位 (bit)是衡量浮点数所需存储空间的单位,通常为 32 位或 64 位,分别叫作 单精度 和 双精度 。一些计算机提供更大的浮点数,例如, Intel公司的浮点运算单元 Intel 8087 协处理器 (以及集成了该协处理器的其他产品)提供 80 位长的浮点数,这种长度的浮点数通常用于存储浮点运算的中间结果。还有一些系统提供 128 位的浮点数(通常用软件实现)。
        在 IEEE 754 标准 之前,业界并没有一个统一的浮点数标准。很多计算机制造商都设计自己的浮点数规则和运算细节。那时,实现的速度和简易性比数字的精确性更受重视,这种情况给 代码 的 可移植性 造成了不小的困难。直到 1985 年, Intel 打算为它的 8086 微处理器 引进一种浮点数 协处理器 的时候,聘请了加州大学伯克利分校最优秀的数值分析家之一, William Kahan教授,来为 8087 FPU 设计浮点数格式。 William Kahan又找来两个专家来协助他,于是就有了 KCS 组合(Kahn, Coonan and Stone),并共同完成了 Intel的浮点数格式设计。
        Intel的 KCS 浮点数格式完成得如此出色,以致于 IEEE决定采用一个非常接近 KCS 的方案作为 IEEE 的标准浮点格式。 IEEE于 1985 年制订了 二进制浮点运算标准 ( BinaryFloating-Point Arithmetic) IEEE 754,该 标准 限定指数的底为 2,同年被美国引用为 ANSI标准。目前,几乎所有计算机都支持该标准,大大改善了科学应用程序的可移植性。考虑到 IBM System/370 的影响, IEEE于 1987 年推出了与底数无关的二进制浮点运算标准 IEEE854, 同年该标准也被美国引用为 ANSI 标准 。1989 年, 国际标准组织 IEC 批准 IEEE 754/854为国际标准 IEC 559:1989,后来经修订,标准号改为 IEC 60559。现在,几乎所有的 浮点处理器 完全或基本支持 IEC 60559。

        2.单精度浮点数据格式
        IEEE 754 标准定义了 浮点数的存储格式 ,包括部分特殊值的表示(无穷大和 NaN);
同时给出了对这些数值进行浮点操作的规定。它也制定了 4 种取整模式和 5 种例外
(Exception),包括何时会产生例外,以及具体的处理方法。
        在 IEEE 754 中规定了 4 种浮点数的表示格式:单精度(32 位浮点数)、双精度(64 位
浮点数)、单精度扩展( ≥43 位,不常用)、双精度扩展( ≥79 位,通常采用 80 位进行实现)。
事实上,很多计算机语言都遵从了这个标准,包括可选部分。例如, C 语言 在 IEEE 754 发布之前就已存在,现在它能完美支持 IEEE 754 标准的单精度和双精度运算,虽然它早已有另外的浮点实现方式。

        单精度(IEEE Single-Precision Std.754)浮点数据格式如图 2-2 所示。

        符号数 S(Sign)占 1 bit, 0 代表正号, 1 代表负号;指数位 E(Exponent)占 8 bit, E
的取值范围为 0~255(无符号整数),实际数值 e=E-127,有时 E 也称为移码,或不恰当地
称为阶码(阶码实际应为e); 尾数位M(Mantissa)占23 bit, M也叫作有效数字位(Significant)、
        系数位(Coefficient),甚至被称作小数。在一般情况下, m=(1.M)2,使得实际的作用范围为1≤尾数<2。为了对 溢出 进行处理,以及扩展对接近 0 的极小数值的处理能力, IEEE 754对 M 做了一些额外规定。

        (1) 0 值:以指数 E、尾数 M 全零来表示 0 值。当指数位 S 变化时,实际存在正 0 和负0 两个内部表示,其值认为都等于 0。
        (2) E=255、 M=0 时,用作 无穷大 (或 Infinity、 ∞)。根据符号不同,又有+∞、 -∞。
NaN: E=255、 M 不为 0 时,用作 NaN(Not a Number, “不是数”之意)。浮点数所表示的具体值可用下面的通式表示

式中,尾数(1.M) 中的 1隐藏位。还需要特别注意的是,虽然浮点数的表示范围及精度与定点数相比有很大的改善,但因为浮点数毕竟也是以有限的 32 bit 长度来反映无限的 实数 集合,因此大多数情况下都是一个 近似值 。表 2-1 是几个浮点格式数据与实数之间的对应关系表。

3.一种适合 FPGA 处理的浮点数据格式
        与定点数相比,浮点数据虽然可以表示更大范围、更高精度的实数,然而在 FPGA 器件中实现时却需要占用成倍的硬件资源。例如,加法运算,两个定点数据直接相加即可,浮点的加法却需要更为繁杂的运算步骤。

对阶操作:比较指数大小,对指数小的操作数的尾数做移位,完成尾数的对阶操作。
 尾数相加:对对阶后的尾数进行加(减)操作。
 规格化:规格化有效位并且根据移位的方向和位数修改最终的阶码。
这一系列操作不仅需成倍地消耗 FPGA 内部的硬件资源,也会成倍地降低系统的运算
速度。对于浮点数乘法操作来说,一般需要以下的操作步骤。
 指数相加:完成两个操作数的指数相加运算。
 尾数调整:将尾数 M 调整为 1.M 的补码格式。
 尾数相乘:完成两个操作数的尾数相乘运算。
 规格化:根据尾数运算结果调整指数位,并对尾数进行舍入截位操作,规格化输出
结果。
        浮点乘法器的运算速度主要由 FPGA 内部集成的硬件乘法器决定。如果将 24 位的尾数
修改为 18 位的尾数,则可在尽量保证运算精度的前提下最大限度地提高浮点乘法运算的速
度,同时也可大量减少所需的乘法器资源(大部分 FPGA 芯片内部的乘法器核均为 18 bit 18
bit。 2 个 24 bit 数的乘法操作需要占用 4 个 18 bit 18 bit 的硬核乘法器, 2 个 18 bit 数的乘
法操作只需占用 1 个 18 bit 18 bit 的硬核乘法器)。 IEEE 标准中尾数设置的隐藏位主要是考
虑节约寄存器资源,而 FPGA 内部具有丰富的寄存器资源,如直接将尾数表示成 18 bit 的补码格式,则可去除尾数调整的运算,也可以减少一级流水线操作。
        文献[20]根据 FPGA 内部的结构特点定义了一种新的浮点数据格式,如图 2-3 所示。

图中, e 为 8 位有符号数(-128≤e≤127); f 为 18 位有符号小数(-1≤f<1)。自定义浮
点数所表示的具体值可用下面的式(2-5)表示。

为便于数据规格化输出及运算,规定数值 1 的表示方法为指数为 0,尾数为
B“01_1111_1111_1111_1111”;数值 0 的表示方法为指数为-128,尾数为 0。这种浮点数据格
式与单精度格式的区别在于:自定义格式将原来的符号位与尾数位合并成 18 bit 的补码格式
定点小数,表示精度有所下降,却可大大节约乘法器资源(由 4 个 18 bit 18 bit 乘法器减
少到 1 个),从而达到有效减少运算步骤并提高运算速度(由二级 18 bit 18 bit 乘法运算减
少到一级运算)的目的。表 2-2 是几个自定义浮点格式数据与实数之间的对应关系表。

猜你喜欢

转载自blog.csdn.net/qq_43416206/article/details/135315834