购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.2 信号位宽

2.2.1 无符号整数信号的位宽

在RTL中每根信号线都有自己的位宽,位宽由该信号的数值范围决定。例如,一个普通的整数信号,其表示范围是0~100,则它的位宽使用对数方法确定,计算如式(2-5)所示,最后结果6.6向上取整得到7,因此该信号需要7位。注意,位宽的确定是向上取整,不是四舍五入,因此如果计算结果为6.1,仍然需要7位。比如,一个信号的范围是0~68,它的位宽也应该是7位,因为6位最大只能表示63。

若使用对数法后得到的是整数,则实际位宽是该整数加1。比如某信号表示范围为0~32,对数法计算得到整数5,那么实际需要6位,因为5位最大只能表示31。

2.2.2 无符号浮点信号的位宽

浮点信号是信号中既有整数部分,又有小数部分,它所传输的数据是一个浮点数。实际电路中不存在真正意义上的浮点信号,所有信号均以整数形式传导,只是在概念和思想上,设计者认为它是浮点数,并且通过一定的转换方法将浮点数和实际表示的整数之间来回转换。转换方法将在2.5节进行说明,这里主要关注位宽。

假设一个浮点信号,其整数部分变化范围是0~100,且要求小数精度为0.001。遂可将位宽分为整数和小数两部分。整数位宽由式(2-5)介绍的方法来确定,小数部分同样使用对数方法,如式(2-6)所示,其结果为-9.97,说明要满足精度需要10位小数。

设计者可以进行验算,若使用9位小数,则精度为2 -9 ≈0.00195,而10位小数的精度为2 -10 =0.0009765625,也证明了需要10位小数才能满足要求。

综上,该浮点信号的整数部分和小数部分合计需要17位。

在算法研究中,研究者往往从习惯出发,以十进制来定义指标,这样一方面便于理解,另一方面也便于向用户展示和说明算法的效果。但在电路中,这些数据均以二进制形式表示。这就使得电路实现上无法恰好满足性能指标,实现时只能比提出的性能指标精度再略高一点,比如上例中提出的指标是小数点精度为0.001,但实现后的精度是0.0009765625。

软硬件设计都必须认识到,所谓二进制、八进制、十进制、十六进制,乃至任何进制,都是表示整数的方法。一个整数无论表示为何种进制,它们均是同一个数。

2.2.3 有符号信号的位宽

算法逻辑中包含许多有符号的数据,虽然它们在电路中表现为无符号,但在概念和思想上,它们是有符号的。这种电路表示和概念表示的区别,就是补码与原码的区别。整数信号和浮点信号都有可能带符号,其位宽就是在无符号位宽的基础上加1即可,多出来的符号位放在高位。

例如一个有符号信号,其变化范围是-32~21。欲确定其位宽,必先看其绝对值。绝对值最大为32,需要6位。那么是否需要再加1位符号,用7位表示该信号呢?实际上是不需要的,因为补码的负数表示范围比正数多1,用6位可以表示-32,若开辟7位则会浪费电路面积。

2.2.4 特殊取值范围的位宽处理

在电路设计中最常见的无符号信号均以0为最小值,但也有例外。例如,某信号abc的变化范围是70~100,若仍以7位表示abc是允许的,但也造成了位宽浪费,其最高位一直为1。

此时,需要考虑应用场景。若后级模块需要abc提供范围在70~100的确切数据,则abc就使用7位表示。若后级模块只关心abc的变化,不需要它的具体数值,则可以删除最高位,保留6位,或者直接将70映射为0,100映射为30,用5位表示。

