图像处理卷积的FPGA设计
在FPGA上实现图像处理,根据处理图像数据的粒度,基本的可以分为以下三类:
-
基于像素点
基于单个像素点的操作最常见的就是黑电平校正、白平衡、色彩空间装换、全局gamma -
基于图像块
基于图像块的操作多用于滤波,例如3x3、5x5、7x7的模板,例如边缘提取、去噪等 -
基于帧
在图像实时处理过程中,基于帧处理的有3A统计中的亮度统计、以及基于全局的直方图均衡、基于全局及前后帧的BM3D降噪
上述三种大类型的算法在FPGA上实现,也是从易到难。最近在工作中交流中,旁边的朋友在以往的设计中喜欢采用XIlinx的shift ram IP实现行缓存line buffer,用于实现块操作。在我看来,XIlinx的line buffer本质上是对SDPRAM的加了一层封装。
- 根据line长度,设定BRAM的深度
- A端口写入数据后
- B端口在A端口写满之前1-2个时钟开始预读,防止写覆盖
这种用法在数字信号处理中,实现信号延迟相关比较常见,下面讲讲自己是如何实现line buffer的。
首先,在实现3x3的矩阵时,在不考虑边缘的情况下,资源最优的方式是缓存2行即可,但是这里为了在设计中产生一定的裕量,开辟4行的缓存空间,然后根据输入的行顺序,从RAM1写入到RAM4,往复循环。
然后,每次读RAM1到RAM4的数据,从4行中选择3行输出,形成3行。
其次,根据3行RAM的输出数据,通过移位寄存器,形成3x3的矩阵,送至运算单元。
在上述过程中,对输入及输出的像素点按照行列计数。对输入的数据计数,是为了从4行中抽取3行,同时,可以确定只有存满期望的行数以后开始进行处理。对输出的数据计数,是为了确定统计当前模块处理的没有问题,同时,可以形成有SOF(start of frame)、EOL(end of line)、VAL(valid)信号。
FPGA设计过程中,核心是数据通路状态机的设计以及对应数据的运算。理清对数据的控制,编写模块的时候才是设计时序,才是你在描述电路HDL(hardware description language)。
最后,向在抗击新冠疫情中牺牲的烈士致敬!