FPGA利用查找表实现sin正弦函数
最近在看《基于FPGA的数字图像处理原理及应用》这本书,准备利用FPGA实现一些简单的数字图像处理。想把学习过程中遇到的一些问题以及解决方法与大家分享。
1.查找表的定义
在计算机科学中,查找表使用简单的查询操作替换运行时计算的数组或者associative array这样的数据结构。由于从内存中提取数值经常要比复杂的计算速度快很多,因此这样得到的速度提升是很显著的。
一个经典的例子就是三角表。每次计算所需的正弦值在一些应用中可能会慢的无法忍受,为了避免这种情况,应用程序可以在刚开始的一段时间计算一定数量的角度正弦值,譬如计算每个整数角度的正弦值,在后面的程序需要正弦值的时候,使用查找表从内存中提取临近角度的正弦值而不是使用数学公式进行计算。
由于查找表的高效率与方便易用性,它在实时性要求比较高的嵌入式系统中得到了广泛的应用。在FPGA中,主要是以下两种情况会用到查找表:一种是逻辑的时序要求非常高,例如,若用Cordic计算或是其他计算方式,则其延时不能满足要求时;另一种是计算的复杂度非常高,需要消耗相当一部分逻辑资源,而查找表只需建立一块的存储器,这可以用FPGA的片内存储器来构建,仅仅消耗一小部分逻辑资源。
2.利用查找表实现正弦函数
下面是一个用查找表来实现正弦函数sinx的示例。
①利用MATLAB生成mif文件
mif文件存放sinx的变量和函数值,在程序运行之前利用mif文件对ROM初始化。下面是生成sin函数查找表的MATLAB程序。
用MATLAB运行该程序会生成一个mif文件,文件内容如下。