基于FPGA的数字图像处理【2.6】

4.4 其他设计技巧

4.4.1 合理处理参数

        在实际设计中,资源的消耗是首先需要考虑的问题:资源的消耗上升意味着成本的上升。不仅如此,当在一个FPGA设计中,资源消耗过多时,往往会给时序收敛带来很大的挑战。原则上,资源消耗为FPGA总资源50%左右是合理的,超过80%的资源消耗就必须考虑资源优化问题。对于图像处理任务,往往资源消耗相当大,也给资源的优化工作提出了比较大的挑战。
        在图像处理算法中,有许多可设置的参数,常用的参数有图像宽度、图像高度、阈值和处理窗口尺寸等。在软件算法中,这些参数通常是作为形参传入算法中,是运行时可变的,并不是编译时指定的。但是,这在FPGA设计中并不适用。由于FPGA处理的特点,图像分辨率的增加和处理尺寸的增加所带来的资源消耗会成倍增加,图4-32和图4-33分别是对图像分辨率为640×512、位宽为8位、处理窗口尺寸分别为3×3和5×5的二维求和模块的综合资源消耗统计图。

图4-32 尺寸为3×3的综合结果:共消耗473个逻辑资源,32768个内存单元

        在处理尺寸为3×3时,模块消耗的逻辑单元为473个,而5×5的处理尺寸,模块消耗的逻辑单元为766个,提升了将近一倍。同时,存储块消耗也提升了一倍(由于增加了一个行缓存)。
        如果在FPGA也考虑处理尺寸和分辨率的运行时调整,那么系统设计的资源消耗必然是资源消耗最大时的参数,同时也给设计带来了挑战。因此,正确的设计方式是在编译时就确定好参数,参数的确定和调试工作交给软件来完成(实际上,我们在开始FPGA设计时参数已经是经过调试好的稳定参数)。因此,在图像处理模块设计中,通常会将这些参数作为编译时参数,如下所示为一个典型的模块定义:

module sum_2d(
rst_n,
clk,
din_valid,
din,
dout,
vsync,
vsync_out,
is_boarder,
dout_valid
);
parameter DW = 8; //数据位宽
parameter KSZ = 5; //求和窗口尺寸
parameter IH = 512; //图像高度
parameter IW = 640; //图像宽度

        在实际中,当然会遇到运行时参数不同的场合,例如,在视频缩放的时候,图像分辨率会随着缩放比例而变化。庆幸的是,如果采用流水线的设计方式,图像分辨率的变换对处理逻辑资源带来的变化不会很大,除非是需要对图像进行存储或缓存(将会消耗更多的片上块RAM)。一般情况下,目前的视频或图像分辨率不会超过4K×4K,也就是4096×4096,因此2个12位的寄存器就可以存放分辨率参数。还有一种情况是算法要求有不同的配置参数,或是算法要调用两个不同尺寸的模块进行进一步处理(例如双均值滤波),这时模块设计就必须考虑不同尺寸的处理。

4.4.2 资源及模块复用

        通过使用复用器可以使设计中的多个部分共享一个昂贵的资源。要达到这个目的需要三个条件。第一个条件是共享资源所用复用器的资源更少。例如,在大多数情况下共享加法器是不现实的,因为建立一个加法器所需的开销通常比需要共享这个加法器所需复用器的开销少。共享一个复杂的功能模块则是很实用的。第二个条件是每个实用该资源的单元必须只是部分使用该资源。如果资源的实例完全被使用,那么多个单元之间共用一个实例会减慢系统的速度。第三个条件是需要考虑使用资源的时序。如果设计的多个部分必须同时使用该资源,那么该资源不能被复用,必须创建该资源的多个副本。
        共享资源的一个限制是进制对资源进行多个同时访问,就得设计仲裁电路,这无疑会增加设计的复杂性和消耗一定的资源。防止冲突的一个简单思路是计划性访问。采用这种方法时,通过设计算法使访问能独立进行或者安排在不同的时间进行来避免冲突。

4.4.3 防止亚稳态

        在FPGA系统中,如果数据传输中触发器的Tsu 和Th 不满足,或者复位过程中复位信号的释放相对于有效时钟沿的恢复时间(recoverytime)不满足,就可能产生亚稳态。此时,触发器输出端Q在有效时钟沿之后比较长的一段时间处于不确定的状态。在这段时间里Q端在0和1之间处于振荡状态,而不是等于数据输入端D的值。这段时间称为决断时间(resolution time)。经过resolution time之后Q端将稳定到0或1上。但是稳定到0或者1是随机的,与输入没有必然的关系。亚稳态的产生原理如图4-34所示。

        亚稳态的主要危害是破坏了系统的稳定性。存在亚稳态的输出信号对后续信号的处理带来的影响,可能是由于引入毛刺、振荡或固定的错误电压而造成的。因此,亚稳态将导致逻辑误判。在严重情况下,输出0~1的中间电压值还会使下一级产生亚稳态。另外,在亚稳态状态下,对于任何噪声诸如环境,只要系统中有异步元件,亚稳态就是无法避免的。亚稳态主要发生在异步信号检测、跨时钟域信号传输及复位电路等常用设计中。
        在FPGA设计中,通常用以下几个主要方法来尽量避免亚稳态。
