【FPGA/图像处理】生成器-窗口生成器

少女dtysky

世界Skill

时刻2015.05.20

图像处理理系列文章基本都是我本科毕设论文同步发布,这个项目以LGPL许可被发布在F-I-L。窗口生成器跟在行缓存生成器之后,负责将行缓存生成的每一列扩展成以某个像素为中心、以这个像素的邻域为填充的窗口,以供后续的模块进行处理。原则上,窗口的生成可以在每个局部滤波器模块的内部生成,但考虑到可能有若干个模块复用同一个窗口,综合复用性和资源成本的考量后,我选择用这样的一个生成器来作为行缓存和处理模块的连接层,本节将介绍如何构造一个窗口生成器。
这个IP核的资源在这里:
WindowGenerator


3 算法实现

明确了设计和架构,便可以进行算法的实现。本章将会说明如何实现图像处理的算法,以及如何运用它们。

3.9 生成器-窗口生成器

窗口生成器跟在行缓存生成器之后,负责将行缓存生成的每一列扩展成以某个像素为中心、以这个像素的邻域为填充的窗口,以供后续的模块进行处理。原则上,窗口的生成可以在每个局部滤波器模块的内部生成,但考虑到可能有若干个模块复用同一个窗口,综合复用性和资源成本的考量后,我选择用这样的一个生成器来作为行缓存和处理模块的连接层,本节将介绍如何构造一个窗口生成器。

3.9.1 原理

如图3-9-1中所示,窗口生成器接受包含若干行像素的一列,输出整个窗口的像素,并且窗口应当包含当前操作的中心像素以及其邻域像素。所以需要构造一个二维数组,数组的每一维都包含了一行,初始状态下窗口中的每个像素均为0,之后最左侧的一列不断接收外部数据,而每行的各个像素之间不断进行移位操作,以此来构造一个在图像上不断滑动的窗口。

图3-9-1 窗口的原理
图3-9-1 窗口的原理

3.9.2 设计

根据原理可知,WindowGenerator核(以下简称WG核)核心是一个二维数组每一维的像素之间的移位操作。考虑对于NxN的窗口,只有当第一个在图像上的像素作为窗口中心时才能够真正的输出,所以在N/2个周期之前,窗口的输出应该是无效的。但即使在无效的时候,窗口仍然需要外部输入数据来保证其继续被填充到有效,这和其他模块的设计不同,必须采用专用的设计来完成。考虑流水线模式,每一个周期模块接收外部送入的一列进行处理,由于移位是连续的,所以当第一个窗口填充完毕后输出有效,这和一般的流水线模式基本一致,而对于请求响应模式则不同,这种模式下输入数据受到输入使能的控制,移位是不连续的,所以当第一个窗口被填充完毕、窗口输出有效之前,必须有一个信号通知外部需要继续写入数据,我设计了一个端口input_ack来传递这个信号。 综上,一个WG核需要的配置参数和端口如表3-9-1与表3-9-2。

名字 类型 范围 默认值 说明
work_mode 无符号 0为流水线模式,1为请求响应模式 0 工作模式
window_width 无符号 2 - 15 3 窗口的宽度和高度。
color_width 无符号 1 - 12 8 色彩位宽。
表3-9-1 配置参数


名字 端口 类型 范围 默认值 说明
clk 输入 无符号 Clock.
rst_n 输入 无符号 复位,低有效。
in_enable 输入 无符号 输入数据使能,在流水线模式下,它是另一个复位信号,在请求响应模式下,只有在它有效的时候in_data才会被真正地改变。
in_data 输入 无符号 color_width * window_width - 1 : 0 输入数据,必须和in_enable同步输入。
out_ready output 无符号 输出数据有效,在两种模式下,这个信号都会在out_data可以被读取的时候有效。
out_data output 无符号 color_width * window_width * window_width - 1 : 0 输出数据,将会和out_ready同步输出。
input_ack output 无符号 输入响应,仅仅被用于请求响应模式,这个端口将在输入数据被接受时给出一个响应。
表3-9-2 端口

3.9.3 实现

根据3.9.2的设计便可以实现一个WG核,流水线模式和请求响应模式实现如下。

3.9.3.1 流水线模式

保证地址和数据同步流水化输出,在复位时二者皆输出为0,实现如下:
in_enable或rst_n为低时,系统复位,输出无效;否则窗口宽度加1个周期后第一个窗口被输出,并且每一个clk的上升沿都会送入一列进行处理,第一个窗口有效之后,每一个周期都将送出一个窗口,波形如图3-9-2。

图3-9-2 流水线模式时序
图3-9-2 流水线模式时序

3.9.3.2 请求响应模式

基本与3.9.3.1一致,但只有in_enable的上升沿时才会有数据被输入,同时每一列输入后都会有一个input_ack信号响应此次输入,来提示外部进行下一次的输入,波形如图3-9-3。

图3-9-3 请求响应模式时序
图3-9-3 请求响应模式时序

3.9.3.3 IP核GUI

完成功能后对WG核进行了封装,封装如图3-9-4。

图3-9-4 WG核的GUI
图3-9-4 WG核的GUI

3.9.4 仿真

WG核虽然对于所有图像都有意义,但一般用于灰度和二值图像的处理,所以我选取了一张图像的灰度模式与二值模式(来源于局部二值化,在后面的章节将会介绍)作为仿真源,并且考虑到仿真压力,仅测试了宽度为3和5的窗口,原始图像如图3-9-5。

图3-9-5 原始测试图像
图3-9-5 原始测试图像

使用HDL功能仿真和软件仿真的结果进行PSNR的计算,仿真结果如图3-9-6所示。

图3-9-6 仿真结果
图3-9-6 仿真结果之一,行缓存宽度为5,左侧为流水线模式下的HDL功能仿真结果,中间为请求响应模式下的HDL功能仿真结果,右侧为软件仿真结果

3.9.5 资源和时序

最终实现与窗口大小关系很大,这里只对512x512,色彩位宽为8,窗口大小为3时的情况进行分析,根据Vivado生成的报表,主要资源耗费如表3-9-3。

Slice LUTs* Slice Registers
73 74
表3-9-3 主要资源耗费

同时由于根据时序报告,最大的Data Path Delay(数据路径延迟)为2.325ns,即:

FMax = 430.10MHz

即说明,WG核在流水线模式下,理论上在处理1080p全高清图像时可以达到207帧。
由于数据路径延迟和应用的最终约束设置强相关,所以仅供参考。

3.9.6 分析与结论

由于WG核与一般的图像处理不同,所以不能采用PSNR来评估,只能对比软件仿真和硬件仿真每一行的文本,完全相同时则为正确(OK),得到的数据如表3-9-4。

1-3 1-5 2-3 2-5 Total
OK OK OK OK OK
表3-9-4 文本对比

可见WG核有效,同时可以达到很高的FMax,设计成功。


参考文献


感谢

仿真图像来源:
パセリ-COMITIA100

如果不是自己的创作,少女是会标识出来的,所以要告诉别人是少女写的哦。