基于FPGA+DSP的多串口数据通信的实现
通用异步接收/发送器(UART)是一种通用串行数据总线,用于异步通信,可以实现全双工通信。UART IP核是用在外部设备和Atera FPGA芯片上的SOPC间进行串行通信的一种实现方式。它可以替代RS-232实现芯片与外设的输入/输出(I/O)操作。GPS RTK(Real Time Kinematic)可以即时提供厘米级的定位解。在进行动态定位时,基准站将精确已知的GPS坐标和观测数据实时用微波链路传给流动站,在流动站实时进行差分处理,得到基准站和流动站坐标差;坐标差加上基准站坐标得到流动站每个点坐标。基准站向终端用户接收机提供的信息包括对GPS卫星钟、星历数据、用户测量伪距和载波相位等参数的修正。
本文所用的信号处理板可以作为GPS RTK基站使用,可以与其他基站组网接收差分修正数据定位或者本身的高精度单点定位输出定位结果和差分修正数据。作为基准站,不仅要实时输出精确定位信息,而且需要与外界进行差分数据交换。由于同一时间需要大量持续差分数据的输入与输出和用户控制指令的输入,设计采用了3个串口。
1 硬件结构
信号处理板为FPGA+DSP结构,具有多路A/D、D/A转换器件。中频信号经A/D采样后进入FPGA完成去载波,PRN码相关运算,IQ变换等操作后由DSP芯片进行定位解算。通过串口输入的用户控制指令任意选择串口对GPS定位结果的输出和GPS差分修正数据的输入输出。
图1 信号处理板框图
FPGA芯片上配置了3个串口,分别为UART0、UART1、UART2,由SOPC Builder分配相对应的存储映射空间和中断请求。每个模块均使用默认的基地址,并分别设定UART0、UART1、UART2的数据输入中断请求号为IRQ1,IRQ2,IRQ3。另外,DSP芯片可能在任意时刻通过3个串口发送不同数据。
如果DSP对每个串口发送数据时均向NIOS II CPU发出中断申请,则需要3根PIO管脚,占用太多针脚资源。本实现方案通过增加个串口控制寄存器,仅占用1根PIO管脚。
同时,对和DSP芯片进行交互控制的PIO信号分配中断请求号为IRQ0。
每个UART口都有输入、输出两块RAM作为缓存,数据位宽为16bits。其中,串口输入缓存命名为ReadFromMemInterface,串口输出缓存命名为WriteToMemIntedace(见图2)。需要注意的是实际传输数据时,外部设备的串口参数的数据位长度设置为8 bits,因此需要在串口的软件处理进行字与字节的转换。
图2 NIOS II CPU的地址映射
图3是NIOS II CPU在Quatus中的连线示意图,即位于中心的inST6模块。该CPU主要管脚定义如表1所示。
图3 NIOS II CPU在Quatus中的连线示意图
表1 CPU主要管脚定义
值得说明的是,ts_clk输入时钟20.46 MHz即为NIOS IICPU的时钟频率,串口波特率为115 200 bps,可由该时钟分频得到。DSP6713的EMIF为输入输出双向32位,在本设计中串口部分仅使用低16位,使用三态门来控制数据流向。三态门输入输出的使能信号是dsp给出的ce空间使能信号ce_6713。
串口输入数据先由NIOS II CPU写入每个串口的输入缓存,当满足条件时由out_pio管脚向dsp发出中断,用以告知其可以读取相应串口的数据了,缓存的数据由dspread0传递至三态门tri_16.dsp读取时三态门为dsp输入方向,dsp的EMIF数据线evm_D随即出现数据,配合EMIF地址线evm_A即可完成串口输入数据向dsp传递;当dsp有数据要经串口输出时,数据由dsp的EMIF数据线evm_D输入,dsp通过in_pio向NIOS II CPU发出中断信号,请求发送数据。详细的发送接收流程见下文。
2 软件设计
NIOS II CPU的控制代码部分分为主函数和各种中断响应函数。在主函数里完成寄存器初始化、各串口数据输出的任务。串口的中断响应函数则主要完成数据的输入任务。
为了便于FPGA和DSP之间的控制信息交换,每个串口设有地址固定的长度各为32位(4字节)的输入和输出两个控制寄存器。通过对各标志位的读写操作即可实现系统对各串口的控制。串口的输入控制寄存器定义见表2,输出控制寄存器与之类似。
由于用户控制指令(包括信号处理板配置参数、输出数据类型控制等)与差分修正数据的数据长度和数据持续性有很大区别,在常规数据传输方式之外对每个串口增设数据块传输模式。数据块传输模式可用于持续性大量数据的输入,采用每个串口对两块RAM进行乒乓读写操作的来方案实现。是否采用数据块传输模式由串口的控制寄存器中的第14位(P_flag)决定。对于非数据块输入模式中缓存大小需要根据常规数据最大长度来设定,过小会导致部分数据丢失。当有数据需要输出时,由DSP向NIOS II CPU的RAM写入各UART输出控制寄存器的设定值,并通过GPIO向其发出中断信号。可在NIOS II CPU的main函数中设置一个循环检测是否有由DSP输入的中断信号,若有再检测各UART的输出控制寄存器。输出流程图如图4所示。
图4 串口数据输出流程
图4中SET_EN用于设置个串口的输入模式(是否乒乓输入及乒乓输入时缓存的大小)和串口使能等操作,输入控制寄存器的默认值在系统初始化时由DSP写入。
当数据输入时,NIOS II CPU检测到来自串口的中断请求,进入对应的中断响应程序。首先对数据传输模式进行判断,P_flag默认值为0,表示非数据块输入模式。该模式下输入的数据有特定的结尾标志符组合,一旦检测到结束标志则发送已缓存的数据并完成状态清零以便下次接收;P_flag为1则为连续数据块输入,当Half_BAM0或Half_RAM1其中一块写满时即向DSP发出中断信号,DSP即进入中断服务程序读取数据。程序流程图如图5所示。
图5 程序流程图
3 结束语
采用Altera FPGA芯片上的NIOS II CPU控制串口的优点是充分使用硬件资源,可以减轻DSP芯片的计算量。测试表明,NIOS II CPU工作频率为20.46 MHz,串口波特率设置为115 200,数据位为8 bit,各串口可以同时正常输入输出。多串口可以同时输入输出数据,由指令可以灵活配置传输模式,以适应不同数据传输类型的需求。
本文解决了单串口传输不能满足GPS高精度接收机对多种数据同时输入输出的要求,实现了GPS定位结果、RTK差分数据与外界的实时交换以及用户控制命令的输入。本方案的优点是通过增加各串口的输入/输出控制寄存器,使DSP芯片可以仅以两个GPIO资源实现原本需要3个串口输入/输出功能相对应的6个中断操作;采用NIOS II CPU进行多串口控制可以减少硬件调试时间,节约FPGA片内资源。不足之处是未实现串口波特率、数据位等实时配置。
页:
[1]