FPGA中的小数运算
最近在图像算法的中间遇到一下小数的运算问题,虽然之前也遇到很多次,但是这次记录下来。
R = 1.164(Y-16) + 1.596(Cr-128)
G = 1.164(Y-16) - 0.391(Cb-128) - 0.813(Cr-128)
B = 1.164(Y-16) + 2.018(Cb-128)
遇到的一些问题是,色彩空间的转换问题,其中使用到的小数运算。
来看一个实例 dout = data*1.8 + 32; 在整个算式中需要用到一次小数的乘法
加入Quartus2中进行编译 会发现 在小数乘法这一行会报错,这说明小数是没有办法直接进行乘法的。
解决这个问题的一般思路就是,先对小数进行扩大,计算之后再进行相同倍数的缩小,当然其中避免不了精度的丢失,以及计算效率的问题。
经过上述思路,我们对程序进行简单的变换,看一下仿真结果,可以发现 经过3个clk输出的结果是正确的(有保留)。
综合出来的RTL如图所示,为了解决计算中的效率问题,提高整个时钟的运行速度可以增加pipline进行优化。