基于FPGA 的UART 串行通信参数自适应设计与实现

2021-08-20 10:28钱祥利
电子设计工程 2021年16期
关键词:数据位波特率数据格式

杨 洋,和 蕾,王 旭,钱祥利,陈 飞,李 静

(山东管理学院智能工程学院,山东济南 250357)

通用异步收发传输(Universal Asynchronous Rece iver/Transmitter,UART)遵循串行通信协议标准[1],以其通信线路简单、信息传输稳定等特点,被广泛应用于各种微处理器与嵌入式系统,并作为标准外设之一。

1 通信参数自动配置设计方案

UART 采用异步全双工通信模式,由于没有专用时钟信息线,因此数据发送方与接收方必须采用相同的传输速率,称之为波特率,常用波特率有4 800 bps、9600 bps、19200bps、38 400bps、43000 bps、56 000 bps、57 600 bps、115 200 bps 等。UART 数据传输链路以数据帧为基本单元,如图1 所示,一帧数据包括起始位、数据位、校验位与停止位,其中数据位长度为5~8 bit,校验模式可选奇校验或偶校验,并可以选择是否采用校验位,停止位长度可选1 bit、1.5 bit、2 bit,采用何种数据格式将视当前UART 链路传输要求而定。

图1 UART串行异步通信数据格式

UART 通信链路的建立要求发送设备与接收设备具有一致的波特率与数据格式,否则会导致通信失败。为了使接收设备能够适应来自各种不同波特率发送设备的通信链路,而无需事先建立波特率,很多MCU 或嵌入式处理器在硬件或软件层面集成了自动波特率检测功能[2-4],能够自动检测到主设备的波特率并进行配置,达到自适应的目的。但是传统的方法仅局限于波特率的自适应检测,尚不能对数据格式进行自动配置,当串行通信链路数据格式变更时,就无法自动建立通信链路。为了改变现有技术存在的弊端,使UART 串行通信自适应的方法拥有更强的实用性,文中提出了串行通信参数自适应的概念,介绍了一种可靠的实现串行通信波特率、数据格式自动配置的方法,并基于Xilinx Artix-7 FPGA实现了UART 接口的模块化设计与仿真验证。

UART 串行通信参数自动配置在数据链路层进行,新的传输链路发起或者改变当前波特率、数据格式时,将进行通信参数的自适应配置。通信参数自适应采用特征值匹配的方法,包括参数配置字的发送、接收以及参数自适应与配置。如图2 所示,配置字的固定长度为10 位,从功能上划分为字头波特率同步码与数据格式配置码。从机首先接收并检测波特率同步码,得到串行通信波特率,并以此波特率接收配置字节的数据格式配置码,并将其写入参数配置寄存器(SERIAL_CONFIG),完成通信参数的自动配置,建立串行通信的连接。

图2 串行通信配置字节格式以及接收模式

1.1 波特率自适应检测

传统的自动波特率检测方法主要有两种:最小数法与固定数据传输法[5-6],最小数法是通过不断检测最小的脉冲宽度并与数据位脉宽比较,得到串行通信波特率值;固定数据传输法是通过发送特定配置数据来实现波特率信息的传输。第一种方法的缺点是波特率的识别与判定非常依赖于发送数据的内容,需要不断重复检测,检测效率低、握手时间慢。考虑到该设计不仅要完成波特率自适应检测,还需要进行数据格式的自动配置,所以将波特率与数据格式捆绑为参数特征值,采用固定参数数据传输的方法。

为高效、快速地实现波特率检测,对传统的固定数据传输法进行改进,采用特征值匹配法[7]与查表法[8]相结合的方式。如图2 所示,配置字节中前3 位设定为波特率同步码,将其作为波特率检测的特征值,接收机利用边沿检测电路捕获特征值,并通过时钟计数器测量边沿时间,完成对波特率同步码的时间测量[9]。为消除边沿检测有可能引发的亚稳态,采用两级D 触发器进行边沿检测[10]。时钟计数区间包含2 bit 脉冲宽度,采用100 MHz 的系统时钟作为时钟激励,其频率远大于波特率。通过计算可得,通信采用115 200 bps 的波特率时,时钟计数的时间测量误差比小于0.12%,因此,能够保证很高的时间测量精度。波特率的理论计算公式为:

