UART自适应任意(典型)波特率原理以及FPGA实现

本文介绍了如何利用特征值自适应原理设计一款FPGA实现的UART通信协议,通过主机发送特定波特率校准信号,从机测量并调整自己的波特率以实现无需预先约定的通信。文章详细描述了接收模块、发送模块的工作机制,并通过仿真和上板测试验证了其功能
摘要由CSDN通过智能技术生成


前言

  在上一篇文章《详解UART通信协议以及FPGA实现》我们实现了UART的通信,我们知道UART通信需要双方约定好波特率,如果想要更换波特率,则需要重新更改代码,重新编译,十分的不方便。所以有没有一种方案就能让通信双方不约定波特率,主机按照主机的波特率发送数据,从机自适应调整自己的波特率跟主机通信。在实际中可以采用特征值匹配的方法实现自适应波特率发生器。

一、特征值自适应原理

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
  在双方开始通信前,主机通过串行接口以自己设定的通信波特率向从机发送 1 个字节的波特率校准信号0X55,从机测量每一个高与低电平的宽度,不算起始位和停止位,一共测量8个码元的宽度值W,最后再除以8得到一个码元的宽度bitwidth,再用测量的码元宽度与典型波特率的码元宽度进行比较,误差1%范围内就算匹配成功。

b i t w i d t h = W 8 bitwidth = \frac{W}{8} bitwidth=8W

二、整体结构框图

在这里插入图片描述
  接收模块在rx线拉低时候,开始接收0X55的校准信号,同时计算每个高低电平的宽度,计算完成后,拉高auto_done信号和正确的波特率码元宽度值给tx模块,tx模块根据新的波特率进行发送。

三、接收模块

在这里插入图片描述

  1. 判断模块:由于典型波特率大部分都成倍数关系,因此码元宽度也成倍数关系,防止给计算模块造成误导,因此保险起见,记录上每个高低电平的宽度。否则如果只计算一个码元的宽度,很容易算错,例如以下情况:
    在这里插入图片描述
      设定系统时钟频率50M,如果主机以115200波特率发送(0X66)数据,如果只判断一个码元的长度,那么计算的值将会是868(波特率为57600),不符合设计要求。
      因此我们设定一个bit宽度计数器,每隔一个沿开始,清空此计数器,如果次计数器超过了最大码元宽度值,表示此数据不是特征值0X55,调整失败。否者就一直累加8次,最后判断一个码元宽度是否在典型波特率的1%误差范围内。
典型波特率码元宽度值
波特率 码元宽度
1200 CLK_FREQ/1200
2400 CLK_FREQ/2400
4800 CLK_FREQ/4800
9600 CLK_FREQ/9600
19200 CLK_FREQ/19200
38400 CLK_FREQ/38400
57600 CLK_FREQ/57600
115200 CLK_FREQ/115200
  1. 接收模块:与上文的rx模块基本上一致,只是接受数据前判断auto_done信号,如果信号拉高了,表示波特率更新完成,可以正常接收数据,然后调整自己的波特率计算值,准备接收数据。否者不会接收数据。

四、发送模块

  与上文的rx模块基本上一致,只是接受数据前判断auto_done信号,如果信号拉高了,表示波特率更新完成,可以正常发送数据,然后调整自己的波特率计算值,准备发送数据。否者不会发送数据。代码如下:

`timescale 1ns / 1ps
module uart_tx
(
    input                                               clk ,
    input                                               rst_n   ,
    input           [23:0]                              baud_cnt_max    ,
    input                                               auto_done   ,  
    input           [7:0]                               tx_data ,       //发送数据
    input                                               tx_data_en  ,   //发送数据有效信号
    output  reg                                         tx  
);

    reg             [7:0]                               tx_data_reg ;
    reg             [23:0]                              baud_cnt    ;
    reg             [3:0]                               bit_cnt ;
    reg                                                 bit_flag;    
    reg                                                 tx_flag ;

//将待发送的数据缓存起来
always @(posedge clk or negedge rst_n) begin
    if
UART通信中波特率自适应是指系统可以根据实际需求动态调整波特率的技术。这种技术可以在不同的传输速率下实现更加稳定和可靠的通信。 首先,UART波特率自适应的源码需要包括两部分:波特率检测部分和波特率自适应部分。波特率检测部分通常通过发送特定的同步字符,然后计算接收到的字符之间的时间间隔来检测当前的波特率。而波特率自适应部分则根据检测到的波特率和设定的目标波特率进行比较,然后动态调整通信时钟的频率。 在实际的源码编写中,可以使用C语言或者汇编语言来实现波特率自适应的算法。首先需要定义好波特率检测算法,可以根据接收到的数据进行计算,并得到当前的波特率。然后根据目标波特率和当前波特率的差值,动态调整系统的时钟频率,并重新配置UART模块的波特率设置。 另外,在编写源码时,还需要考虑到系统的稳定性和实时性,比如需要进行时序分析,避免出现时钟不稳定或者波特率切换时的数据丢失等问题。同时,还需要考虑到不同的微控制器平台可能使用不同的寄存器配置和中断处理方式,因此需要根据具体的硬件平台来进行源码的适配和优化。 总的来说,实现UART波特率自适应的源码需要充分考虑通信协议、硬件平台、波特率算法等多个方面的因素,才能够实现稳定可靠的自适应通信功能。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱奔跑的虎子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值