【FPGA/图像处理】生成器——帧控制

少女dtysky

世界Skill

时刻2015.05.14

图像处理系列文章基本都是我本科毕设论文同步发布,这个项目以LGPL许可被发布在F-I-L。帧缓存是FPGA图像处理的一个基本单元,它缓存一张完整的图像,而一张完整的图像是所有图像处理的基础,它为一切操作提供数据源,所以它的泛用性是很高的。一般FPGA中的帧缓存都是用ram来实现的,这些ram可以分为sram和sdram两种,前者控制简单,效率高,后者则控制较为复杂。这一节将会探讨如何使用Xilinx的FPGA中的RAM资源作为帧缓存,并对其进行控制。
这个IP核的资源在这里:
FrameController


3 算法实现

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

3.2 生成器——帧控制

帧缓存是FPGA图像处理的一个基本单元,它缓存一张完整的图像,而一张完整的图像是所有图像处理的基础,它为一切操作提供数据源,所以它的泛用性是很高的。一般FPGA中的帧缓存都是用RAM(Random Access Memory,随机存储器)来实现的,这些RAM可以常用的可以分为SRAM(Static Random Access Memory,静态随机存储器)和SDRAM(Synchronous Dynamic Random Access Memory,同步动态随机存储器)两种,前者控制简单,效率高,后者则控制较为复杂。这一节将会探讨如何设计一个FramController核(以下简称FC核)对以Xilinx的FPGA中的RAM资源为基础的帧缓存进行控制。

3.2.1 原理

一般FPGA器件中的片内RAM分为两种,BlockRAM(块存储器,以下称BRAM)和DistributeRAM(分布式存储器,以下称DRAM)[9],两者本质上都是SRAM。不同的是前者是一些被集中在一些区域的专用存储器,后者是利用器件内的LUT构成的RAM。一般而言,BRAM的资源比较丰富,并且速度比较快,但由于其自身的特性,这些RAM被分为36K和18K两种形式,使用BRAM的单位是18Kb的倍数,所以在很多情况下会造成资源的浪费,另一方面,由于这些RAM的位置是固定的,所以在布局布线上可能会造成更多的延迟。而分布式RAM则正好相反,由于使用的是LUT,所以资源比较少,但比较灵活,不容易造成浪费。
对于帧缓存,考虑其一般比较大并且读写要求比较高,采用BRAM比较合适,但即使是BRAM,对于一些比较大的图像也是难以胜任的,中低端的FPGA器件的片内BRAM是比较少的,比如对于用于测试的xlg7Z010clg400,片内RAM只有256kb[10]。这时只能够采用SDRAM进行扩展,但考虑到本项目主要论述的是图像处理的算法,所以不加以讨论。
在Vivado中,RAM的配置被分为许多种[11],比如Single Port RAM(单口RAM,只有一个读写数据的端口),Simple Dual Port RAM(简单双口RAM,两个端口,但是只有一个端口可以写入),True Dual Port RAM(真双口RAM,两个端口都可以写入)等,对于帧缓存,一般采用的是Simple Dual Port RAM,这种配置方式下的RAM读写时序如图3-2-1[11]所示。

图3-2-1 RAM写时序
图3-2-1 RAM读写时序

可见,对于写操作,只需要使得地址和数据同步送入RAM相应端口即可,而对于读操作,则需要有一定的延迟,这个延迟是根据配置时选择插入的寄存器来决定的,对于不同的应用插入的级数不同,Vivado中可以最多插入三个寄存器来形成三级流水线,如图3-2-2[11]所示。
图3-2-2 三级流水线下的读操作
图3-2-2 三级流水线下的读操作

3.2.2 设计

根据原理并综合第2章的接口标准,实现一个针对Xilinx器件的BRAM控制器,即这里的FC核需要的配置参数和端口分别如表3-2-1和表3-2-2所示。

名字 类型 范围 默认值 说明
work_mode 无符号 0为流水线模式,1为请求响应模式 0 模块的工作模式。
wr_mode 无符号 0为写,1为读。 0 模块的读写模式。
data_width 无符号 8 数据位宽。
im_width 无符号 1 - 4096 320 图像宽度。
im_height 无符号 1 - 4096 240 图像高度。
addr_width 无符号 取决于图像的宽度和高度。 17 存储帧缓存的RAM的地址位宽。
ram_read_latency 无符号 0 - 15,取决于RAM。 2 RAM的读延迟,在Xilin器件中,典型为2。
row_init 无符号 取决于输入的行偏移。 0 你想要写入的第一行的偏移,取决于应用,比如窗口。
表3-2-1 配置参数


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

