APP下载

UART 波特率检测电路的FPGA 设计算法与实现

2022-10-15吴朝晖曲立国

现代电子技术 2022年20期
关键词:数据位源码波特率

吴朝晖,曲立国

(安徽师范大学 物理与电子信息学院,安徽 芜湖 241000)

0 引 言

通用异步接收发送器(UART)是最常用的异步通信时钟的串行通信方式,使用时通信双方需要设置相同的波特率、数据位、校验位、停止位等参数。波特率发生器是UART 接口电路中的重要组成部分,它用于产生接收和发送信号时所需的时钟信号。

近年来,出现了一种自适应波特率发生器,可以检测信号发送方的通信波特率,然后产生相应的波特率。这种自适应的波特率发生器设计方法主要有硬件法和软件法。其中用FPGA 硬件实现的方法主要体现在:方案1 特征值匹配法,要求发送方发送特定的数据帧,比如0x55,0xAA 或0x00,然后检测脉冲周期,算出波特率;方案2 要求发送方在发送第1 个数据时,确保其第1 位码元为1;方案3 不要求特定数据,不断检测时间间隔,找到最小的时间间隔作为计算波特率的依据。方案1,2 都要求特定数据帧,而方案3 得出的最小时间间隔不一定就是实际最小的时间间隔。

本文首先分析所有可能的信号波形,得到每种波形特征参数并进行分类;再基于FPGA 设计出波特率检测电路,遇到可确定唯一的波特率的波形,就根据脉宽计算出波特率,否则可以忽略等待下一个波形。

1 波形特征分析

为了进行波形分析,假设通信时一帧数据由1 位起始位、8 位数据位、1 位停止位共计10 个数据位构成,其中数据位的低位在前,高位在后。UART 信号波形如图1 所示。

图1 UART 信号波形

1.1 波形特征参数

8 个数据位共有256 种不同的信号波形。波形的上升沿与下降沿之间的时间间隔(gap)等于1 个或多个位(bit)周期。每个波形都有确定的间隔数(gaps)和各个间隔宽度比例(gap ratio),这两个参数是波形的特征参数。例如数据“0xE3”的信号波形含有3 个时间间隔(3 gaps),各时间间隔宽度比例为1∶2∶3。波形图如图2所示。这个信号的波形特征是唯一的,最小时间间隔是间隔1(gap1),其宽度就是一个bit 位的宽度,根椐宽度就可计算出波特率。

图2 数据“0xE3”的信号波形

1.2 无法确定波特率的波形

并非所有数据的信号波形都是唯一的,例如:数据“0xFB”和“0x9E”的波形都含有3 个时间间隔数,如图3和图4 所示。“0xFB”的波形间隔宽度比例都是1∶2∶1,“0x9E”的波形间隔宽度比例为2∶4∶2,化简后也是1∶2∶1,因此2 个波形看起来是相似的,特征参数完全相同,无法区分。按最小宽度计算的波特率可能是正确的,也可能是实际波特率的1/ 2。计算结果表明,在256个数据中,有18 个数据波形特征参数不唯一,无法确定唯一的波特率,见表1,占比约为7.03%。其波形特征又分两种情况:

表1 特征参数不唯一的信号

图3 数据“0xFB”的信号波形

图4 数据“0x9E”的信号波形

1)间隔数为1 时,有9 种情况,波形都相似,特征参数全部相同,无法区分。

2)间隔数为3 时,也有9 种情况,化简后有4 种比例关系,分别是1∶1∶1,1∶2∶1,1∶1∶2 和2∶1∶1。由于存在不同数据对应相同的间隔宽度比例,特征参数相同,无法区分。

1.3 可确定波特率的波形及波特率计算

除了前面的18 个数据之外,其他238 个数据都具有唯一的特征参数,即可以确定唯一的波特率,间隔数分别为3,5,7,9。可分两种情况:

1)间隔数为5,7,9 的波形,特征参数都是唯一的,并且由最小时间间隔宽度决定其波特率。比如数据“0x7B”,时间间隔数为5,时间间隔宽度的比例为1∶2∶1∶4∶1。其最小间隔宽度就是1 bit 宽度,此宽度可决定波特率。

2)间隔数为3 的波形,除去前面所说的9 种无法确定唯一的波特率的波形外,还有15 种波形的间隔宽度的最小比例为2,在计算这些波形的波特率时,应将最小间隔宽度减小1/ 2,具体数据如表2 所示。

表2 特征参数唯一,但计算波特率时宽度要减小1/ 2 的数据

对于256 种可能的数据波形,其波形特征由间隔数(gaps)和间隔宽度比例(gap ratio)两个参数决定。而间隔数只有1,3,5,7,9 五种可能,可分为以下3 类:

1)间隔数为1 的,有9 种相同波形,无法确定波特率。

2)间隔数为5,7,9 的,有163 种不同波形,其波特率由最小间隔宽度决定。

3)间隔数为3 的,有84 种波形,分3 种情况:9 种波形无法确定波特率;60 种波形的波特率由最小间隔宽度决定;而另外15 种波形则要将最小间隔宽度减半才能得到正确的波特率。

