浮点运算近似为定点运算

880 阅读6分钟

已知输入信号a,b,c和输出y均为8bit信号,a/b/c/y的取值范围为0-255,设输入时钟为clk,复位信号rst_n。

试用verilog,y=0.511a-0.464b-0.047c+128;

1 要有四舍五入功能

2 中间运算过程保留小数点后两位,即系数用10bit表示

3 输出与输入相比有两级延迟,合理使用DFF delay

4 避免出现溢出

十进制的小数到二进制的转换

乘法取整

二进制到十进制的转换

从小数点后开始,依次乘以2的负一次方,2的负二次方,2的负三次方等

二进制乘法

这两种数制的乘法都是把被乘数和乘数的每一位分别相乘,然后将得到的乘积根据所乘的乘数的位数进行移位。

二进制除法

和乘法一样,二进制直接相除

浮点定标:

数的定标就是将要运算的浮点数扩大很多倍,然后取整,再用这个数进行运算,运算得到的结果再缩小相应的倍数就可以了。在设计中,一定不要忘记小数点。在FPGA 中是体现不出来小数点的,小数点的位置只有程序员知道。Q表示小数点的位置,Q15就表示小数点在第15位。

浮点数(x)转换为定点数(xq): xq=(int)x*2^Q

定点数(xq)转换浮点数(x): x= (float)xq*2^(-Q)

比如,16进制数2000H,用Q0表示就是8192;若用Q15表示,则为0.25。

介绍Q格式运算中Q值的确定:

(1)定点加减法:需要转换成相同Q格式才能加减

(2)定点乘法:不同Q格式的数据相乘,相当于Q值相加

(3)定点除法:不同Q格式的数据相除,相当于Q值相减

(4)定点左移:相当于Q值增加

(5)定点右移:相当于Q值减少

Q15表示的4000H(浮点数0.5)乘以Q15表示的4000H,4000H×4000H=1000 0000H,乘完之后Q值变为15+15=30,即结果为0.01B,即为浮点数0.25。

不同的Q所表示的数不仅范围不同,而且精度也不相同。Q越大,数值范围越小,但精度越高;相反,Q越小,数值范围越大,但精度就越低。例如,Q0 的数值范围是一32768到+32767,其精度为1,而Q15的数值范围为-1到0.9999695,精度为1/32768=0.00003051。

因此,对定点数而言,数值范围与精度是一对矛盾,一个变量要想能够表示比较大的数值范围,必须以牺牲精度为代价;而想精度提高,则数的表示范围就相应地减小。在实际的定点算法中,为了达到最佳的性能,必须充分考虑到这一点。

综上首先掌握,浮点数转定点数,定点数转浮点数。根据Q的确定,Q为小数点。 其次掌握乘法 除法 加减法 浮点数运算,中Q的确定,以及二进制加减法,乘除法

FPGA乘法器: 按位与数相与,最后移位,加法运算。 与 移位 加法。

在Verilog中,我们一般使用乘法器时直接用*来直接完成,或者调用相关IP核来生成高性能乘法器,

FPGA除法器:

组合逻辑实现: 移位 比较 减法

首先将被除数(位宽DIVISOR_WIDTH)和除数(位宽DIVIDEND_WIDTH)均扩展到(DIVISOR_WIDTH+DIVIDEND_WIDTH)位,其中将被除数高位补0后赋给tempa,除数左移DIVISOR_WIDTH位,低位补0,赋给tempb,在每个周期开始时,先将tempa左移一位,末尾补0,然后与除数(dividend)比较, 是否大于除数,是则tempa减去tempb将且加上1,

执行结束后tempa的高DIVIDEND_WIDTH位即为余数,低DIVISOR_WIDTH位即为商

fpga 怎进行浮点运算

将浮点数乘以2的n次方,换成整数计算 ,最后在缩小。只能做到近似。

FPGA助,利用verilog实现浮点数的计算

DSP的小数格式是什么样的。是定点数还是浮点数格式。如果是定点数,可以通过FPGA的定点转浮点IP core进行转换,然后调用的浮点计算的IP core就行了,有浮点计算的加减乘除。

FPGA小数乘法

表达的值x转换Qn型的定点小数

x表示实际的数(一个浮点数), q表示它的Qn型定点小数(一个整数)。

q = (int) (x * 2^n)

x = (float)q/2^n

由于/ 2^n和* 2^n可以简单的用移位来计算,所以定点小数的运算比浮点小数要快得多。

计算内容

5.555*4.444=24.68642

第一步:将被乘数乘以256

5.555*256 = 1422.08   = 20’d1422 = 20’h5_8E;  (存在误差0.0056%)

4.444256 = 1137.664 = 20’d1137= 20’h4_71;   (存在误差0.058%)*

第二步:中间运算

20’h5_8E * 20’h4_71 = 20’h18_ABAE;

第三步:中间结果除以256

20’h18_ABAE >> 8 = 20’h18_AB;

第四步:转换为实际小数比较

20’h18_AB = 24.171 (存在误差2%)

如果想降低取整导致的误差,可以加大位宽

因为Q小数点会加倍,所以恢复小数得除2^16.. 上述为Q8

加减法运算

如果对于未对齐的二进制数,需要补齐最低位使得小数位的位宽相同才能进行加减法运算;如果将数据均看成无符号整数,则不需要进行小数位扩展,因为Verilog HDL编译器会自动将参与运算的数据以最低位对齐进行运算;

浮点数的表示方法:IEE754协议

一个浮点数A由两个数m和e来表示,即A=m×b^e.

在任意一个这样的系统中,我们选择一个基数b(计数系统的基)和精度B(使用多少位来存储)。m(即尾数)是B位二进制数,

image.png

**符号位占1bit,指数位E(Exponent)占8bit,其取值范围为0~255(无符号整数)(注意:E为无符号整数,实际数值e=E-127,这一点务必注意),**尾数位M占23bit。尾数也叫做有效数字位、系数位、甚至被称作小数;

例:16位的定点数(MAX:16’d32767 MIN:-32768) 

3位整数位宽,12位的小数位,最高位的符号位 

取低15位,其中第14,13,12位最大能表示7, 

小数最大12位能表示的最大精度:1/4096=0.000244140625 

(0.000244140625*4095 = 0.999755859375) 

极限最大值表示:7.999755859375