思考1:FPGA中只能定义定点数吗?
首先,我没有搞清楚定点数与浮点数的定义。定点数就是小数位固定不变的数叫做定点数,也就是小数点是定在某个位置不变的数。
结论:FPGA中的信号可以是定点型也可以是浮点型,这只是一种数据表示形式,各有优缺点。
(1)浮点数的优势
- 更宽的动态范围。
- 可缩短复杂算法的开发周期:采用浮点数由于其较宽的动态范围可以满足绝大多数场合的需求,较少碰到溢出的问题,因此在复杂算法开发中可以省去处理溢出问题的这些时间。
- 统一的标准数据格式:采用定点数运算时,为满足动态范围或精度要求,算法中的某些操作需要增加字长,某些操作需要减少字长,从而使得定点数的格式根据需求而变化,就会出现一个设计中有不同的定点数格式。而浮点数采用了单精度或双精度,这也增强了代码的复用性,降低了算法建模的复杂度。
(2)定点数的优势
从应用场合来看,很多场合采用定点数即可满足系统性能需求,但有些场合对精度要求很高,如雷达成像、医学成像、高性能计算等需要采用浮点数。
思考2:定点数只能表示整数,浮点数只能表示小数?
首先,我没有搞清楚定点数与浮点数的定义。所以这个问题本身就有问题。定点数就是小数位固定不变的数叫做定点数,也就是小数点是定在某个位置不变的数。
所以,定点数可以表示①有符号定点整数②无符号定点整数③有符号定点小数④无符号定点小数;
浮点数:小数点是浮动的,不是在一个固定的位置上的
定点数:小数点的位置是固定的
在FPGA内部只能处理定点数无法处理浮点数
当浮点数转换成定点数的时候要明确的知道小数有多少位,整数有多少位
思考3:FPGA中如何定义浮点数与定点数?
reg unsigned [15:0]a;
wire signed b;
FPGA中定义的信号类型,默认是定点型,如果转化至浮点数,需要使用floating-point IP核。
思考4:截断与强制类型转换
wire signed [7:0] b2=-3;
wire [7:0] c=255;
wire [7:0] a2;
assign a2 = b2 - c2;
运算顺序:
第一步:b2的值-3转化至补码形式fe;c2的值255转化至补码形式ff
第二步:计算b2-c2,结果是有符号数,位宽为10bit(10_1111_1110)
第三步:类型转换(有符号数转化至无符号数),截位(10位截取其中8位)。结果为1111_1110
思考5:二进制存储与实际数据之间的误差
reg signed [15:0]data;
对于16位的符号数最大可以表示的值为32767,最小值为-32768。3位整数位宽,12位的小数位宽,最高位的符号位1位。
第14,13,12位最大可以表示7,小数最大12位,计算精度的方法位1/(2的12次方)= 0.000244140625
以2.918为例:
2.918/0.000244140625=11952.128~=11952,包含小数,小数部分进行四舍五入,这个就叫做量化的误差。这个值就是定点后的2.918。
最后,在FPGA中,随着信号处理的层次加深,对信号进行乘、累加、滤波等运算后,可能输入时仅为8位位宽的信号会扩展成几十位位宽,位宽越宽,占用的硬件资源就越多,但位宽超过一定范围后,位宽的增宽并不会对处理精度带来显著的改善,这时就需要对信号进行截位。写过FPGA HDL代码的童鞋都应该知道,截位是最为经常的一种操作。其次,直接截位实际造成的效果是信号整体向负无穷方向平移了,即对于一个白噪声序列来讲,原本均值为零,截位后均值变为了负数。