【FPGA/图像处理】生成器-行缓存生成器
世界Skill
图像处理系列文章基本都是我本科毕设论文同步发布,这个项目以LGPL许可被发布在F-I-L。行缓存是局部滤波操作的基础,它是生成窗口的前置条件。行缓存生成器的目的是截取图像的前N行,随后将其作为窗口数据的来源,设计一个行缓存生成器需要考虑到复用性和去耦合,以保证在有需求的情况下,一个行缓存能够被更多的后续模块利用。本节将会介绍如何实现一个行缓存生成器。
这个IP核的资源在这里:
RowsGenerator
3 算法实现
明确了设计和架构,便可以进行算法的实现。本章将会说明如何实现图像处理的算法,以及如何运用它们。
3.8 生成器-行缓存生成器
行缓存是局部滤波操作的基础,它是生成窗口的前置条件。行缓存生成器的目的是截取图像的前N行,随后将其作为窗口数据的来源,设计一个行缓存生成器需要考虑到复用性和去耦合,以保证在有需求的情况下,一个行缓存能够被更多的后续模块利用。本节将会介绍如何实现一个行缓存生成器。
3.8.1 原理
如图3-8-1所示[3],左侧是第一种窗口生成的方式,行缓存和窗口并行,右侧则是和窗口串行。在FPGA的实现中,无论是哪一种方式,行缓存中的每一行通常都是由一个和图像等宽的Fifo来构造的,而Fifo所消耗的存储器或者LUT资源比较多,所以考虑到实现的便利性、行缓存复用性和去耦合,本库选择了与窗口并行的方式。

图3-8-1 窗口生成形式
由于用到了Fifo,所以需要调用Xilinx官方的IP核,根据Fifo的数据手册[14],可知其可以配置为为许多种模式,在这里最需要关心配置是读写时钟、Fifo宽度与Fifo深度。Fifo的读写时钟有两种模式,可以配置为读写同步和读写异步模式,同步模式是即读写共用一个时钟,这样可以达到理论上最大的FMax,同时符合本设计的流水化需求,所以这里选择同步读写模式。同步读写模式的读写时序分别如图3-8-2和3-8-3,可见写入是实时的,而读出则有一个周期的延迟,并且Fifo内部数据的计数值和可读出的数据是同步的,所以只需要在第N行的计数值达到要求后使能第N行的读有效信号,隔一个周期之后使能第N+1行的写有效信号,同时将第N行的输出数据和第N+1行的输入数据连接到一起(第一行数据的输入应当为模块的输入数据),最后,将每一行的输出拼接起来作为整个模块输出即可。

图3-8-2 Fifo写时序

