最近学习基于FPGA的图像处理时,在书中看到了算法移植的一些通用的节省硬件资源的方法,在这里和大家分享一下
本章节介绍定常数转换,不等式等效转换,截断,泰勒近似和增量更新。下一章节介绍查找表,浮点运算。(此外还有Cordic技术,由于作者水平有限,对其中涉及到的某些概念理解的不够深入,也许会在以后的博客进行更新)。
算法映射是什么
将各种算法(如图像处理的算法)转换为FPGA系统设计的过程称为算法映射。
计算技术
计算技术是图像处理的核心技术之一。在软件算法设计和调试完成之后,需要将软件的算法映射到FPGA中去,由于软件和硬件的设计差异性,相当一部分算法在映射前需要通过等效转换,近似计算等硬件技术技术来转换成硬件易于实现的方式,从而达到逻辑资源占用量和系统最高工作频率,计算误差的平衡。
算法转换
定常数转换
在乘法和除法运算中,经常会遇到乘数,被乘数或分子与分母是常数的情况。直接调用乘法器或除法器可以解决这个问题,但是这会消耗一定的DSP运算单元,而DSP运算单元往往是FPGA中比较少的资源。对于定常数,可以通过一定的转换将其转换为移位和加法运算,从而减少乘法器和除法器的使用。下面列举几个常用的例子。
dout = din × 255 \text { dout }=\operatorname{din} \times 255 dout =din×255
转换后
d o u t = din × ( 256 − 1 ) = ( din ≪ 8 ) − din \mathrm{dout}=\operatorname{din} \times(256-1)=(\operatorname{din} \ll 8)-\operatorname{din} dout=din×(256−1)=(din≪8)−din
~
dout = din × 123 \text { dout }=\operatorname{din} \times 123 dout =din×123
转换后
dout = din × ( 64 + 32 + 16 + 8 + 2 + 1 ) = din × ( 2 6 + 2 5 + 2 4 + 2 3 + 2 1 + 2 0 ) = din × [ 2 7 − ( 2 2 + 2 0 ) ] \begin{aligned} \text { dout } &=\operatorname{din} ×(64+32+16+8+2+1) \\ &=\operatorname{din} ×\left(2^{6}+2^{5}+2^{4}+2^{3}+2^{1}+2^{0}\right) \\ &=\operatorname{din} ×\left[2^{7}-\left(2^{2}+2^{0}\right)\right] \end{aligned} dout =din×(64+32+16+8+2+1)=din×(26+25+24+23+21+20)=din×[27−(22+20)]
对于小数的处理则需要先将其转换为整型进行处理:
dout = din / 25 \text { dout }=\operatorname{din} / 25 dout =din/2