最近在整理串口通信的时候,敲完程序,想到能不能实现波特率自适应功能(起初想实现任意频率的波特率识别,后来发现能力不够,那就转为常见波特率识别吧)。
第一步查阅资料看看别人这是咋做的:波特率自适应常见方法:
1.硬件检测波特率,一些硬件设备自带波特率检测功能例如一些STM32的单片机(硬件检测没啥好说的)。
2.软件检测波特率:
(1):特征值匹配:收发双方约定一个特殊字符,接收方根据接受的数据查表确定波特率。
李斌斌,冯涛,谷丽. 串口波特率与数据位参数自适应算法的研究与实现[J]. 计算机光盘软件与应用,2014(3):279-280.
(2):发送方发送超宽低电平脉冲,使接收方进入波特率调整状态,并对下一帧数据0x00确定新的波特率。
孙夫文,郑采君,刘昕卓,等. 基于FPGA串口波特率自适应功能的设计与实现[J]. 电子设计工程,2019,27(9):69-73. DOI:10.3969/j.issn.1674-6236.2019.09.016.
上述两种波特率调整方法都需要提前约定检测条件,那么如何设计一套不需要发送特殊字符也能正确调整波特率的算法呢?虽然波特率未知,但是起始位是确定可测的,如果我们采用0校验方式,则每帧数据的0校验位一直为低电平。那么我们已知起始位置,已知校验位点平,我们通过检验校验位位置电平即可知道当前波特率是否合适,如果不合适,则遍历已知波特率直到达到合适。通过这种方法就可以在更改波特率时不需要发送特殊字符给接收方,而接收方可以自动调节的功能。
特点:更改波特率前不需要通知接收方,接收方自动调整、把0校验位作为判断依据,不需要改变帧结构、最重要是没看到有人这样做(可能没啥实用性吧,不过能够和别人不一样就行)。

/*整体实现功能和串口接收程序一样只不过是多检测了一个0检验位,可以直接整合进串口接收程序,这里为了实现模块化,所以把波特率自适应功能单独做一个模块,方便直接添加进串口收发顶层文件中*/
module bps_DR_detect(input clk, input rst_n,input rs232_rx,output reg [2:0]baud_set
);
//同步寄存器,消除亚稳态
reg s0_rs232_rx,s1_rs232_rx;
reg temp0_rs232_rx,temp1_rs232_rx;
always@(posedge clk or negedge rst_n)if(!rst_n)begins0_rs232_rx<=1'b0;s1_rs232_rx<=1'b0;endelse begins0_rs232_rx<=rs232_rx;s1_rs232_rx<=s0_rs232_rx;end
//检测下降沿-帧起始位
always@(posedge clk or negedge rst_n)if(!rst_n)begintemp0_rs232_rx<=1'b0;temp1_rs232_rx<=1'b0;endelse begintemp0_rs232_rx<=s1_rs232_rx;temp1_rs232_rx<=temp0_rs232_rx;end
wire nedege;
assign nedege=!temp0_rs232_rx & temp1_rs232_rx;
reg bps_clk;
reg [15:0]div_cnt;
reg uart_state;
reg [15:0]bps_DR;
//分频计数
always@(posedge clk or negedge rst_n)if(!rst_n)div_cnt<=16'd0;else if(uart_state)beginif(div_cnt==bps_DR)div_cnt<=16'd0;elsediv_cnt<=div_cnt+1'b1;   endelsediv_cnt<=16'd0;
always@(posedge clk or negedge rst_n)if(!rst_n)bps_clk<=1'b0;else if(div_cnt==16'd1)bps_clk<=1'b1;else bps_clk<=1'b0;
reg [3:0]bps_cnt;
always@(posedge clk or negedge rst_n)if(!rst_n)bps_cnt<=4'd0;else if(bps_cnt==4'd10)bps_cnt<=4'd0;else if(bps_clk)bps_cnt<=bps_cnt+1'b1;else bps_cnt<=bps_cnt;
reg Rx_done;
//一帧接收完成
always@(posedge clk or negedge rst_n)if(!rst_n)Rx_done<=1'b0;else if(bps_cnt==4'd10)Rx_done<=1'b1;elseRx_done<=1'b0;
//读校验位电平
reg r_data_bit;
always@(posedge clk or negedge rst_n)if(!rst_n)r_data_bit<=1'b0;else if(bps_cnt==4'd10)r_data_bit<=s1_rs232_rx;elser_data_bit<=1'b0;
//调整波特率
reg [2:0]DR_cnt;
always@(posedge clk or negedge rst_n)if(!rst_n)DR_cnt<=3'd0;else if(DR_cnt==3'd4)DR_cnt<=3'd0;else if(r_data_bit)DR_cnt<=DR_cnt+1'b1;
always@(posedge clk or negedge rst_n)if(!rst_n)beginbaud_set<=3'd0;bps_DR<=16'd5207;endelse begincase(DR_cnt)0:begin baud_set<=3'd0;bps_DR<=16'd5207;end1:begin baud_set<=3'd1;bps_DR<=16'd2603;end2:begin baud_set<=3'd2;bps_DR<=16'd1301;end3:begin baud_set<=3'd3;bps_DR<=16'd867;enddefault:begin baud_set<=3'd0;bps_DR<=16'd5207;endendcaseend
//状态判断
always@(posedge clk or negedge rst_n)if(!rst_n)uart_state<=1'b0;else if(nedege)uart_state<=1'b1;else if(Rx_done)uart_state<=1'b0;elseuart_state<=uart_state;
endmodule