图3-8-3 Fifo读时序
3.8.2 设计
根据原理可知,RowsGenerator核(以下简称RG核)需要考虑Fifo宽度与Fifo深度。Fifo宽度根据应用场合(待处理图像的色彩位宽)变换较大,同时考虑到本库所允许的色彩位宽范围为1-12,并且在整个可能的项目中色彩位宽变幻的可能性较高,会因为IP重名而导致综合错误,所以我将其分为了四个阶段,并为每个阶段单独设置了一个Fifo,如表3-8-1,随后使用generate语句,让综合器自动根据当前色彩位宽选择实例化哪一个生成器,实现资源和泛用性的一个平衡。
色彩位宽 | Fifo宽度 |
---|---|
1 | 1 |
2, 3, 4 | 4 |
5, 6, 7, 8 | 8 |
9, 10, 11, 12 | 12 |
对于Fifo的深度,则是根据当前图像宽度确定的,同时对于Fifo的IP核,其深度必须为2的幂,考虑到在一个项目中图像宽度几乎不会改变,所以我将Fifo深度的配置权交给了用户,用户可以自己设置这个深度来达到自己的需求。除此之外,由于行缓存确实需要消耗存储器资源,但对于一般的应用消耗的又并不多,无法填满块RAM的一个最小单位18K,使用块RAM可能会造成不必要的浪费,所以默认配置为使用分布式RAM来节约资源,带来的负面影响是会降低FMax,但综合考虑下,这是值得的,如果确实有需要很高速的应用,用户可以自行选择配置为其他模式的实现。综上,一个RG核需要的配置参数、端口和子模块如表3-8-2、表3-8-3和表3-8-4。
名字 | 类型 | 范围 | 默认值 | 说明 |
---|---|---|---|---|
rows_width | 无符号 | 2 - 15 | 3 | 行缓存宽度。 |
im_width | 无符号 | 1 - 4096 | 320 | 图像宽度。 |
color_width | 无符号 | 1 - 12 | 8 | 色彩位宽。 |
im_width_bits | 无符号 | 取决于图像宽度 | 9 | 图像宽度的位宽。 |
名字 | 端口 | 类型 | 范围 | 默认值 | 说明 | clk | 输入 | 无符号 | 无 | 无 | Clock. |
---|---|---|---|---|---|
rst_n | 输入 | 无符号 | 无 | 无 | 复位,低有效。 |
in_enable | 输入 | 无符号 | 无 | 无 | 输入数据使能,作为第一个fifo的写使能。 |
in_data | 输入 | 无符号 | color_width - 1 : 0 | 无 | 输入数据,必须和in_enable同步输入。 |
out_ready | output | 无符号 | 无 | 无 | 输出数据有效,在两种模式下,这个信号都会在out_data可以被读取的时候有效。 |
out_data | output | 无符号 | color_width * rows_width - 1 : 0 | 无 | 输出数据,将会和out_ready同步输出。 |
名字 | 类型 | 说明 |
---|---|---|
Fifo | Fifo1xWidthRows | 位宽为1并且深度为N的Fifo(1 < N < 4096),用于构造色彩位宽为1的行缓存。 你可以自己对fifo进行配置,但是在一个项目中所有的同名的fifo必须拥有同样的配置。 同时你只能够更改写入深度和fifo实现的类型,它的读延迟必须为1! |
Fifo | Fifo4xWidthRows | 位宽为4并且深度为N的Fifo(1 < N < 4096),用于构造色彩位宽为1的行缓存。 你可以自己对fifo进行配置,但是在一个项目中所有的同名的fifo必须拥有同样的配置。 同时你只能够更改写入深度和fifo实现的类型,它的读延迟必须为1! |
Fifo | Fifo8xWidthRows | 位宽为8并且深度为N的Fifo(1 < N < 4096),用于构造色彩位宽为1的行缓存。 你可以自己对fifo进行配置,但是在一个项目中所有的同名的fifo必须拥有同样的配置。 同时你只能够更改写入深度和fifo实现的类型,它的读延迟必须为1! |
Fifo | Fifo12xWidthRows | 位宽为12并且深度为N的Fifo(1 < N < 4096),用于构造色彩位宽为1的行缓存。 你可以自己对fifo进行配置,但是在一个项目中所有的同名的fifo必须拥有同样的配置。 同时你只能够更改写入深度和fifo实现的类型,它的读延迟必须为1! |
3.8.3 实现
根据3.8.2的设计便可以实现一个RG核,但考虑到如果这个RG核采用请求响应模式没有意义,用一般的AXI协议与其交互会使得效率低下且造成资源浪费,同时可能带来比较严重的时序问题,所以AXI版本的行缓存生成不在本节讨论,会用专门的AXI-Stream协议完成。故,此RG核仅有流水线模式。
3.8.3.1 流水线模式
保证地址和数据同步流水化输出,在复位时二者皆输出为0,实现如下:
rst_n为低时,系统复位,输出无效;否则当in_enable使能时,第一个fifo开始填充,之后每一个clk的上升沿都会送入一个数据进行处理,当所有的fifo都被填充到图像宽度的深度时,输出有效,之后每一个周期都将送出一个有效数据,波形如图3-8-4。

图3-8-4 流水线模式时序
3.8.3.2 IP核GUI
完成功能后对RG核进行了封装,封装如图3-8-5,im_width_bits根据自行im_width自动计算。

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

图3-8-6 原始测试图像
使用HDL功能仿真和软件仿真的结果进行PSNR的计算,仿真结果如图3-8-7所示。

图3-8-7 仿真结果之一,行缓存宽度为5,左侧为HDL功能仿真结果,右侧为软件仿真结果
3.8.5 资源和时序
由于最终实现和Fifo配置关系很大,这里只对512x512,色彩位宽为8,窗口大小为3,同时使用分布式RAM的状况,根据Vivado生成的报表,主要资源耗费如表3-8-5。
Slice LUTs* | Slice Registers |
---|---|
610 | 237 |
同时由于根据时序报告,在使用分布式RAM的情况下,最大的Data Path Delay(数据路径延迟)为3.514ns,即:
FMax = 284.57MHz
即说明,RG核在流水线模式下,理论上在处理1080p全高清图像时可以达到137帧。
由于数据路径延迟和应用的最终约束设置强相关,所以仅供参考。
3.8.6 分析与结论
由于RG核与一般的图像处理不同,所以不能采用PSNR来评估,只能对比软件仿真和硬件仿真每一行的文本,完全相同时则为正确(OK),得到的数据如表3-8-5。
1-3 | 1-5 | 2-3 | 2-5 | Total |
---|---|---|---|---|
OK | OK | OK | OK | OK |
可见RG核有效,同时在使用分布式RAM的情况下也可以达到不错的FMax,设计成功。
参考文献
[3] Donald G.Bailey.基于FPGA的嵌入式图像处理系统设计[M].原魁,何文浩,肖晗译.北京:电子工业出版社,2013
[14] Xilinx, Vivado Design Suite, FIFO Generator v12.0, Product Guide, PG057 [EB/OL]. October 1 , 2014
感谢
仿真图像来源:
パセリ-絵描き見習い