杨珍,蒋鑫

(四川九洲空管科技有限责任公司,四川绵阳,621000)

0 引言

二次雷达机系统是对空中目标鉴别与监视的系统,在空中的目标识别与跟踪和空中交通管制等很多方面有极大的作用。点迹板在进行点迹和航迹关联之前,首先应仔细研究点迹报告中的信息,而这些信息则由FPGA 上传的,FPGA的数据源则是由上流译码模块产生的。FPGA 作为数据传输的一环,在以往的设备中是没有经过容错处理就将数据下发至点迹处理模块,一旦数据出问题首先会影响下级模块数据处理,再者排查错误时无法定位是因上层模块错误还是因FPGA 数据透传而引起的错误,给后续应用带来巨大的不变。

本文中的方法可以很好的避免传输错误的数据,可正确完成数据的存储、判断、分发,可保障从FPGA 分发至点迹板模块的数据是符合数据要求的,避免了错误数据下发而导致的点迹模块处理不正常的情况。本方法是基于数据包结构并通过FIFO 和RAM 结合的方式对数据包进行判断处理的,从而保障数据流输出的正确性,保障点迹数据的连续性,并当点迹数据出现异常时能够明确排查思路,确定排查方向。

1 处理流程

FPGA 对数据流的处理是有多种方法的,其中之一是通过异步FIFO 来作为不同时钟域数据传输的缓冲区,该方法下进行写数据和读数据,有写指针与读指针,另外有FIFO控制器来通过外部的读写信号控制指针操作,有不同的写时钟和读时钟,这样的操作只能完成异步数据的处理,并不能判断所接受的数据是否正确,是完全透传译码板下发的数据,不对数据包进行任何判断,带来的影响有两点:(1)译码板与信号处理板数据传输时,可能会因硬件或者机箱周边环境原因而收到干扰,导致信号处理接收数据错误。(2)译码板自身传输的数据源是错误的,而信号处理板透传之后,一旦点迹板检测到数据错误,系统不能直接定位,需要信号处理板和译码板同时配合,会消耗较多的人力资源和时间成本。本文中重点介绍第二种方法:当FPGA 和其他设备进行通信时,如果传输的是大量数据,则需要打包(组帧)进行传输,而且需要有帧头和校验位来确保帧数据传输正确。当FPGA 作为接收端去接收帧数据时,即使保证一帧数据的帧头和校验位均是正确的也不能保证该帧数据是正确的,在本文中运用的包结构是包头+包长+包数据+包校验+包尾的组合,经过该种严谨的包结构,可以避免特殊包数据和包头或者包尾一致时引发的判断错误,降低了因上下级模块之间采样引起的帧数据错误的概率,后端点迹模块采样也必须经过包结构判断后才能使用帧数据。

本文涉及的上级模块的数据是通过请求、应答等握手信号的配合来进行数据传输的,当FPGA 检测到上级模块的请求之后,根据自己的处理、存储情况来判断是否要发送应答信号。当应答信号发送后,则需要做好数据接收的准备。因上级模块传输的数据于高频率、特长数据包结构的数据类型,考虑到后续的流水线工作,需要将数据写入FIFO 中。

当判断FIFO1 中非空时,则应产生读信号,读取数据,此时读出来的数据已经转换到了该FPGA 的时钟域下,以下操作均在同一时钟域下操作。从FIFO1 中读取的数据直接写入RAM 中,同时判断从该FIFO1 中读出的数据是否是协议数据,若数据包符合要求,则同步读取RAM 数据,写入FIFO2 中,点迹模块可以根据FIFO2 的非空信号来读取FIFO2 中的数据。

2 程序及IP 核使用

本文中涉及的FPGA资源比较少,大部分器件均可满足需求。

图1 可以清楚的看到,整个接收、存储、读数据、写数据等处理流程。

2.1 输入信号去毛刺

在对外部输入的请求信号处理之前需进行打拍处理,应该选取稳定状态下的值,避免亚稳态情况下毛刺信号影响整体的时序功能。

2.2 FIFO 设置

文中上级模块数据是根据FPGA 产生的应答有效而产生数据,即对于FPGA 来讲,接收到的数据和FPGA 产生的应答信号是同步的,所以我们采用的是同步FIFO1,需要设置FIFO1 的非空标志、写数据计数器等方便后续操作。

图1 处理流程图

2.3 RAM 设置

本文中使用的是双口RAM,双口RAM 有两组数据线和地址线,读写可以同时进行。

需要注意的地方有:写数据时,双口RAM 存储是在写时钟的上升沿到来时完成的,所以要提前将数据和地址准备好;读数据时,同样要在读时钟上升沿时将地址处于稳定状态;读数据输出时,对于一个地址上的数据是在读下一个地址的数据时才输出到数据线上的,相当于数据的真正输出延迟读时钟一个周期;对于读地址模块的使能应延迟输出使能一个时钟周期,使得地址0 可以保持被时钟上升沿采集到,否则输出的第一位输出不稳定的数据。

2.4 时序处理关键点

写FIFO1 时只需判断FIFO1 非满即可回应外部的请求信号,将数据写入FIFO1 中。

读取FIFO1 中数据时,需同步将读出的数据写入RAM中。对于读出的FIFO1 数据首先判断包头,并且内部计数器需要开始计算接收到的数据长度,根据包头位置可找相应的包长,并根据得到的包长信息,判断最后的包尾是否是协议规定的数据,此时才能判断出这一包数据是否符合协议要求。若符合协议要求,则向RAM 发送读RAM 的请求信号。若RAM 已经响应,但是上一帧数据没有被读走的时候,是不能去读FIFO1 中的数据的,不然会导致RAM 中的数据发生两帧数据冲突。

在写RAM 的时候,同步计算写数据的个数,直到该数据与之前得到的包长度一致时,即写完一包数据,停止写数据和写地址的操作。

当RAM 收到读请求的时候,意味着FIFO1 中的一包数据是正确的了,此时需要判断FIFO2 是否有足够的空间来存储,若FIFO2 空间满足条件,可响应请求,产生有效的读信号和读地址。

RAM 读信号有效时,即可开始对地址指针进行操作,当读FIFO1 数据计数器结果和包长度一致时,将RAM 读地址复位清零,以便下一次数据读取。

RAM 读出数据时,计算好数据、地址、读信号之间的延迟时间,产生写FIFO2 的写指针和写地址,将对齐之后的数据写入FIFO2 中。

FIFO2 的数据读取则要根据下一级模块的时序结合起来操作,本文中可将FIFO2 的非空标志输出至下级模块,下级模块根据非空标志可产生相应FIFO2 读信号。

3 仿真结果

图2 读FIFO1 时序图

图2 中:标记1:外部输入的数据;标记2:FIFO1 写信号与读信号;标记3:从FIFO1 读出的数据;标记4:从FIFO1 读出数据正确,产生读RAM 请求信号及应答信号,此时完成了正确数据流的存储。

图3 读RAM 图

图3 中:标记1 即读RAM 的请求与应答信号;标记2:从RAM 读出数据包,写入FIFO2 中。当判断FIFO2 的存储空间满足需要时,将RAM 的数据包转入到FIFO2 中,以待下级模块的读取。

4 小结

此流程可完成数据的存储、判断、分发,可保障从FPGA 分发至下级模块的数据是符合协议的,避免了错误数据下发而导致的下级模块处理不正常的情况。