再比如一个信号表示一个圆周弧度,其表示范围是0~2π,用上文介绍的方法,假设小数精度要求是0.125,则小数部分需要3位,整数部分需要3位,共6位。实际中往往不使用上述线性位宽确定方法,因为线性表示无法准确表达对圆周进行若干位等分。对于弧度的精度,一般不设定为小数精度,而是将圆周设定为几等分。比如,将圆周分为64等分,则该信号的位宽就是6位,数值单位是2π/64≈0.098rad。对比圆周等分表示和线性表示,可以发现同样的位宽下,圆周等分表示的精度更高,因而该表示方法在CORDIC和FFT等算法的运用中很常见。

总之,信号的数值单位没有一定之规,设计者需要根据数值的物理意义和数值范围,自行定义其单位,以达到表意清晰、位宽紧凑的目的。数值单位确定后,位宽也随之确定。

2.2.5 MSB和LSB

一个信号的最高位称为最高有效位(Most Significant Bit,MSB),最低位称为最低有效位(Least Significant Bit,LSB)。可见,同样是信号线,其重要性是有所区别的。LSB的单位代表着该信号的精度。

从电路角度看,LSB的单位总是1,但实际上根据物理意义的不同,LSB的单位也是不同的。在2.2.2节的例子中,小数位是10位,因此该信号的LSB单位就是0.0009765625,即该信号的值变化1,实际代表变化了0.0009765625。再比如2.2.4节所举的圆周等分的例子,其LSB的单位是0.098 rad,即该信号的值变化1,代表实际变化了0.098 rad。

在实际输出的结果中,常常允许LSB存在一个单位的差错。比如假设LSB的单位是1,输出的信号值有时为11,有时为10,从算法角度看,这两个值没有区别。如果不允许混淆11和10,说明系统对精度有着更高的要求,则应该以0.5作为LSB的单位,将位宽向低位扩展1位。总之,在设计计算电路时,输出的信号应该比要求的位宽多保留1位,以便能容纳LSB的一个单位差异。如果不希望多保留位宽,但精度上还要实现多保留1位的精度,则对结果进行四舍五入处理是唯一的办法。

在数模混合电路中,LSB以及更高的若干位,可能都淹没在噪声中。比如模-数转换器(Analog-to-Digital Converter,ADC)电路,高位的若干信号反映真实的采样值,低位的信号是真实采样值与噪声的混合,其真实值难以分辨。

2.2.6 信号的范围和精度

总结上文的论述,可以看出,决定浮点信号位宽的两个因素分别是范围和精度。如果位宽是一定的,则范围和精度就会争夺这块有限的位宽资源。若分配给范围的位宽多,则计算精度就变低,反之,则精度虽然保证,但表示的范围缩小。

范围和精度在电路设计中都有限定条件。为了保证在有限的位宽内能够表示较宽范围的数据,需要将精度的要求降低。反之,为了在有限的位宽内能够保证数据精度,需要对信号进行溢出保护。如果既给予了高精度,又没有进行溢出保护,则一旦数据发生溢出,运算结果将完全错误。因此,相对而言,保护范围,使信号不溢出,比保证计算精度要重要得多。前者是对与错的问题,后者是精确度问题。

在进行电路设计时,需要理解数据的取值范围、精度和位宽三者的矛盾关系。按照一定方法来确定位宽资源的分配。

对于整数信号而言,单位固定为1,不包含精度的概念,因而确认其取值范围和确认位宽是同一个问题。

对于浮点信号而言,由于它们在电路中也是以整数形式存在,对于简单的加减问题,由于计算前后单位不变,常将其作为整数处理,而不讨论精度。但对于乘法,计算结果的单位会发生改变,就必须考虑精度。对于除法,问题更为复杂,具体方法详见第5章。

2.2.7 信号变化范围的确定

上述确定信号位宽的方法,是在已经获悉信号变化范围的前提下进行的。根据信号的不同,获取变化范围的途径也不同。

