微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 关于一些UART代码与异步信号同步化的疑问?

关于一些UART代码与异步信号同步化的疑问?

时间:10-02 整理:3721RD 点击:
在网上下载了几个UART的接收程序,发现里面都做如下处理:
(1)用波特率时钟clk_baud对输入串行数据打若干拍。
(2)然后在clk_baud的控制下,做下降沿检测,然后将串行信号移位到8位的寄存器中。
      我的疑问是,UART进来的只有数据信号,没有同步时钟,应该相对于FPGA来说属于异步信号,
而且这些异步信号宽度应该都只是clk_baud的宽度,但是因为不同源,所以打拍只能防止亚稳态,
并不能保证进来的数据将会一直正确。数据的采集迟早会出现滑码、错误等情况才对。感觉只有一个
用clk_baud*16倍的时钟的程序才靠谱。
      但是看这些代码流传这么广,不敢确定都是错的,所以问一下大家怎么看。

UART是按照字节发的,每个字节都有开始和结束标志,你可以看下具体的协议,按照baud也没有太大的问题,因为不存在积累的问题,最长的话,也就11个baud就清除了,所以不存在滑码的问题,多谢!

我个人感觉重点在于确定起始位,用16倍波特率比较靠谱吧!中间点采集数据,共8个数据,每个数据偏差一个时钟也还行

首先uart通信是要保证tx rx是相同的波特率
首发的时钟频率偏差不会很大
而且uart rx在接收的时候是要过采样的,一般过采样4 8 16 都有,每个bit采样n次取中间那一次作为实际采样的值,一般两边波特率对的上的话基本没问题



   的确如你所说,至少要用4X以上时钟,在计数中间点采数更加可靠。


(1)我用“N倍的波特率时钟N*clk_baud”进行处理的话,可以通过在每一帧的最后一个BIT通过计数器的控制消除偏差的影响。
(2)但是如果程序里面只有“波特率时钟clk_baud”的话,确实不知道怎么在每一帧都消除偏差的影响。望不吝赐教。

3楼正解,当然要求低点8倍波特率采样也差不多了

我自己也写过UART通信的程序,和小编有同样的疑问,采用16倍频的采样时钟,还是很稳定的

有开始和结束标志的。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top