【FPGA/图像处理】设计与架构-接口与IP核设计

少女dtysky

世界Skill

时刻2015.05.10

图像处理系列文章基本都是我本科毕设论文同步发布,这个项目以LGPL许可被发布在F-I-L。由于这些图像处理模块从属于同一个系列,并且要兼容流水线和请求响应两种模式,有必要遵循同一个标准的接口协议,我设计了一套简单的标准化接口协议,使得图像在处理过程中需要消耗的帧缓存最小化。不仅如此,模块本身的设计也要考虑到强可重用性和软件的可控性。


2 设计与架构

由于所有的图像处理模块从属于同一个系列,并且需要兼容流水线和请求响应两种模式,所以需要一个标准的接口,这个接口用来连接各个模块,接口设计的标准是要使得每个模块之间的耦合最松,同时又不需要每一个处理结果都要开一个单独的帧缓存、以造成资源的浪费。不仅如此,在还需要考虑到模块自身的可定制(重用性)和软件可控性。同时由于要提供给用户使用,必须要提供一套完整的软件和实测流程。
本章将会说明如何去设计这样的一套接口,如何实现模块的标准化,以及提供给用户的仿真、实测和使用流程。

2.1 分类

在设计之前,首先要完成的是分类,由于图像处理种类繁多,所以考察这些不同的种类,并提取共同之处对于设计和架构是十分必要的,针对于FPGA的图像处理操作的分类工作已经在Donald G.Bailey的专著中[3]有非常完整的结论,这里加以提取和重构,已实现的图像处理主要的操作分为如下几类:

  1. Point :对每一个像素进行的操作,它意味着所有这种类型的IP核在一个操作周期内都只能够对一个点进行操作,所以这里将会有甚多的基础操作,像是灰度化、阈值化、对比度变换等等。
  2. Generator: 这是一个特殊的分类,它包含一些用于生成数据结构或者控制内存的IP核,比如行缓存生成,帧控制等等。
  3. LocaFilter: 基于窗口的操作,也就是局部滤波器,窗口是一种特殊的数据结构,这种数据结构将图片的一部分分割了出来。这个分类中的IP核经常用于模糊和锐化这些目的,比如均值滤波器,排序滤波器等等。
  4. Geometry: 如其名所示,这个分类下的IP核被用于几何变换,和其他分类不同,这个分类操作的对象是坐标而不是色彩,比如平移、缩放、旋转等仿射变换。
  5. Detection: 边缘检测,比如Harris角点检测等等。
  6. Histogram: 创建直方图,并从中获取一些有用的信息。

2.2 接口设计

根据这些操作的功能和要求,可以将接口设计分为两个部分——基础端口和扩展端口。

2.2.1 基础端口

基础端口,也就是所有模块的接口中,至少包含的一些端口,这些端口被设计为如下形式:

  1. clk: 时钟信号,用于提供同步时钟。
  2. rst_n: 全局复位信号,用于复位和初始化。
  3. in_enable: 输入数据使能,用于控制输入数据流。
  4. in_data: 输入数据流,提供处理的数据源。
  5. out_ready: 输出数据有效,作为操作结束的标志。
  6. out_data: 输出数据流,送出处理后的数据。

这些端口保证了每个模块的基本功能,图示如图2-1。

图2-1 基础接口示意
图2-1 基础接口示意

模块的运作方式如下:
首先进行全局的复位,对模块进行初始化,而后输入数据随着输入数据使能信号输入模块,在同步时钟的若干个周期后准备好输出数据,使能输出数据有效信号,通知外部电路取出数据。

2.2.2 扩展端口

由于每个模块自身的独特性,基础端口提供的功能往往不足以满足模块的实现,所以这时候需要加入扩展端口来满足需求,扩展端口一般被设计为以下形式:

  1. x: 不定端口,取决于模块自身的要求,比如对于阈值化模块,这个参数就是阈值。
  2. in_count_x: 输入坐标的x分量,通常用于几何变换。
  3. in_count_y: 输入坐标的y分量,通常用于几何变换。
  4. out_count_x: 输出坐标的x分量,通常用于几何变换。
  5. out_count_y: 输出坐标的y分量,通常用于几何变换。
  6. frame_addr: 通常用于帧控制,提供某一个输出数据的地址。

这些端口和基础端口合并起来,便可以满足每一个模块的需求,如图2-2所示。

图2-2 完整接口示意
图2-2 完整接口示意

至此,接口的硬件部分便设计完毕。

2.2.3 接口协议

接口的硬件部分定义结束后,还必须定义其协议部分。由于每一个模块同时存在流水线模式和请求响应模式,同时为了兼容已有的接口标准,达到最简化的设计目的,我让两种模式遵循了同一套接口标准,不同的仅仅是在两种模式下接口的行为方式。

2.2.3.1 流水线模式

流水线模式时,在输入使能in_enable有效的情况下,从第一次输出数据有效标志out_ready有效开始,输出数据out_data便会源源不断地送出,每一个周期都会送出一个有效数据。在这种模式下,从第一个数据有效开始,输出便是连贯的,如图2-3所示,时序图均采用wavedrom绘制。

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