3.2.3 实现

根据配置参数和端口的设计便可以实现一个FC核,此核主要由一个地址输出计数器、一个读使能延时计数器和复位系统构成,由于工作模式有流水线和请求响应两种,读写模式也有两种,所以总共有四种模式,这些模式的实现方式如下:

3.2.3.1 流水线模式写

保证地址和数据同步流水化输出,在复位时二者皆输出为0,实现如下:
in_enable或rst_n为低时,out_ready输出为0,即输出无效,此时地址计数器不工作;否则输出有效,计数器在每个clk的上升沿加1,直到加满根据用户设定的宽和高算出来的地址最大值,开始下一次循环,波形如图3-2-3。

图3-2-3 流水线模式写入时序
图3-2-3 流水线模式写入时序

3.2.3.2 流水线模式读

基本同3.2.3.1,但在工作模式时,读使能计数器首先有效,在地址输入后的ram_read_latency个周期后,读使能计数器锁定,并输出第一个有效值,之后每个周期都会输出一个有效值,波形如图3-2-4。

图3-2-4 流水线模式读出时序
图3-2-4 流水线模式读出时序

3.2.3.3 请求响应模式写

地址和数据同步输出,一次请求一次响应输出,复位时输出为0,实现如下:
基本同3.2.3.1,但地址计数器只有在in_enable的上升沿才会加1,波形如图3-2-5。

图3-2-5 请求响应模式写入时序
图3-2-5 请求响应模式写入时序

3.2.3.4 请求响应模式读

基本同3.2.3.2,但变为一次请求一次响应输出,地址计数器只有在in_enable的上升沿才会加1,波形如图3-2-6。

图3-2-6 请求响应模式写入时序
图3-2-6 请求响应模式写入时序

3.2.3.5 IP核GUI

完成功能后对FC核进行了封装,封装如图3-2-7,work_mode和wr_mode被设计为键值对的模式,方便用户理解和选择,其它参数都根据实际状况加上了范围限定,addr_width使用expr表达式交由软件自行计算。

图3-2-7 FC核的GUI
图3-2-7 FC核的GUI

3.2.4 仿真

FC核没有软件仿真,并且综合考虑到BRAM在仿真时的配置不便和仿真效率,HDL功能仿真只支持512x512像素和灰度模式下的图像,我选取了三张这样的图像,分别对它们进行了每一种模式进行了测试,每一张图像的测试流程如下:

流水线模式写RAM的仿真模型 -> 流水线模式读RAM的仿真模型 -> 存入*-pipeline-hdlfun.*内 -> 请求响应模式写RAM的仿真模型 -> 请求响应模式读RAM的仿真模型 -> 存入*-reqack-hdlfun.*内。

由于没有软件仿真,所以将原图像作为了软件仿真的结果,用来进行PSNR的计算,仿真结果如图3-2-8所示,保存为bmp格式是为了防止压缩时带来的差异影响到PSNR的计算。

图3-2-8 仿真结果
图3-2-8 仿真结果,左侧为请求响应模式下的HDL功能仿真结果,中间为流水线模式下的HDL功能仿真结果,右侧为软件仿真结果

3.2.5 资源和时序

由于四种模式的基本构成大致相同,所以只对第一种模式进行分析,根据Vivado生成的报表,主要资源耗费如表3-2-3。

Slice LUTs* Slice Registers
38 17
表3-2-3 主要资源耗费

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

FMax = 520.56MHz

由于数据路径延迟和应用的最终约束设置强相关,所以仅供参考。

3.2.6 分析与结论

根据仿真结果计算PSNR,得到的数据如表3-2-4。

1 2 3 Total
1000000.00 1000000.00 1000000.00 1000000.00
表3-2-4 PSNR

PSNR均值为极大值,可见FC核可以完美完成帧缓存的控制,同时资源利用率很低,可以达到很高的FMax,超过了BRAMFMax的极限,设计成功。


参考文献

[9] Xilinx, Xilinx 7 Series FPGAs Embedded Memory Advantages, WP377 (v1.1) [EB/OL]. February 17, 2012
[10] Xilinx,7 Series FPGAs Memory Resources, User Guide, UG473 (v1.11) [EB/OL]. November 12, 2014
[11] Xilinx, Vivado Design Suite, Block Memory Generator v8.2, LogiCORE IP Product Guide, PG058 [EB/OL]. April 1, 2015


感谢

仿真图像来源:
月岡月穂-ゆらゆら
LM7-oxford eleKtricity
cotta-池

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