基于FPGA的高通滤波算法实现

一.算法原理

计算公式:H(2,2)= f(2,2) - 1/9*滑框均值 + 100

假设一幅图大小为302 * 302 * 8 bit 那么 在3*3的模板  滤波次数 就为 (302-3+1)*(302-3+1)= 300*300

二.在FPGA中的原理

1.原理介绍

基于FPGA的高通滤波算法实现

     图像输入以CameraLink协议为例,向FPGA输入300*300的图像,由于需要将图像的首行首列尾行尾列进行滤波,所以需要将图像没采集之前,将补0fifo写入302个0也就是第一行的数据。随后采集到图像的第一行,在第一个像素加一个0,第一行的末尾也添加一个0,直到最后一行采集结束,再补302个0.这样确保补0fifo中图像大小永远是302*302大小。

    随后,当补0FIFO够302个点开始读出数据,同时写入FIFO_LINE2。当FIFO_LINE2够302个点且补0FIFO够302个点的时候,开始读出FIFO2的数据同时写入FIFO_LINE1。当三个FIFO都够302个点时,开始同时读出数据,进入L1第一级缓存区,以此类推至L3级。再依次进行计算输出。

2.内部框架介绍

基于FPGA的高通滤波算法实现

3.流程图设计

  流程图设计介绍主要介绍FPGA内部框图内的设计流程。

3.1CameraLink 采集模块

基于FPGA的高通滤波算法实现

3.2控制FIFO读写模块

3.2.1 ADDR0 读出流程

基于FPGA的高通滤波算法实现

3.2.2 FIFO_LINE2流程

基于FPGA的高通滤波算法实现

3.2.3 FIFO2 读出模块

基于FPGA的高通滤波算法实现

三.遇到的细节问题

1.由于FIFO1 和FIFO2 都要跟随ADD0开始读出,所以如果检测到ADD0读使能之后需要延迟一个时钟,所以需要将ADD0_FIFO读出之后数据线和使能线都打一拍

2.每个FIFO的读出条件都是当自己满一行且来新的一行开始读出并写入下一FIFO

3.具体代码的时钟推演

基于FPGA的高通滤波算法实现

基于FPGA的高通滤波算法实现

四.仿真结果

1.读使能相差一个周期

基于FPGA的高通滤波算法实现