摘 要: 现场可编程逻辑门阵列(fpga)应用于图像处理时,需要对数据中的图像信息进行准确的提取。设计中,fpga中解压缩功能需要对压缩数据中的图像信息进行提取。根据压缩格式,设计了一种基于状态机的图像信息提取模块,并且在xst(xilinx官方综合工具)以及synplify pro两个综合环境下进行了仿真验证。通过对比仿真结果的差异,尝试分析设计的寄存器传输级视图(rtl视图),并找出了影响状态机工作的关键要素。强调了代码风格对fpga设计的重要性。
0 引言
状态机是数字系统设计中的重要组成部分,是fpga实现高效率高可靠性逻辑控制的重要途径。在实际工程应用中,状态机工作是否正常决定着系统能否稳定工作。本文设计了一个基于状态机的图像信息提取模块,通过对该设计的仿真,分析了状态机设计中的状态竞争、锁存器的引入以及综合工具误判等常见情况。强调了代码规范对于fpga设计的重要性。
1 设计背景及思路
基于相机的实时图像目标仿真系统可以产生实时的虚拟目标图像流,因而被用于光电经纬仪等图像跟踪系统的开发调试。目标仿真系统中虚拟目标是经过dsp以一定的压缩格式压缩后储存于ddr中的,fpga通过srio与dsp通信,读取压缩后的目标图形数据,经过fpga内部解压缩与现实背景叠加输出。该系统中使用灰度图像作为图像源。其简化结构图如图1所示。
目标图像示意图如图2所示,虚拟目标图形以水平方向的线段形式压缩,整个压缩后的目标图形由n条线段组成,每条线段包含该线段的起始行列号、像素点数以及各像素点的像素值。其中每一帧的第一条线段还包含这帧图像压缩后的大小,压缩大小为32 bit。行列号、像素数以及各像素点的像素值均以16 bit表示。
fpga对虚拟目标图像进行复原时,最主要的是对压缩数据中的目标图形的各类信息进行提取,行列号代表着目标图形的位置信息,压缩大小以及像素数表示目标图形的大小信息,像素值则代表各点的灰度信息。本文以有限状态机为基础设计了基于状态机的压缩图像信息提取模块。
首先需要确定状态机的状态数。压缩图像信息提取模块的目的在于将压缩图像的信息进行分别提取,因此根据压缩的数据格式须将数据分为5块进行提取,分别为一帧压缩图像大小(frame_size,32 bit)、每条线段的起始行号(row_no,16 bit)、起始列号(column_no,16 bit)、每条线段的像素数(row_size,16 bit)以及分别的像素值(pic_element,16 bit)。考虑到16 bit的位宽,须将一帧压缩图像大小(frame_size)进行两次提取,由于空闲状态的存在,共设置7个状态,分别为:wait_state(s0)、frame_s_state1(s1)、frame_s_state2(s2)、row_no_state(s3)、column_no_state(s4)、row_s_state(s5)、pic_element_state(s6)。
需要注意的是压缩数据中frame_size只存在于第一条线段,因此frame_size的提取在一帧数据中只进行一次。根据数据大小以及每行像素数,可以设置相应的状态转移条件,相应的信号如表1所示。
压缩数据在帧声明信号到来之后开始传输,当帧声明信号到来时,状态机进入等待状态(s0),随后便开始依次提取第一条线段中的信息,包括帧大小的前16 bit,帧大小的后16位,行号、列号、像素数(即依次进入s1、s2、s3、s4、s5状态),接着将r_done信号拉高,并且开始提取像素值数据(即进入s6状态)直至下一线段到来,第二条线段到来时r_done信号拉低,提取第二条线段的行号(即从s6跳转到s3状态),其余步骤与第一条线段相同,直至一帧信号传输完成(即f_done拉高),状态机跳转置等待状态(s0)。根据上述分析,状态转移图如图3所示。
2 综合仿真
总结前面的分析,可以使用vhdl硬件描述语言对状态机进行描述。在vhdl设计中分3个进程来设计状态机:(1)主控时钟进程,负责下一状态与当前状态的切换,以及相应状态条件的逻辑部分;(2)状态转移组合逻辑进程,根据当前状态及状态条件进行状态转移判断并输出下一状态;(3)同步时序状态输出,用同步时序逻辑寄存状态输出,避免组合逻辑的毛刺与不稳定[1]。
首先在modelsim中对设计的代码进行了功能逻辑仿真。仿真结果与预期结果一致。仿真结果如图4所示。
随后对设计在xst和synplify pro两个综合环境下进行了编译下载,并使用chipscope进行了板级仿真。使用的fpga是xilinx生产的virtex5系列fpga,型号为xc5vlx110t。图5是xst综合后的结果,图6是synplify pro综合的结果。
同一个设计在不同综合环境下出现了差异,xst综合后的时序波形与预期不符,出现了错误,而synplify pro综合后的波形则满足了设计要求。这说明所设计代码存在着问题。下面将尝试着分析这些问题。
3 错误分析
通过对代码的分析,发现代码存在很明显的状态竞争,以下面的代码为例:
when s0=>
if r_done=′0′ and f_done=′0′ then
next_s
if r_done=′0′ and f_done=′0′ then
next_s <=s3;
elsif r_done=′0′ and f_done=′1′ then
next_s
if r_done=′0′ and f_done=′0′ then
next_s<=s1;
else
next_s<=s0;
end if;
将修改后的代码再次综合,分别查看rtl视图,发现xst和synplify pro的rtl视图中分别生成了xst和synplify pro中表示有限状态机的标准模块[3-4],说明本文设计的状态机是符合两者要求的。对完善后的设计进行了板级仿真,仿真结果与预期一致。
对比了修改前后synplify pro综合结果的时钟性能和资源使用的情况,如表2所示。
5 结论
本文提出了一种基于状态机的图像信息提取模块的设计,并进行了仿真分析。从上面的仿真分析可以看出代码的设计风格对于综合结果的影响,综合器作为设计工具,它的综合优化结果是依赖于代码的。同一个逻辑,不同的代码在综合工具中可能产生不同的综合结果,有的如同上面分析的synplify pro,结果一致,但是性能差距很大;或者有些在结果上都不一致,如同上面分析xst一样。因此对于一个fpga设计,初始设计思路是实现设计的关键,同样实现设计的代码语言风格也对设计的结果有着重要的影响[7]。
晨丰科技印度公司已注册完成 将扩大海外LED市场
电力安全工器具力学性能试验机介绍
牵手新希望乳业打造云原生联合创新实验室 打造乳制品行业数字化最佳解决方案
健身房智能镜子的应用成为一种新的健身潮流
5G基站的加速建设,吸引了多家的厂商加码布局
基于FPGA的图像信息提取设计及仿真
物联网场景海量时序数据存储与处理的关键技术
合成数据对于 AI 开发至关重要
LED显示屏+虚拟环境,展现LED无限可能性
FORESEE S800 SSD加载超级电容助力安防存储
5G与物联网这一庞大的技术领域正处在迅猛更迭的阶段
华为真正的危机 来了!
智能型电动机保护器的详细介绍
小米漂流瓶快应用横空出世 语音+快应用还能这么玩
基于FPGA的倏逝波型光纤气体检测研究
半导体行业中的陶瓷材料
电容的选用常识
谷歌承认雇人监听并转录智能助理的录音
AFRD防火门监控系统介绍
小米有品众筹上架了8H Milan智能电动床Pro,众筹价4899元起