FPGA PL端UART串口通讯之二

之前写过一篇FPGA串口通信的Verilog逻辑代码https://blog.csdn.net/weixin_40624529/article/details/113149362。在ZCU102上测试的时候没有发现误码,但是在正点原子的ZYNQ7020开发板上测试有较高的误码率,现在对以前的那段代码进行一些改进,改进后的代码测试误码率小于十万分之一(实际上测试了五十多万字节都没有发现误码)。原来的接收代码采样时间间隔是通过时钟频率/波特率来计算的,比如50_000_000/115200=434,也就是每
摘要由CSDN通过智能技术生成

之前写过一篇FPGA串口通信的Verilog逻辑代码https://blog.csdn.net/weixin_40624529/article/details/113149362。在ZCU102上测试的时候没有发现误码,但是在正点原子的ZYNQ7020开发板上测试有较高的误码率,现在对以前的那段代码进行一些改进,改进后的代码测试误码率小于十万分之一(实际上测试了五十多万字节都没有发现误码)。

原来的接收代码采样时间间隔是通过时钟频率/波特率来计算的,比如50_000_000/115200=434,也就是每隔434个时钟周期就进行一次采样,这个采样的时钟不受接收端起始信号到达的时间影响。

但是在实际中,发现,PC传过来的一个位持续时间为432个时钟周期,每一个位会累积两个时钟周期的误差,到数据位的最后几位的时候,接收引脚上的电平本来该持续到计算的采样点,结果有可能在采样前几个时钟周期内结束,到下一个电平状态,由此产生误码。比如,在第t个时钟周期内收到起始位,每个位持续时间位432个时钟周期,那么字节的最高位距离起始位的周期数为:432*(1+7)=3456,也就是说,第七位最高位的维持时间应该在(t+3457——t+3888)之间;不巧的是,在(t+430)时刻,不受控制的分频时钟才采集起始位,采集间隔434个时钟周期,那么最高位的采集时间为:(t+430)+434*1+434*7=t+3092,很明显已经超过了最高位最大维持时间,由此采集到错误信号。

针对这个现象,可以在电平维持时间的中间采样,比如,计算的采样周期为434,在第217个时钟周期就开始采样,尽管此时的电平依然维持432个时钟周期,但是217<432,可以在电平维持时间内采集到状态;此外,检测到了起始位,才开始计时(数),保证采样的时间点始终位于电平持续的中心时间点附件。比如:在第t个时钟周期内收到起始位,每个位持续时间位432个时钟周期,那么字节的最高位的实际维持时间(t+3457——t+3888),而最高位的采样时间:t+434+434*7+434/2=t+3689,保证了采样时刻依然位于最高位维持时间内。这样的好处就是,尽管PC机传过来的电平维持时间不是严格的434个时钟周期,但是也不会差太多,在中间采样可以保证采样的准确性。

错误的原因已经分析完毕,来看改进后的代码:


module uart_rx(
    input               sys_clk,
    input               sys_rst_n,
    input               uart_rx,
    output              rx_end,
  
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值