1.异步多拍处理
        多拍处理也是降低亚稳态发生概率的经典处理方法。模块引入异步信号(与本地时钟不同域的信号)必须进行多拍处理防止亚稳态。三级寄存器同步是常用的同步方法,经过三级寄存器之后,亚稳态出现的给概率基本为0,如图4-35所示。
        图4-36所示为一个正常第一级寄存器发生了亚稳态,第二级、第三级寄存器消除亚稳态时序模型。

        在一些对系统稳定性要求更高的场合(例如军工领域),可能还会要求更多拍处理,以便进一步提高系统稳定性。
2.FIFO异步缓存
        对于同频不同相的异步时钟域,可以采用三级寄存器对齐进行本地同步,这种同步方式仅仅适用于对少量错误不敏感的功能单元。对异步时钟域的处理,更可靠的方式是采用异步缓存。一般情况下,我们会选择一个异步FIFO作为异步缓存。
        对于不同频不同相的异步时钟域,只能用异步缓存来进行同步,这是由于需要缓存来进行带宽匹配。
3.异步复位,同步释放
        单纯的同步复位和异步复位都会带来亚稳态问题,异步复位亚稳态现象如图4-37所示。
如果异步复位信号的撤销时间在Trecovery (恢复时间)和Tremoval(移除时间)之内,那势必造成亚稳态的产生,输出在时钟边沿的Tco后会产生振荡,振荡时间为Tmet (决断时间),最终稳定到“0”或者“1”,就会可能造成复位失败。同步复位亚稳态现象如图4-38所示。

        当输入端din为高电平,而且复位信号的撤销时间在clk的Tsu 和Th 内时候,亚稳态就随之产生。如图4-38时序所示,当复位撤销时间在clk的Tsu 和Th 内,输入数据为“1”,通过和输入数据相与后的数据也在clk的Tsu 和Th 内。因此,势必会造成类似异步信号采集的亚稳态情况。
        最常用的复位处理方式是采用异步复位、同步释放,同时为保证系统有效复位,在实际应用时,我们还需对复位信号进行展宽。一般情况下,展开的宽度在几百毫秒以上,如图4-39所示为一个常用的复位电路。

第5章 系统仿真

        仿真与调试在FPGA开发过程中的作用不言而喻。毫不夸张地说,仿真与调试在实际开发中所占的时间远远大于开发过程。
        FPGA的仿真工作又可以分为前仿真和后仿真。前仿真即功能仿真,是在不考虑器件延时和布线延时的理想情况下对源代码进行逻辑功能的验证;后仿真即时序仿真,时序仿真主要是在布局布线后进行,它与特定的器件有关,在仿真时要包含器件和布线的延时信息,主要用来逼近系统的实际工作情况。其余的仿真步骤有综合后仿真和映射后仿真等,但这两个仿真意义不大。
        在FPGA图像处理的应用场合,由于涉及二维图像的行列对齐,以及比较复杂的图像处理算法,我们会把大部分的精力花在功能仿真上面。因此,功能仿真也是本书介绍的重点。

5.1 Modelsim使用基础

5.1.1 Modelsim简介

        Mentor公司的Modelsim是业界最优秀的HDL语言仿真软件,它能提供友好的仿真环境,是业界唯一的单内核支持VHDL和Verilog混合仿真的仿真器。它采用直接优化的编译技术、Tcl/Tk技术和单一内核仿真技术,编译仿真速度快,编译的代码与平台无关,便于保护IP核,个性化的图形界面和用户接口,为用户加快调错提供强有力的手段,是FPGA/ASIC设计的首选仿真软件。