这种模式一般用于需要连续数据流的应用中,由于采用了流水线做缓冲,所以一开始的若干个周期延迟在实际运用中是不需要关心的,也故理论上可以插入任意级流水来达到最高的Fmax(工作频率)。

2.2.3.2 请求响应模式

在这个模式下,in_enable和out_ready两个标志信号被当做请求信号req和响应信号ack,输入数据in_data随着每一次in_enable的上升沿被送入模块进行处理,处理完成后out_ready有效来通知外部电路取走数据,直到下次in_enable的上升沿到来为止,输出数据的状态都不会发生改变,如图2-4所示。

图2-4 请求响应模式时序
图2-4 请求响应模式时序

这种模式一般用于一些特殊的模块,比如直方图操作下的模块,对于这些模块,流水化的操作是没有意义的。此外,这种模式还可以被用于和软件的交互中,因为软件很难做到同步数据流的模式。

综上,最终模块的接口工作模式如图2-5。
图2-5 接口工作模式
图2-5 接口工作模式


2.3 可定制IP核设计

明确了每一个模块的接口以及其协议之后,便可以考虑IP核的设计了。IP核(intellectual property core,知识产权核)是指由某一方开发者提供的形式为逻辑单元、芯片设计的可重用模块,使用IP核能够为设计减少开发周期,并且达到比较好的效果。
对于图像处理操作,一个IP核应当用于良好的可重用性和软件可控性,可重用性本质上就是一个IP提供了若干种工作模式,用户可以根据参数对IP核进行不同的配置,使得IP核在不同配置下被综合成不同的模式。而软件可控性,这里指的是可以通过AXI总线使得SoC部分可以对IP核进行一定的控制,比如在流水线模式下可以提供一些配置参数,在请求响应模式下可以直接进行数据交互。

2.3.1 可重用性设计

在VerilogHDL中,可重用性一般是通过parameter语句和generate语句实现的,generate语句在VerilogHDL1995标准[6]里是没有的,但在VerilogHDL2001标准[7]中,向VHDL学习中它加入了这个语句,现在几乎所有的综合工具都支持这个语句。
parameter语句常用于配置静态参数,来决定模块的工作方式,generate语句则根据parameter语句设定的参数来告诉综合工具哪一部分需要被综合,比如以下代码:

// 0 for pipeline, 1 for req-ack
parameter work_mode = 0;
parameter color_width = 8;
input[color_width - 1 : 0] in_data;
......
generate
    if(work_mode == 0) beign
        ......
    end else beign
        ......
    end
endgenerate
......

根据color_width来确定输入数据的位宽,根据work_mode来确定要综合的部分。此外,generate语句还可以被用来实现逻辑复制,这为流水线的设计减少了不少工作量。

2.3.2 IP核设计

一般情况下,一个单独或者一个系列具有层次的HDL文件便可以被看成一个IP核,这种IP核通用性最强,但从使用效率的角度却不如针对每一个厂商的开发套件专用的封装,本项目使用Vivado作为开发工具,使用的是Vivado的封装工具。
Vivado的IP封装工具在基本的IP封装上加了一层GUI,用于和用户进行直接的交互,一个设计封装好的IP核如图2-5所示:

图2-6 Vivado封装的IP核
图2-6 Vivado封装的IP核

通过这个IP工具,我们可以给模块的参数添加任意形式的约束,由于它支持expr表达式[8],所以我们甚至可以通过某一个参数的取值来自动确定另一个参数的取值,避免了用户自行计算的这一个步骤,例如,我们想要通过im_width这两个参数来确定im_width_bits(图像宽度的位宽)时,可以利用下面的语句来完成 ;

if {[expr log($im_width)/log(2)] > [expr int(log($im_width)/log(2))] } {
    set ${im_width_bits} [expr int(log($im_width)/log(2)) + 1]
} else {
    set ${im_width_bits} [expr int(log($im_width)/log(2))]
}

封装后的IP核有资源文件,一个用于记录IP结构的xml文件和一个控制GUI的tcl文件,以及可能存在的一个服务于expr表达式的gtcl文件构成,这些文件使用相对路径,所以可以很方便地将IP核转移到任何位置。


参考文献

[3] Donald G.Bailey.基于FPGA的嵌入式图像处理系统设计[M].原魁,何文浩,肖晗译.北京:电子工业出版社,2013
[6] IEEE Standard Hardware Description Language Based on the Verilog(R) Hardware Description Language," IEEE Std 1364-1995 , vol., no., pp.1,688, Oct. 14 1996
doi: 10.1109/IEEESTD.2006.99495
[7] IEEE Standard Verilog Hardware Description Language," IEEE Std 1364-2001 , vol., no., pp.0_1,856, 2001
doi: 10.1109/IEEESTD.2006.99495
[8] Xilinx, Vivado Design Suite, Creating and Packaging Custom IP, UG1118 (v2014.3)[EB/OL]. October 8, 2014


感谢

WaveDrom user group, wavedrom, http://wavedrom.com

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