仿真波形如下图所示,通过三帧数据实现了接收波特率等于发送波特率,实现了波特率自动调节和数据的正确接收。理论上最大调整时间为已有波特率数量-1;

串口波特率自适应算法(仿真通过)相关推荐

  1. ZIGBEE(CC2530,ZSTACK)串口波特率自适应

    在使用ZigBee进行数据透传的时候,我遇到了这样的情况:负责采集数据的两个单片机之间的波特率不相同,一个是38400,另一个是115200,但是负责传输数据的CC2530除了波特率之外,其它的代码都 ...

  2. STM32学习:串口通讯(proteus仿真)

    文章目录 前言 一.相关知识点 二.电路搭建与硬件配置 1.proteus电路搭建 1.COMPIM元件 2.VIRTUAL TERMINAL虚拟终端元件 3.整体电路: 2.CubeMx硬件电路配置 ...

  3. 基于自适应算法和增量式PID算法的模拟直升飞机控制系统

    基于自适应算法和增量式PID算法的模拟直升飞机控制系统 文章目录 基于自适应算法和增量式PID算法的模拟直升飞机控制系统 控制系统硬件 单片机系统 传感器系统介绍 直升机模拟系统介绍 系统模块介绍 A ...

  4. GD32F103单片机设置时钟到108MHz,串口波特率错误的问题?

    这里写自定义目录标题 使用GD32F103单片机设置系统时钟到108MHz,使用定时器.PWM等外设时候都运行正常,但是初始化串口后波特率始终不对.在网上找了一些解决办法均无效,于是开启调试模式,一步 ...

  5. (转载)基于TDOA声源定位算法仿真–MATLAB仿真

    (转载)基于TDOA声源定位算法仿真–MATLAB仿真 转载自:https://blog.xxcxw.cn/archives/28 声源定位算法是利用麦克风阵列进行声音定位,属于宽带信号,传统的MUS ...

  6. FPGA串口多字节发送、仿真

    序 本意是可以把一帧数据发送出去,外部只需要输入一个发送脉冲和一帧数据就可以了.在单字节发送的基础上进行设计,本来是想通过发送完成标志位进行下一个字节的数据装填和发送,可是实在太麻烦了,没有理好逻辑, ...

  7. 串口波特率等概念(转https://blog.csdn.net/dagefeijiqumeiguo/article/details/68921820)

    篇一 : 串口波特率等概念 1:比特率:9600bps 就是每秒中传输9600bit,也就是相当于每一秒中划分成了9600等份. 如此,那么每1bit的时间就是1/9600秒=104.16666666 ...

  8. 波特率自适应的RS-485中继器设计

    引言 RS-485收发器采用平衡发送和差分接收,因此具有抑制共模干扰的能力;加上接收器具有高灵敏度,能检测低达200 mV的电压,故传输信号能在千米以外得到恢复.使用RS-485总线,一对双绞线就能实 ...

  9. C6000 DSP技术深度探索-图像处理算法仿真到硬件实现踩过的那些坑

    C6000 DSP技术深度探索-图像处理算法仿真到硬件实现踩过的那些坑 写在前面 图像处理算法-仿真篇 DSP硬件移植篇-挖坑篇 DSP硬件移植篇-坑的种类 写在前面 时间如白马过隙,今天登录CSDN ...

  10. 基于Matlab的图像去噪算法仿真实现

    在信息化的社会里,图像在信息传播中所起的作用越来越大.所以,消除在图像采集和传输过程中而产生的噪声,保证图像受污染度最小,成了数字图像处理领域里的重要部分. 本文主要研究分析邻域平均法.中值滤波法.维 ...

最新文章

  1. 2022图机器学习必读的11大研究趋势和方向: 微分方程/子图表示/图谱理论/非对称/动态性/鲁棒性/通用性/强化学习/图量子等...
  2. springboot+mongodb
  3. mysql privileges_[转]mysql privileges
  4. 清除float的方法
  5. 运维组如何管理服务器资源,运维服务管理体系方案全套.doc
  6. java实体类中有枚举类型_当实体类中entity/DTO/VO等类中,有枚举值,应该怎么输出?...
  7. java——ArrayList中contains()方法中的疑问
  8. 互联网晚报 | 1月21日 星期五 | 中兴手机官宣吴京为新代言人;58同城旗下“赶集网”更名“赶集直招”;罗永浩年后回归科技界...
  9. android人脸抠图,人脸框抠图如何实现
  10. 最好的PHP入门教程推荐:100篇PHP教程精华推荐
  11. 基于SSM实现的儿童疫苗信息管理系统设计与实现毕业设计源码311930
  12. 三甲川荧光染料Cy3DIGE NHS ester,Cy3DIGE琥珀酰亚胺活化酯,Cyanine3DIGE 活化酯,Ex:555nmEm:569nm
  13. 两位顶级社会工程学大师:凯文-米特尼克和 弗兰克-阿巴内尔
  14. linux 查看java版本
  15. 希尔贝壳参展世界人工智能大会 | WAIC 2021
  16. 常见的浏览器指纹包含哪些
  17. 【SE】Week2 : 个人博客作业
  18. PTA 7-33 有理数加法(详解)
  19. 说Python已经饱和的人,你一定不懂这个技能
  20. addEventListener 事件监听

热门文章

  1. 如何制作伪原创视频?呆头鹅批量视频剪辑软件一键处理10万个视频
  2. 【安全资讯】熊猫烧香之后15年,网络变安全了吗?
  3. 斐讯K2P路由器设置AP模式(大部分路由器通用
  4. Java IO和NIO的区别
  5. 自动化测试工程师简历模板
  6. C++开发斗地主(QT)第五篇之牌型权重
  7. QT 弹出pdf 或者网页【软件 help/about按钮】
  8. 斐讯k1刷入Breed以及openwrt的教程
  9. seaweedfs-client适配高版本的seaweedfs服务
  10. 随机森林分类+随机森林回归+实例:用随机森林回归填补缺失值+机器学习调参思想+实例:随机森林在乳腺癌数据上的调参