AISC/FPGA设计中 硬件UART波特率误差计算

背景

  本篇文章不涉及任何Verilog代码,仅仅只是对UART通信过程中产生的误差进行分析
  最近在写UART的Verilog的时候,因为没涉及同步通信和兼容各种其他协议所以很快就写完了。但是在做验证的时候遇到疑惑了,记录一些碰到的疑惑与大家分享。

误差来源

此处以9600bps举例
  例如,发送端和接收端都预期设定9600bps运行,但是两端实际已9800bps运行(时钟误差等原因造成),这样发送端和接收端依旧可以正常通信且不会造成误差。
中间采样
中间采样
  首先如果接收端以9600运行,但发送端以9800运行,这样势必会造成原来在数据中间的采样点逐渐偏移到数据转换节点。如图
采样逐渐偏移采样逐渐偏移

  其次,在量化时钟数据周期的时候势必也会造成误差,例如时钟为25M,9600bps,技数周期为2,604.166666666667,量化成整数就为2604了,此处我们来计算一下误差((25M/2604)-9600)/9600*10 = 0.064%。故经过量化传输之后每个字节误差为0.064%
  综上,UART传输误差来源有两处:

  • 确定波特率之后,确定计数周期时bps_clock=clock/bps,此时bps带有小数点,在量化的时候去除小数点就会跟笔者在误差来源分析的一样有误差。
  • 发射端和接收端波特率不一致,这样每bit的采样并不是采样在最中间点上,误差从起始位累计到结束位

计算最大误差允许值-简洁版

  首先我们假设可以容忍停止位采样误差,传输位为8位,不带奇偶校验位,且容忍余量为10%,只计算传输bit的误差,即在最后一位停止位处刚好采到90%。
  Tx设备的位周期定义如下:
T t x = 1 b a u d r a t e Ttx=\frac{1}{baudrate} Ttx=baudrate1
我们这里使用E来表示接收波特率和发送波特率的百分比差值,那么公式如下;
T r x = T t x + T t x E 100 Trx=Ttx+Ttx\frac{E}{100} Trx=Ttx+Ttx100E
Δ T r x = T t x E 100 \Delta Trx=Ttx\frac{E}{100} ΔTrx=Ttx100E
  对于初始分析,我们假设起始位采样到了50%处简化计算流程,因此对于一个8位的数据接口,采样时间为最后一个数据位8ΔTrx关闭RX
因此,我们在足够准确的情况下得出计算公式:
8 Δ T r x < 0.4 T t x 8\Delta Trx<0.4Ttx 8ΔTrx<0.4Ttx
E < 5 E<5 E<5
因此,基于这种简化分析,只要发送端和接收端之间的波特率误差小于5%,8位数据位的UART通信是可靠的

计算最大误差允许值-完整版

  相信看到这,读者已经笔者的分析比较感兴趣了。
接下来分析中包含的变量有:

  • 起始位采样误差
  • 可变数量的数据位
  • 对于停止位进行采样的可变余量
  • 帧误差容限

  现在我们的停止位采样余量是一个变量,我们将使用M(在简洁版中我们取10%代替的)。
8 Δ T r x < ( ( 1 − M ) − 0.5 ) T t x 8\Delta Trx<((1-M)-0.5)Ttx 8ΔTrx<((1M)0.5)Ttx
8 Δ T r x < ( 0.5 − M ) T t x 8\Delta Trx<(0.5-M)Ttx 8ΔTrx<(0.5M)Ttx
我们在前面的8位数据位到这里成了变量,现在数据位的数量(用N表示)是一个变量,我们还包括奇偶校验位§和停止位(S)的变量。此处如果有奇偶校验则P=1否则P=0;同理,如果要保持停止位正确采样则S=1,否则就为0。

  • N:数据位的数量
  • P:奇偶校验位
  • S:停止位

( N + P + S ) Δ T r x < ( 0.5 − M ) T t x (N+P+S)\Delta Trx<(0.5-M)Ttx (N+P+S)ΔTrx<(0.5M)Ttx
此处还忽略的起始采样的实际误差:DsbTrx
D s b T r x + ( N + P + S ) Δ T r x < ( 0.5 − M ) T t x DsbTrx+(N+P+S)\Delta Trx<(0.5-M)Ttx DsbTrx+(N+P+S)ΔTrx<(0.5M)Ttx
将上述的 T r x = T t x + T t x E 100 Trx=Ttx+Ttx\frac{E}{100} Trx=Ttx+Ttx100E
Δ T r x = T t x E 100 \Delta Trx=Ttx\frac{E}{100} ΔTrx=Ttx100E带入到最后的式子中即可得到
D s b ( ( 1 + E 100 ) T r x ) + ( N + P + S ) ( E 100 ) T r x < ( 0.5 − M ) T t x Dsb((1+\frac{E}{100})Trx)+(N+P+S)(\frac{E}{100})Trx<(0.5-M)Ttx Dsb((1+100E)Trx)+(N+P+S)(100E)Trx<(0.5M)Ttx
综合此不等式,读者只需将进行传输的数据位,停止位,奇偶校验位和余量数值,初始采样误差代入式子中即可算出整体误差。

解决办法

笔者查询了不少文章,真对上面误差的解决办法有两种

  1. 自适应波特率检测,采样连续两个Byte的起始位,根据起始位计算发送端的波特率,然后校准自身波特率进行改变
  2. 接收端停止位采样只采一半,留下半位为余量作校准
  • 10
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值