由于标准波特率在有限的几个固定数值之间变化,同时为了减小FPGA 运算资源的开销,可采用查表法得到链路波特率。时钟计数范围与对应波特率的对照表如表1 所示,由此得到串行通信的波特率。然后将对应的波特率配置码暂存到通信参数配置寄存器SERIAL_CONFIG 的低4 位,供串行通信接收、发送模块读取调用。

表1 波特率、时钟计数范围与参数配置寄存器SERIAL_CONFIG低4位配置码对照表

1.2 通信数据格式的自动配置

图3 为边沿检测、时钟计数与数据格式配置码接收采样信号的时序关系,在得到当前通信链路的波特率后,通过波特率发生器模块(Baud Rate Generator)生成波特率采样时钟信号[11],完成配置字节中数据格式配置码(2~7 bit)的接收,此时配置字节的1 bit 起到“伪起始位”的作用,为配置码接收提供一个波特率位的时间缓冲。波特率发生器是通过对系统时钟(100 MHz)分频得到波特率采样时钟信号,分频因子[12]作为时钟计数寄存器的向上溢出值,其计算方法如下:

图3 串行通信配置字节接收过程时序关系

数据接收采样设定在1/2 的分频因子位置,即在波特率信号周期的中间位置,这样能够提高串行通信对波特率误差的容忍范围[13-14]。

如表2 所示,数据格式配置码接收完毕后暂存到SERIAL_CONFIG 的4~9 位。该寄存器能够被参数接收模块、数据收发模块访问,参数接收模块对其具有写入权限,数据收发模块对其具有读取权限。

表2 串行通信数据格式对在参数配置寄存器中的配置码

2 UART模块的设计与实现

为实现通信参数自适应的UART 通信方案,基于Xilinx Artix-7 系列FPGA 与Vivado 开发平台[15],利用Verilog HDL 硬件描述语言,从逻辑电路层面实现了设计。整体设计从功能可划分为4 个模块单元:TX module(发送模块)、Baud Rate Generator(波特率产生器)、Parameters RX(参数接收模块)与Data RX(数据接收模块)。基于FPGA 的串行通信功能模块结构如图4 所示。

图4 基于FPGA的串行通信功能模块结构

2.1 数据发送模块

在串行通信参数配置完毕后,发送模块便可对通信参数寄存器进行读取。如图4 所示,发送控制器是发送模块的控制核心,在数据发送链路建立之初,读取寄存器中波特率信息、数据格式信息。发送控制器的主要作用还包括:

1)将波特率时钟转化为发送状态时序。在该时序的控制下,数据字节的各位将按照波特率时钟频率发送至TX 总线,无数据传输时保持高电平。

2)根据数据格式控制发送内容,包括数据位长、停止位长、有无校验位,如果存在校验位,将根据校验模式添加奇或偶校验位。通过控制移位寄存器,实现发送数据的并串转换。

2.2 配置参数与数据接收

接收模块在波特率采样时钟激励下进行配置参数与数据的接收,可进一步分为参数接收模块与数据接收模块。配置参数的接收优先于数据接收。接收控制器作为接收模块的控制核心,其主要作用有3个方面:

1)控制波特率检测、配置参数接收和数据接收(或发送)的优先级划分,其中波特率检测具有最高的优先级,数据收发具有最低的优先级。

2)对RX 进行持续边沿检测,确定发送起始位的到来,并将波特率时钟转化为接收状态转化时序。

3)控制接收移位寄存器,对接收数据进行采样,实现接收数据的串并转化。按照数据格式,控制接收的数据及数据长度和校验。

接收控制器对接收优先级的控制是通过有限状态机[16]来实现的,配置参数寄存器的高2 位用于标识串行通信参数的接收情况(波特率、数据格式)。如图5 所示,当检测到信号下降沿,如果通信参数配置完毕,接收状态机进入左侧的配置参数接收状态支路,否则进入配置参数接收支路。

图5 配置参数与数据接收的有限状态机

配置参数接收状态包括空闲状态、时钟计数状态、配置码接收状态、停止位;数据接收状态机与配置参数接收状态机共用空闲与停止位接收状态,其还包括数据位接收、奇偶校验。在接收数据位时,在接收控制器的作用下,根据数据位长度及已经接收到的数据位,选择是否跳转到下一个状态,并根据SERIAL_CONFIG 的第6 位确定下一个状态为校验状态还是停止状态。如果为校验状态,则根据SERIAL_CONFIG 的第7 位来确定校验模式并进行奇(或偶)偶校验。最后,完成数据的存储,并且给出数据是否成功接收或者校验错误标识码。

