时间:2024-05-04
喻 鹏
(中国舰船研究设计中心 武汉 430061)
通用异步收发传输(UART)是一种主要将并行信号通过串行方式传输的技术。该技术常用来处理需要并行转串行,传输距离远,数据率要求不高的场合,在工程领域,尤其是嵌入式领域有着较多的研究和应用[1~4]。针对UART 的研究一个方向在于UART 传输中提升传输速率[5],减少误码以及提升性能功耗比。如文献[6]使用CPLD 器件用VHDL 语言完成了基于RS422 的串行接口实现,对各模块的设计作了详细介绍,并具有低于10(^-9)的误码率。文献[7]研究了串口的异步设计实现,并跟三种不同的同步串口设计实现方式作了对比,得出该异步设计串口相对同步设计平均功率消耗仅有四分之一。文献[8]研究了使用FPGA[9~12]实现的UART 串口的各模块详细实现,完成数据的串并转换,以及完成通信所需的任务、时序以及校验等功能。另一方向的研究在于UART 在满足应用场景要求下的实现,如文献[13]中,介绍了一种可实现红外通信以及支持DMA 模式的UART 实现方法,该方法特点是具备DMA模式减少CPU的占用,并在长时间以及不同波特率下均能正常工作。在文献[14]提出的绿色通讯概念,设计了温度感知的高效UART,该设计在不同的温度情况下节能比例可以达到59%以上。
结合上述研究工作,本文结合多板卡仿真系统的应用背景,设计了一种主从设计的UART 串口实现结构,除了利用FPGA 逻辑代码完成数据串并转换,波特率产生,发送接收模块等功能实现外,该实现结构显著特点是能满足在多板卡仿真系统中通过单路UART 完成指令配置与状态监控的方法,并且具有时序满足要求,不占用DSP 计算资源,消耗FPGA资源少的特点。
在星上仿真系统[15]中,包含有多波段图像数据,低帧频图像为扫描过程图像采集结果,高帧频图像为扫描图像中重点观察区域。仿真系统结构如图1 所示,包含多波段图像生成系统,一个主处理板卡与两个协处理板卡,单星地面处理机,地面综合信息处理机。多波段图像生成系统生成多个波段的图像数据发送至主处理版与两个协处理板。三个处理板分别对图像数据做目标提取等相关处理,处理结果通过千兆以太网口发送至单星地面处理机,单星地面处理机对板卡处理结果做多波段信息关联与融合,得到该仿真过程的预警信息。地面综合信息处理机执行板卡的指令下达与状态监控功能。
图1 仿真系统架构
综合信息处理机处理流程如图2 所示。地面综合信息处理机通过USB转串口的硬件接口,将指令控制数据包通过LVDS 差分数据信号与主处理板卡通信。主处理板卡通过通信隔离器完成差分信号到单Bit 信号转换。单Bit 信号进入FPGA 中,由串并转换模块恢复出指令控制数据包。
图2 指令控制架构
协处理板卡1和协处理板卡2在处理完每帧图像后,打包自身状态信息发送至主处理板卡,主处理板卡接收状态信息,分别存入相应缓存FIFO。主处理板卡在每个图像帧处理结束后打包自身状态信息,存入缓存FIFO,并给出Ready 信号。主处理板的发送状态机检测到Ready 信号上升沿后由空闲状态跳转入发送状态。处于发送状态的状态机依次读取主处理板卡,协处理板卡1,协处理板卡2 的缓存FIFO 中数据,将数据合并成完整的状态数据包经时钟匹配、并串转换,通过驱动IC 从板卡发出至综合信息处理机。
指令数据包设计如图3 所示,包含主包头,和相应三个板卡分包头与对应数据内容。
图3 指令包格式
主处理板卡的接收状态机命名为接收状态机0。缓存FIFO 接收整包的指令控制数据包后给出READY=1 的单bit 信号,接收状态机0 在检测到该单bit 信号的上升沿后,状态机由默认的空闲状态开始跳转。其流程如图4 所示。IDLE 状态开始,状态机每个时钟读取出FIFO中一个数据,S1、S2状态判断读取的包头数据内容,是否为协议规定的90H,90H,是则跳入下一个状态;S3 状态判断数据是否为主指令数据包头11H;S4开始读取出主指令数据包数据,通过计数器NS_CNT 控制读取数据数量,在数据数量等于数据包长度LENGTH时进入下一个状态;S5状态判断数据是否为协1指令数据包头;S6 状态读取出协1 指令数据包数据,通过计数器控制数据读取并判断是否进入下一个状态;S7状态判断数据是否为协2指令数据包头;S8状态读取出协2 指令数据包数据,计数器控制数据量并跳入idle状态。
图4 接收状态机0
完成上述流程,接收状态机0 即执行一次接收数据包分解,针对三个板卡的指令数据分别被提取出来,并缓存入对应的缓存FIFO 中。读取主处理板指令缓存FIFO 获得主处理板指令数据,指令数据配置至对应的寄存器,以完成主处理板的指令配置过程。协处理板1 指令缓存入对应FIFO 后,给出协处理板的READY 信号。发送逻辑块读取FIFO 中数据,经过并串转换,并添加起始位,校验位,结束位信号送入UART驱动IC,转换成LVDS的差分信号传输到板卡外部。
协处理板卡1 以差分信号线接收的主处理板卡转发的指令数据,通过UART驱动IC转化为字节数据并缓存入FIFO。当FIFO 缓存数据达到传输协议约定的长度时,给出program_full 信号。协板卡接收状态机1的跳转过程如图5所示。
IDLE:接收状态机的默认状态,并判断写入数据长度(wr_data_count)是否等于指令数据包长度(RX_LEN),若相等则跳转入下一个状态READ_FIFO;
READ_FIFO:将 FIFO 的 读 使 能 信 号(sm_rx_fifo_rden)置为1,并跳转至下一个状态PARAMETER_SET;
PARAMETER_SET:对读取出的指令数据计数(rden_cnt),依据计数值做分支选择,指令数据被配置至相应的寄存器。 判断指令数据计数(rden_cnt),若等于指令数据包长度(RX_LEN),则指令配置结束跳转回IDLE 状态,否则停留在PARAMETER_SET状态。
图5 接收状态机1
协处理板卡1 中的接收状态机1 从PARAMETER_SET跳转回IDLE状态则完成了指令数据获取和配置过程。协处理板卡2 处理流程与协处理板卡1过程相似。
状态信息由协处理板1、协处理板2 将状态信息通过LVDS 信号传输至主处理板卡,主处理板卡缓存协处理板卡状态信息并结合自身状态信息按格式打包成完整的数据包后上传至综合信息处理机。综合信息处理机获取数据包内容显示各板卡的状态信息。
协处理板卡1发送过程如图6所示。
图6 发送状态机1
IDLE:发送状态机的默认状态,在状态数据准备好(READY==1),状态机跳转至WRITE_FIFO 状态,否则停留在IDLE不变。
WRITE_FIFO:进入WRITE_FIFO 状态,发送FIFO 的写使能置为有效(sm_tx_fifo_wren=1),并跳转入SEND_STATUS状态。
SEND_STATUS:该状态先对时钟计数(wr_en_cnt),并且以该计数为条件判断分支,来决定往发送FIFO 中写入的数据。 判断计数wr_en_cnt 达到数据包长度TX_LEN,则跳转入IDLE状态,并结束FIFO写操作。
经一个完整的发送状态机1 的状态跳转,协处理板卡1 的状态信息被写入到发送FIFO 中,在写入FIFO 完毕给出的结束信号触发下,发送逻辑块读取FIFO 中数据,并经过并串转换过程,以及对每个字节数据增加起始位,校验位,结束位信号后变成单bit 数据。数据送入UART 驱动IC,转换成LVDS的差分信号传输到板卡外部。
主处理板卡以接收逻辑块接收两个协处理板卡发送的状态信息,通过UART驱动IC接收差分信号转换来的单bit 数据流,通过识别起始位,校验位,结束位以及串并转换等操作将数据恢复至字节数据,并缓存入FIFO中。
主处理板通过发送状态机0 将自身状态信息以及协处理板卡状态信息打包成完整的状态信息数据包,通过发送逻辑块以及UART驱动IC传递至综合信息处理机中。
状态反馈数据包格式如图7 所示,总长度为LENGTH×3+5,包含三个状态数据包,4个包头控制字。
图7 状态数据格式
发送状态机0的状态跳转流程图如图8所示。
图8 发送状态机0
IDLE:空闲状态,如果数据准备好,即READY信号为1,则跳转至HEAD1 状态,否则停留在IDLE状态。
HEAD1:往发送缓存FIFO 中写入标识字第一个字节EBH,然后跳转入下一个状态HEAD2。
HEAD2:往发送缓存FIFO 中写入标识字第二个字节90H,然后跳转入下一个状态HEAD3。
HEAD3:往发送缓存FIFO 中写入主处理板数据(NS_DATA)标识字11H,然后跳转入START 状态。
START:判断主处理板状态数据准备好(ns_fifo_ready)信号有效,如果有效则将主处理板状态数据缓存FIFO 读使能有效,并跳转入SEND_NS_DATA状态,否则停留在START状态。
SEND_NS_DATA:保持主处理板状态数据缓存FIFO 读使能有效,并计数写入发送缓存FIFO 数据量send_ns_cnt,若其达到协议定义主处理板数据长度(LENGTH),则跳转入HEAD4 状态,否则停留在SEND_NS_DATA状态。
HEAD4:往发送缓存FIFO 中写入协处理板1数据(SM_DATA)标识字22H,并跳转入下一个状态SEND_SM_DATA。
SEND_SM_DATA:保持协处理板卡1状态数据缓存FIFO 读使能有效,并计数写入发送缓存FIFO数据量send_sm_cnt,若其达到协议定义协处理板1数据长度(LENGTH),则跳转入HEAD5 状态,否则停留在SEND_SM_DATA状态。
HEAD5:往发送缓存FIFO 中写入协处理板2数据(SS_DATA)标识字33H,并跳转入下一个状态SEND_SS_DATA。
SEND_SS_DATA:保持协处理板卡2 状态数据缓存FIFO 读使能有效,并计数写入发送缓存FIFO数据量send_ss_cnt,若其达到协议定义协处理板2数据长度(LENGTH),则跳转入END 状态,否则停留在SEND_SS_DATA状态。
END:输出发送缓存FIFO 数据写完(ns_to_zh_end_flag)的信号,并跳转入IDLE状态。
ns_to_zh_end_flag 信号由发送模块拾取,并由发送模块读取发送缓存FIFO 数据,并将数据转换后发送至综合控制机,综合控制机获取的板卡状态参数并实时显示。
本文仿真系统主处理板处理0.1s 每帧的低分辨率图像,协处理板处理3s 每帧的高分辨率图像。主处理板指令的获取与分发,状态信息的收集与上传的逻辑控制块均采用50Mhz 的像素时钟驱动,协处理板卡的指令获取与状态信息的上传采用50Mhz 的像素时钟驱动。串口的波特率通过时钟分频得到115200bps波特率的信号。
以主处理板卡上数据包发送耗时分析有,数据包总长度为5+3*LENGTH=101byte,每个BYTE 在串口传输中以起始位、数据位、校验位、结束位传送。则在串口传输下对应为101*11=1111 个时钟周期。串口速率115200bps,传输过程耗时为9.64ms。主处理板一帧图像接收加算法处理时间为250ms,主处理板中使用1024*1024大小图像,输入cameralink格式采用行无效时间为10像素时钟,接收一帧图像耗时为(1024+10)*1024/50MHz=21.18ms。串口传输在每一帧图像接收周期内即可完成,传输时间消耗满足要求。
多板卡协调过程如图9所示,在主处理板每帧结束时,得到主处理板的算法状态,此时协处理板存在多种状态。A 点时,发送数据包包含有效的主处理板状态信息,无效的协1、协2 处理板状态信息,B点时发送数据包包含有效的主、协1处理板状态信息,无效的协2处理板状态信息,C点时发送数据包包含有效的主、协2 处理板状态信息,无效的协1处理板状态信息。
图9 状态发送时序
在FPGA 中实现的指令控制结构设计,其占用资源如表1 所示,本实现方法中各处理板中FPGA芯片均为Xilinx 公司的Kintex-7 系列的kc325t 型号。
主处理板中占用资源稍多,但寄存器、查找表、块RAM 的占用量均为全芯片资源的1%量级,甚至更小。可见本方法实现的指令控制既实现功能又具有较少的系统资源消耗。
表1 资源占用
硬件仿真系统中算法处理器件为FPGA,经利用FPGA 的剩余资源实现指令控制系统,避免了使用DSP 做指令控制导致的器件资源浪费。同时经过时间性能分析,工程实际验证,指令传输耗时低于10ms,在时序上满足硬件仿真系统的需求,并且硬件资源占用量少,对硬件仿真系统本身性能不产生影响,并能够持续稳定地完成指令下发、状态上传等指令控制功能。
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!