对于输入到电路端口的信号,只能通过仿真、查阅协议规定或者是听从架构师和算法工程师的意见来获悉其范围。比如,若ADC的输出位宽是确定的,则后续模块从ADC获得的数据位宽也就被动地确定了。有些输入信号的范围需要算法仿真确认,需要搭建整体的算法应用环境,加入特定的干扰,比如无线通信中的高斯白噪声、多普勒、瑞利信道、莱斯信道、小尺度模型、大尺度模型、色散和阴影衰落等因素,从而排除不切实际的数值范围,使得后续电路中的运算可以聚焦在一个较小的范围内。

对于输出端口信号,一方面要看前级的输出位宽,另一方面要看后级的电路需要。如图2-3所示的结构,本级运算产生的数据要输出到数-模转换器(Digital-to-Analog Converter,DAC)中。DAC的位宽要求可由后级的模拟电路以及整套应用环境而定。既然DAC的输入位宽是确定的,则本级运算的输出数据的位宽可等于DAC的输入位宽,或比DAC的输入位宽大1。继而可推知,前级运算输出的位宽也不宜过大,否则就会增加本级运算的面积,而且输出的位宽会被截取,造成无效运算。

图2-3 一个输出位宽确定的例子

除端口外,内部各运算单元,如果是简单运算,可使用极限分析法来确定其范围,如果是复杂运算,就需要将该单元单独建模仿真,获得满足要求的性能后,逐一确定内部每个信号的范围。

总之,对于一个大的系统,端口位宽和取值范围的推测首先来自ADC、DAC等数模接口的选型以及整体的应用仿真。然后,从端口向内逐级确定每个模块的输入、输出位宽。对于模块内部信号的取值范围,使用极限分析或仿真等方法来确定。不同的模块、不同的需求有着不同的确定方法,不能一概而论。较为复杂的模块,一般包含加、减、乘、除、移位、截位、寄存器打拍等多种内部元器件,其背后还有算法原理的支撑,要设计此类模块,需要进行算法仿真和定点化。而对于加、减、乘、移位等简单运算,可通过更为简单的方式对取值范围和位宽进行确定,下面将介绍一些简单运算的位宽确定方法。

2.2.8 运算结果的位宽

对于简单的整数加、减、乘运算而言,常用极限分析法来确定其取值范围。该方法的要领是先确认参与运算的各输入信号的取值范围,然后通过计算器等工具确定计算结果的范围,最后编写RTL。

1.无符号二元加法的位宽

习惯上,两个无符号信号相加,结果的位宽是参与运算的最大位宽加1。例如两个信号,一个是7位,另一个是3位,相加后位宽为8位。

使用极限分析法分析,位宽为7位、最大值为127,位宽为3位、最大值为7,两者相加,最大值为134,使用对数方法可知该数需要8位方能表示。该结论与习惯方法一致。

需要注意的是,这里假设参与运算的信号,其变化范围分别是0~127和0~7。在设计中也经常有虽然位宽相同,但取值范围并没有占满的情况,比如,某个信号的取值范围是0~70,也占7位。但将该信号与一个3位信号相加,结果最大值为77,仍可以用7位表示。在电路设计中,如果要做到性能不下降但面积最优,就必须做到其中每个信号的取值范围都了然于胸。

2.无符号多元加法运算的位宽

假设需要进行的运算以Verilog方式表达如下,参与运算的信号均为3位无符号数,需要确定输出信号d的位宽。

使用极限分析法分析,6个参与运算的信号的最大值均为7,则d的最大值为42,使用对数方法可知d需要6位。

在电路设计中是允许连续的加、减、乘运算出现的,综合器对此类表达的支持也越来越好。但在一些设计中,遇到此类问题就将其拆解为二元运算,反而会浪费面积。

3.无符号多元加减混合运算的位宽

假设需要进行的运算以Verilog方式表达如下,参与运算的信号均为3位无符号数,需要确定输出信号f的位宽。

使用极限分析法分析,5个参与运算的信号的最大值均为7。它们结合后,最小值为-21,最大值为14,因此f可能出现负数,需要扩展1位符号位。根据2.2.3节所介绍的方法,可知f的位宽为6位。