2 算法设计及FPGA 实现

本设计采用Verilog HDL 语言建模编程实现对通信发送方的信号波特率的检测,并用FPGA 芯片实现。首先需要根据通信发送方的波形提取2 个重要特征参数,即间隔数(gaps)和各间隔宽度比例(gap ratio);然后根据波形特征识别出18 种无法确定的波特率和15 种需要将最小间隔宽度减小1/ 2 才能正确计算波特率的波形。

2.1 边沿检测电路设计

利用快速的clk信号(比如50 MHz)对信号进行整形,利用两级D 触发器可消除亚稳态;再通过两级D 触发器,获取2次时钟的采样值,判断上升沿与下降沿。部分源码如下:

always@(posedge Clk or negedge Rst_n)

if(!Rst_n)begin

tmp0_Rx <=1′b0;tmp1_Rx <=1′b0;

end

else begin

tmp0_Rx <= s1_Rx;tmp1_Rx <= tmp0_Rx;

end

assign nedge=!tmp0_Rx && tmp1_Rx; //检测上升沿

assign pedge= tmp0_Rx && !tmp1_Rx; //检测下降沿

2.2 有限状态机

电路按有限状态机设计,分为空闲状态(idle)、信号检测状态(checking)和数据处理状态(processing)。状态转换图如图5 所示。

图5 状态转换图

1)在空闲状态(idle),信号为初始化状态。信号脉冲宽度计数(gap[10:0])清零,时钟计数(clk_cnt)清零,信号边沿计数(edges)置1。一旦检测到信号上升沿或下降沿,即进入信号检测状态。部分源码如下:

gap[0]<=22′b0;

gap[10]<=22′b0;

clk_cnt=22′b0;

edges<=4′b1;

if(pedge||nedge)state<=checking;

2)在信号检测状态(checking),每次时钟上升沿到来时,信号脉冲宽度计数值(gap[edges])递增。如果检测到上升沿或下降沿(nedge||pedge),信号边沿计数值(edges)递增,同时记录最小信号脉冲宽度(min_gap)。部分源码如下:

if(nedge||pedge)edges<=edges+4′b1;

gap[edges]<=gap[edges]+22′b1;

if(edges==2) min_gap=gap[edges-1];

else if(edges>2 && gap[edges-1]

min_gap=gap[edges-1];

clk_cnt=clk_cnt+22′b1;

if(clk_cnt>min_gap*10 && edges>1)

state<=processing;

3)在数据处理状态(processing),根据边沿数(edges)和信号脉冲宽度计数值(gap[edges]),判断是否可计算出波特率(chk_ok)。部分源码如下:

chk_ok=1′b1;

if(edges==2||edges==0) chk_ok=1′b0;

else if(edges==4)

begin

if(equals(gap[1],gap[2],1))begin

if(equals(gap[1],gap[3],1)) chk_ok=1′b0;

else if(equals(gap[3],gap[1],2)) chk_ok=1′ b0;

end

else if(equals(gap[1],gap[3],1))

if(equals(gap[2],gap[1],2)) chk_ok=1′b0;

else if(equals(gap[2],gap[3],1))

if(equals(gap[1],gap[2],2)) chk_ok=1′b0;

end

2.3 计算波特率

另外,还有辅助进程,用于判断是否将最小信号脉冲宽度除以2(div)等。部分源码如下:

if(div)

Baud<=(50 000 000/min_gap)<<1;

else

Baud<=50 000 000/min_gap;

3 仿真与实现

使用Quartus 13.1 开发工具和相应的ModelSim 仿真器对电路进行仿真,如图6 所示。

图6 波特率检测的仿真

仿真时采用时钟clk 为50 MHz 方波,输入各种不同信号,信号RxD 的波特率为9 600,38 400,115 200 等,对于可以判断波特率的信号,均可计算出正确的波特率,其中chk_ok 是检测成功的标志。利用内置ALTERA公司EP4CE10F17C8 芯片的FPGA 开发板进行下载验证,通过串口调试助手发送不同波特率的信号,显示并设置波特率,与预想的一致。

4 结 语

根据UART通信发送方发送的特征,约7%的信号无法正确识别,处理方法是忽略并继续等待。约93%的信号可以准确计算出波特率,识别并进行设置,同时发送检测成功标志。本文只针对最通用的信号进行分析(即1 帧数据由1 位起始位、8 位数据位、1 位停止位组成),有一定的局限性,对于其他情况还需对算法进行修改。

猜你喜欢

数据位源码波特率
基于网页源码结构理解的自适应爬虫代码生成方法
基于图神经网络的软件源码漏洞检测方法
A320飞机大气数据的采集和计算在排故中的应用
企业如何保护源码
CAN 总线波特率自适应程序设计
一种用于FPGA的片上可配置SRAM设计
基于FPGA的异步串行通信波特率容错设计
一种适用于FPGA系统中的变速箱电路设计
基于数据结构教辅系统的实验课程改革
减少调度自动化设备通讯串口丢包率的措施