Modelsim的主要特点如下:
(1)RTL和门级优化,本地编译结构,编译仿真速度快,跨平台跨版本仿真。
(2)单内核VHDL和Verilog混合仿真。
(3)源代码模版和助手,项目管理。
(4)集成了性能分析、波形比较、代码覆盖、数据流ChaseX、Signal Spy、虚拟对象Virtual Object、Memory窗口、Assertion窗口、源码窗口显示信号值、信号条件断点等众多调试功能。
(5)C和Tcl/Tk接口,C调试。
(6)对SystemC的直接支持和HDL任意混合。
(7)支持SystemVerilog的设计功能。
( 8 ) 对 系 统 级 描 述 语 言 的 最 全 面 支 持 : SystemVerilog ,SystemC,PSL。
(9)ASIC Sign off。
(10)可以单独或同时进行行为(behavioral)、RTL级、和门级(gate-level)的代码。
        ModelSim分为几种不同的版本:SE、PE、LE和OEM,其中SE是最高级的版本,而集成在 Actel、Atmel、Altera、Xilinx及Lattice等FPGA厂商设计工具中的均是其OEM版本。SE版和OEM版在功能和性能方面有较大差别,例如对于大家都关心的仿真速度问题,以Xilinx公司提供的OEM版本ModelSim XE为例,对于代码少于40000行的设计,ModelSim SE的仿真速度比ModelSim XE的快10倍;对于代码超过40000行 的 设 计, ModelSim SE 的 仿 真速 度 比 ModelSim XE 的 快 近 40 倍 。ModelSim SE支持PC、UNIX和LINUX混合平台;提供全面完善及高性能的验证功能;全面支持业界广泛的标准;Mentor Graphics公司提供业界最好的技术支持与服务。
        本书中所采用的Modelsim的软件版本为Modelsim SE 10.1a。

5.1.2 Modelsim图形界面及仿真示例

        本节将介绍如何利用Modelsim SE的gui图形界面进行仿真。首先熟悉一下Modelsim的主界面,如图5-1所示。

        序号1所指方框是sim及project窗口:sim窗口主要是查看当前仿真实例及单元,project窗口则提供了当前工程中的设计文件,包括设计源文件及testbench,标准时延文件等。
        序号2所指方框是object窗口:主要查看当前sim窗口所选中的仿真实例所包含的信号、常量及变量等。
        序号3所指方框是 Wave窗口:当前活跃的仿真信号窗口。
        序号4所指方框是 Wave波形窗口:仿真波形窗口。
        序号5所指方框是 Library窗口:当前工程所用的库。
        序号6所指方框是Transport窗口:命令行的接口、输入执行命令、标准脚本命令及查看运行结果等。
        序号7所在方框是工具栏:常用的功能包括缩放、执行、停止及信号边缘查找、光标管理等功能。
        以下是一个典型的仿真流程,以一个简单的加法器电路仿真流程来进行讲解。
1.新建工程和编译IP库
        功能仿真不建议直接用quartus或是ISE调用Modelsim进行仿真,实践证明这样做不仅耗时费力,还会出现各种意想不到的问题。最好的方法是首先在Modelsim里面新建一个工程,在这个工程里面设计代码、编译和进行功能仿真。Modelsim新建工程的选项如图5-2所示。

        需要指定的内容有工程名字、工程地址(不能包含中文路径)、默认库名字(一般情况下为work)和modelsim.ini文件路径。需要说明的是最后一个选项modelsim.ini,该文件是整个Modelsim的配置文件,每次打开工程时软件都会去读取这个指定的配置文件,主要是用来映射设计库,包括系统默认的IEEE库、Altera和Xilinx的IP库及用户的设计库等。
以下为Modelsim中的库文件指定选项示例:
;标准库,$MODEL_TECH代表Modelsim的安装路径

std = $MODEL_TECH/../std
ieee = $MODEL_TECH/../ieee
vital2000 = $MODEL_TECH/../vital2000
;altera IP库
altera_mf_ver = $MODEL_TECH/../altera/verilog/altera_mf
altera_ver = $MODEL_TECH/../altera/verilog/altera
220model_ver = $MODEL_TECH/../altera/verilog/220model
alt_ver = $MODEL_TECH/../altera/verilog/alt_vtl
;用户设计库
img_process = C:/Users/jayash/Desktop/sim/work

        我们在新建工程的时候其实已经新建了一个库,这个库的名字就是work(当然也可以进行手动修改)。实际上,我们自行设计的逻辑也都封装到了这个库里面,上述实例中的img_process库即为用户的设计库,这里封装了一些基本的图像处理的算法,在设计比较复杂的算法时,可以直接将该库包含进来,并直接调用里面的设计模块。
        在我们的设计中,使用FPGA厂家提供的IP核是不可避免的。这时就必须首先将需要用到的IP库进行编译,并添加到当前的工程中,最好的办法是直接将编译好的库目录写入modelsim.ini文件中去(正如前面的示例)。
        Xilinx公司提供的仿真库编译工具可以直接对其支持的所有器件进行直接编译,编译工具打开后如图5-3所示。

  • 18
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BinaryStarXin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值