4.有符号多元加减混合运算的位宽

为方便对比,仍然使用无符号的例子,但参与运算的信号改为3位有符号数。仍然使用极限分析法,则每个输入信号的变化范围都是-4~3。结合后,f的取值范围是-17~18。根据2.2.3节所介绍的方法,可知f的位宽为6位。

5.无符号二元乘法的位宽

习惯上,无符号二元乘法后的位宽为两个因数信号位宽之和。例如两个因数,一个位宽为4,另一个位宽为3,则相乘后位宽为7。

使用极限分析法分析,位宽为4,则取值范围为0~15;位宽为3,则取值范围为0~7。相乘后结果的范围为0~105。使用对数方法,可知结果需要7位,与习惯方法一致。

6.有符号二元乘法的位宽

作为对比,仍采用上面的例子,位宽为4的有符号信号,其取值范围是-8~7,位宽为3的有符号信号,其取值范围为-4~3。相乘后结果的取值范围是-28~32。使用2.2.3节所述方法得位宽为7。因此在习惯上,凡是两个信号相乘,无论它们是否有符号,结果的位宽都是参与信号位宽之和。

这样确立的位宽比较浪费资源,因为32是唯一需要用到7位的有符号数,剩下的-28~31都只需要6位。若以6位表示32,即6'b100000,按照补码原则,它其实表示的是-32,因此,要想表示32必须用7位。为了多表示一个数而增加1位是比较浪费资源的,特别是这一结果还要被后续电路所使用,进一步增加了后续电路的面积。因此,很多设计中虽然在做乘法时开辟了7位,但不直接输出,而是先做一个溢出保护,将位宽缩减为6位后再输出。

7.无符号多元乘法的位宽

假设需要进行的运算以Verilog方式表达如下,参与运算的信号均为3位无符号数,需要确定输出信号f的位宽。

使用极限分析法分析,5个参与运算的信号的最大值均为7。它们结合后,结果的取值范围是0~16807,使用对数方法可知f需要15位,即这些因数的位宽之和。

8.有符号多元乘法的位宽

作为对比,仍采用上面的例子,但参与运算的信号均为3位有符号数。输出信号f的取值范围是-1024~768,根据2.2.3节所述方法,需要11位。在因数具有相同位宽的情况下,有符号的情况需要的位宽更小。可以总结出一条规律,有符号多元乘法的结果位宽 y 符合式(2-7),其中, x 为无符号多元乘法结果位宽, n 为参与运算的因数数量。

9.除法的位宽

除法不同于加、减、乘运算,即便是两个整数信号相除,商也是浮点信号。比如一个3位无符号信号,除以一个2位无符号信号,只能确定商的取值范围是0~7(已忽略除数为0导致结果为∞的情况),最终保留多少位精度,是由系统整体规划决定的。

10.浮点数运算的位宽

本节讨论的运算规律均为整数运算的规律。

浮点信号的加减法在计算前后单位不变,可将其作为整数处理。

浮点信号的乘法一般会经历两个过程,先忽略浮点单位,以整数形式相乘,然后根据参与乘法的因子的单位,决定乘法输出的单位,为了获得合适的输出单位,常常发生截位。

例如,将电流和电压相乘得到功率的运算,输入电流为7'b1101001,单位是2 -3 A,输入的电压为4'b0110,单位是2 -1 V,两者相乘结果为11'b01001110110,单位是2 -4 W。这是第一步运算。第二步运算是调整输出单位。假设系统要求输出单位是W,则当前计算结果多了4位精度,截位后得到7'b0100111。

浮点信号除法的输出,其单位仍然受限于系统设定,内部运算的过程详见第5章。 pUWj3jJN4CT6AS54lOvUDQ/aJzIDgNiLBZkI78agzMmdWffl3+cWYnrOUVxZI28f

点击中间区域
呼出菜单
上一章
目录
下一章
×