基于FPGA的UART异步串行通信接收模块设计与实现

欢迎关注微信公众号“FPGA科技室”,更多内容文章请关注
在这里插入图片描述
前文已经讲解了UART通信的发送模块设计与实现,本文来讲解UART通信的接收模块设计与实现。最后可以将接收和发送模块的代码在顶层模块中例化,实现最终的综合系统,实现UART双向通信。

下面来学习一下UART的数据接收的设计部分,设计中考虑到实际会使用中强电磁干扰会对数据传输信道产生一定的噪声干扰,数据会受到一定的影响,本文提出了一种改进型的串口接收模块的设计方式,之后会进行接收模块设计的功能仿真。


串口接收的原理


之前的文章中讲解了串口发送模块的设计和实现,其UART发送端发送的一个字节数据的时序如下图,
在这里插入图片描述
一帧数据占有10位(一个起始位,8位数据位,一个停止位)

上图的时序图可以看出,在系统时钟的上升沿,采集10位数据位的电平,但上图采样时刻和数据位变化时刻重合,会产生错误,一般情况下我们认为每一位数据的中间是电平稳定区域(满足建立和保持时间),因此这次设计采集中间时刻的电平来作为此数据位的电平。

如果考虑的更加全面,在实际工业应用中,系统所处环境会有电磁干扰,那么如果只采样一次数据位电平是不可靠的,所以这里提出改进型的防止出错的机制,单bit数据接收,使用多次采样求概率的方式进行电平状态的决定。
在这里插入图片描述
在上图中,将每一位数据平均的分为16段,对于Bit_x这一位数据,数据在刚刚发生变化的短暂时间内,数据会不稳定(深色部分),在这两个时间段来采样数据,可能会得到错误的结果,影响之后的设计结果,所以在设计中,这两部分采样时直接忽略,但在中间的时间段(浅色),数据本身较为稳定,可以直接采样(中间出错概率小),

对中间这段电平进行多次取样,求高低电平发生的概率,6次采样结果,出现一半以上的概率的电平就作为最终的电平采样结果,

若6次采样中,1和0电平均为出现3次,则此次数据不具有参考性,可直接忽略。


UART异步串行通信接收模块设计与实现


串口接收模块设计框图
在这里插入图片描述
在这里插入图片描述
RS232串行输入信号的同步设计

这里的串行数据的输入相对于系统时钟是一个异步信号,如果不对他进行同步处理,则会产生亚稳态,这里的处理就是打两拍,与系统时钟同步。
在这里插入图片描述
采样时钟生成模块的设计

串口接收模块主要构成其一就是波特率时钟生成模块,采用实际的采样频率是波特率的16倍,得到计数值和波特率的关系图。系统时钟周期为system_clk_period.
在这里插入图片描述
可见可以用case选择器来实现不同波特率与采样时钟分频计数值之间对应。
在这里插入图片描述
下面是采样时钟的生成,为波特率的16倍。
在这里插入图片描述
采样时钟计数器,计数器清零条件是bps_cnt == 8’d159,代表一个字节接收完成。
(bps_cnt == 8’d12 && (START_BIT > 2)实现起始位检测是否出错。
在这里插入图片描述

当数据线上出现下降沿时,先假设其为起始信号,然后对其进行中间段采样,若6次采样值累加结果大于2,则表示了6次采样有一半状态为高电平,则认为这次的下降沿为干扰信号,忽视。

采样数据接收模块设计

在前面的讲解中,处于中间段的采样时间段对应的bps_cnt值分别为6,7,8,9,10,11,推导得到,后一位数据的采样时间段的第一个bps_cnt值为前一位数据采样时间段的第一个bpd_cnt值+16. 所以起始位后的第一个数据位bit0采样时间段bps_cnt值分别为22,23,24,25,26,27,之后同理可推。
在这里插入图片描述

在这里插入图片描述
数据状态判断模块设计

对一位数据需进行6次采样,6次采样中出现次数多于3次的数据才能作为最终数据。

那么可以用接收到数据r_data_byte[n]结合数值比较器判断,举个例子,当r_data_byte分别为二进制的011/010/100/101,这几个数据十进制格式分别为3/2/4/5,可以发送大于等于4的为100/101,当最高位为1时,累加值就为大于等于4,说明数据真实值为1,反之,真实值为0.只要判断最高位。
在这里插入图片描述
仿真

进行功能仿真,tb文件中使用之前的发送数据模块输出来实现产生这次接收数据的输入,激励文件在上次基础上,修改端口信息,例化模块,将发送模块输出连接到接收模块的输入rs232_rx。
在这里插入图片描述
在这里插入图片描述
设置脚本,启动仿真。在这里插入图片描述


欢迎转发关注!


在这里插入图片描述

  • 3
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值