【FPGA/图像处理】生成器——帧控制
世界Skill
图像处理系列文章基本都是我本科毕设论文同步发布,这个项目以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读写时序
可见,对于写操作,只需要使得地址和数据同步送入RAM相应端口即可,而对于读操作,则需要有一定的延迟,这个延迟是根据配置时选择插入的寄存器来决定的,对于不同的应用插入的级数不同,Vivado中可以最多插入三个寄存器来形成三级流水线,如图3-2-2[11]所示。

图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 | 你想要写入的第一行的偏移,取决于应用,比如窗口。 |
名字 | 端口 | 类型 | 范围 | 默认值 | 说明 |
---|---|---|---|---|---|
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.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.2 流水线模式读
基本同3.2.3.1,但在工作模式时,读使能计数器首先有效,在地址输入后的ram_read_latency个周期后,读使能计数器锁定,并输出第一个有效值,之后每个周期都会输出一个有效值,波形如图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.3.4 请求响应模式读
基本同3.2.3.2,但变为一次请求一次响应输出,地址计数器只有在in_enable的上升沿才会加1,波形如图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.4 仿真
FC核没有软件仿真,并且综合考虑到BRAM在仿真时的配置不便和仿真效率,HDL功能仿真只支持512x512像素和灰度模式下的图像,我选取了三张这样的图像,分别对它们进行了每一种模式进行了测试,每一张图像的测试流程如下:
流水线模式写RAM的仿真模型 -> 流水线模式读RAM的仿真模型 -> 存入*-pipeline-hdlfun.*内 -> 请求响应模式写RAM的仿真模型 -> 请求响应模式读RAM的仿真模型 -> 存入*-reqack-hdlfun.*内。
由于没有软件仿真,所以将原图像作为了软件仿真的结果,用来进行PSNR的计算,仿真结果如图3-2-8所示,保存为bmp格式是为了防止压缩时带来的差异影响到PSNR的计算。

图3-2-8 仿真结果,左侧为请求响应模式下的HDL功能仿真结果,中间为流水线模式下的HDL功能仿真结果,右侧为软件仿真结果
3.2.5 资源和时序
由于四种模式的基本构成大致相同,所以只对第一种模式进行分析,根据Vivado生成的报表,主要资源耗费如表3-2-3。
Slice LUTs* | Slice Registers |
---|---|
38 | 17 |
根据时序报告,最大的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 |
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-池