【FPGA/图像处理】生成器-行缓存生成器

少女dtysky

世界Skill

时刻2015.05.19

图像处理系列文章基本都是我本科毕设论文同步发布,这个项目以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 窗口生成形式
图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-2 Fifo写时序

图3-8-3 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
表3-8-1 色彩位宽与Fifo宽度

对于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 图像宽度的位宽。
表3-8-2 配置参数


名字 端口 类型 范围 默认值 说明
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同步输出。
表3-8-3 端口

名字 类型 说明
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-4 子模块

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-4 流水线模式时序

3.8.3.2 IP核GUI

完成功能后对RG核进行了封装,封装如图3-8-5,im_width_bits根据自行im_width自动计算。

图3-8-5 RG核的GUI
图3-8-5 RG核的GUI

3.8.4 仿真

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

图3-8-6 原始测试图像
图3-8-6 原始测试图像

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

图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
表3-8-5 主要资源耗费

同时由于根据时序报告,在使用分布式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
表3-8-5 文本对比

可见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


感谢

仿真图像来源:
パセリ-絵描き見習い

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