3 仿真验证与测试结果

3.1 UART功能仿真

基于Vivado 仿真平台进行串行通信参数自适应的功能仿真,主要分两个部分:串行通信参数的接收、数据的收发。

1)串行通信参数的接收

波特率检测以及配置参数的接收仿真如图6所示,仿真波特率为38 400 bps,通信数据格式为8 bit 数据位、奇校验、1 bit 停止位,配置码为8b0001_1101。

图6 波特率检测以及串行通信参数接收功能仿真

当接收模块检测到信号下降沿到来时,并且配置参数寄存器的高2 位为“00”,则进入配置码接收状态,在接收控制器的作用下,参数接收状态机变量(rx_config_status)由“0”(空闲)变为“1”,进行时钟计数,计数大小为5 208。通过查找表得到波特率为38 400 bps,将其存储码(“0111”)写入配置参数寄存器(SERIAL_CONFIG)的低4 位。

为实现数据格式配置码的接收,波特率产生器生成38 400 bps 的采样时钟baud_clk,接收状态由“1”跳转到“2”(接收配置码),利用采样时钟对2~6 bit 进行中间采样,接收配置码为“111000”,将其存储于配置参数寄存器中,同时将寄存器的最高位置1,标识串行通信参数接收完毕。

2)数据的收发

如图7(a)所示,仿真模拟主机发送16 进制数据0x55,当信号下降沿到来时,接收模块首先检测SERIAL_CONFIG 的最高位,如果串行通信参数已经配置完毕,则进入数据接收状态机。

图7 串行通信数据收发功能仿真

接收状态机寄存器变量rx_state 表示空闲状态(0)、起始位(1)、数据位(2)、校验位(3)、停止位(4)5 个接收状态,并在接收控制器的作用下进行状态的跳转。波特率产生器生成38 400 bps 对应的采样时钟信号baud_clk,进行数据的中间采样接收,最终完成数据0x55 的成功接收,并进行奇校验,且校验无误。

图7(b)为发送模块功能仿真,当发送模块接收到发送指令信号tx_data_tvalid,对寄存器变量数据tx_data进行并串转换,输送至uart_tx 信号线,并由发送控制器计算得到奇校验码,添加至数据位尾部一并发送。

3.2 UART模块测试与综合结果分析

为进一步验证UART自适应串行参数配置接口的可靠性与稳定性,将Artix-7FPGA开发板与PC进行联机测试。PC 作为主机,集成了参数自适应功能的FPGA 开发板作为从机,在PC端利用串口调试助手发送配置参数,建立串行通信链路,进行数据收发测试。

该测试采用中、低、高3 个波特率:9 600 bps、1 200 bps、115 200 bps,分别进行测试,每个波特率分别采用奇校验、偶校验、无校验3 种校验模式,数据位分别采用5~8 bit、停止位采用1~2 bit 长度,进行多组测试。测试结果表明FPGA 端的自适应串行参数接口能够准确的获取串行通信参数,并能够建立稳定的通信链接。

4 结束语

文中基于FPGA实现通用异步串行通信的参数自动配置方法,利用特征值匹配与查表法相结合的方式,成功实现了波特率与数据格式的自适应检测以及自动配置。基于Xilinx Artix-7 系列FPGA,利用Verilog 硬件描述语言实现了该方案的UART接口的硬件电路设计。仿真与测试表明,该方法能够快速、稳定地建立串行通信链路。整体设计具有很高的完整性和稳定性。

这种方法突破了传统的波特率自适应方法,不仅可以实现波特率的自适应,同时能够实现串行通信参数中数据格式的自动配置,对通用串行通信的应用方法进行了补充与完善,具有很高的实用意义。

猜你喜欢
数据位波特率数据格式
A320飞机大气数据的采集和计算在排故中的应用
CAN 总线波特率自适应程序设计
基于水利标准数据格式的BIM数据管理和水利BIM生态探索
微弱GPS信号避开比特跳变的捕获算法
一种适用于FPGA系统中的变速箱电路设计
世界首个可记录物体内部结构等复杂信息的3D打印数据格式问世
减少调度自动化设备通讯串口丢包率的措施
论子函数在C语言数据格式输出中的应用
基于ArcGIS的规划数据格式转换研究
C*Core芯片SCI串口波特率容限优化