FPGA零基础学习:UART协议驱动设计

本文介绍了UART通信协议的原理,包括起始位、数据位、校验位和停止位。讲解了UART的全双工、半双工和单工通信模式,并探讨了UART的电平标准。此外,文章详细阐述了UART发送器和接收器的设计,以及如何在FPGA中实现UART通信的架构和控制逻辑。通过实例展示了UART的RTL仿真和下板验证过程。
摘要由CSDN通过智能技术生成

通用异步收发传输器(Universal Asynchronous Receiver / Transmitter),通常称作UART,是一种异步收发传输器。它将要传输的资料在串行通信与并行通信之间加以转换。作为把并行输入信号转成串行输出信号的芯片,UART通常被集成于其他通讯接口的连接上。

UART是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用于主机与辅助设备通信,如汽车音响与外接AP之间的通信,与PC机通信包括与监控调试器和其它器件。

并行通信与串行通信

两个芯片或者设备之间传递信息称为通信。对于信息来说可能会有很多位,例如:传输ASCII码(8bit)。在设计时,我们可以采取在两个通信设备之间设计8根数据线,将8bit数据同时发送过去,对方同时接收8位数据。这种同时发送多位数据的传输方式,称为并行通信。

由于某些原因,设备A和设备B之间不能设计多根数据线,只能设计一根数据线。如果此时还是需要传输ASCII码,那么应该怎么办呢?

设备A可以将ASCII码的8位,按照一定的顺序一位一位的发送到数据线上。设备B按照设备A发送的顺序进行一位一位的接收,然后拼接为一个8位。这种通信方式成为串行通信。

将8位或者多位数据拆分为一位一位的发送出去的过程称为并转串。将一位一位接收的数据合并为8位或者多位数据的过程称为串转并。

对于串行通信设备来说,发送方都是在执行并转串,接收方都是在执行串转并。

UART设备为串行通信设备。

全双工通信、半双工通信和单工通信

全双工通信是指在同一时刻信息可以进行双向传输。例如:打电话,说的同时也能听。

半双工通信是指在同一时刻信息只能单向传输,双方都可以进行发送和接收,但是不能够同时发送和接收。例如:对讲机通信。

单工通信是指在通信过程中,只能够设备A发送,设备B接收。例如:听收音机。

SANXIN – B01的开发板上的UART接口设备可以做到半双工通信。

UART的通信电平标准

两个设备之间能够互相通信的基础条件为电平标准相同。UART的接口标准有很多,有RS232、RS485等等。

台式PC上一般会有一个DB9,接口标准为RS232。

此接口在各个工业板上也有很多。随着技术的发展,PC上的DB9的接口逐渐被淘汰,换成了USB接口。

我们的开发板上选择使用USB接口,方便大家学习,便于和PC进行通信。

FPGA芯片是无法(较为复杂)发出对应的电平标准,如:RS485、RS232、USB接口电平等。在大多数板卡设计时,都会在FPGA外围添加电平转换器,将FPGA的电平标准转换为通信的电平标准。

我们的开发板上采用USB <->UART(LVCOMS/LVTTL)的电平转换芯片CP2102。所以开发板上的供电端口不仅仅可以供电,还可以进行通信。

 

对于开发者来说,不用考虑线路的电平标准,只需要考虑如何发送和接收逻辑即可。

UART通信协议

双方进行通信时,并不是每时每刻都在进行通信,大多数的通信都是突发性的。此时发送设备需要在发送有效之前需要提前通知接收设备应该要进行接收信息。有的人就会有疑问,发送方有信息就发送,没有信息就停止;接收设备检测有信息发送过来就接收,没有信息就不接收;这样的话不就可以了吗?为什么需要提前通知有信息过来?

双方既然能够进行通信,中间势必建立了通信线路。发送方有信息时,发送信息;没有信息就停止发送。对于发送方来说,没有任何问题。接收方的难度就比较大,在通信线路中,发送方不发送信息时,接收方也会在线路上接收到信息,由于接收方也不知道是不是发送方发送的信息,此时就会造成接收方无法判断是信息还是噪声。

为了解决上述的问题,我们规定了通信协议。

在UART通信协议中,我们规定:

  1. 在不通信时,发送高电平。
  2. 发送信息时,应该首先发送起始位(1bit、低电平)。可以理解为告诉接收方,应该接收信息了。
  3. 发送数据位,由于是串行通信,规定从低位开始发,最后到高位(协议规定信息位可以为4、5、6、7、8)。
  4. 校验位(1bit)。可以采用奇校验、偶校验、直接发1、直接发0、不发等5种情况。
  5. 停止位(1bit、1.5bit、2bit。高电平)。
  6. 空闲位(1bit,高电平)

1bit的时间宽度为多少呢?

在UART协议中,一般常用的波特率(BAUD)为300、600、1200、2400、4800、9600、19200、38400、43000、56000、57600、115200。1秒钟除以波特率就是1bit的时间宽度。

校验位有什么作用?如何进行校验?

在发送信息时,由于要经过很长的线路,中间极有可能受到干扰,导致某些信息位发生反转,最终导致通信失败。校验位的作用为当接收到数据后,进行检验,如果检验不通过,视为接收数据有误,直接丢弃即可。

在校验时,可以选择奇校验和偶校验。奇校验是要求发送的数据位和校验位中1的个数为奇数个;偶校验是要求发送的数据位和校验位中1的个数为偶数个。

发送器设计原理

发送器中加入缓冲器。即上游模块把想要发送的数据写入到发送器中的FIFO里,发送器的控制逻辑检测到FIFO中有数据时,就读出来进行发送。因为发送器发送的速率比较慢,加入FIFO后,上游模块不用等待上一个数据发送完成就可以直接写入后续的数据。

根据提前约定好的波特率和校验方式,发送器的控制逻辑读出FIFO的数据后,按照UART的协议向外发送即可。

接收器设计原理

接收器中加入缓冲器。即接收器的控制逻辑接收到信息后,发送到缓冲器中。由于有缓冲器的存在,主控制器可以不必时时刻刻检查接收状态,只需要一定的时间检测缓冲器中是否有数据即可。

在接收时,起始位的低电平持续时间要超过半个周期才可以认为是开始,避免线路上干扰,引起错误接收。

在接收数据位、校验位、停止位时,采用倍频(16倍频)采样,使用中间的6、7、8、9、10这五次采样值作为采样依据,当五次全部为同一个电平时,即认为本位为此电平值;当四次相同,一次不同时,即认为本位与四次相同的电平值相同;当出现其他情况时,认为线路干扰太大,不做任何接收。

接收完成后,进行帧检测和校验,满足设计要求时,将其中的数据写入到FIFO中。

架构设计和信号说明

 

此模块命名为uart_drive,共有四个模块构成。

tx_fifo模块:发送缓冲区256深度、宽度为8,该缓冲区设计一个高电平有效的复位。负责将上游想要发送的数据缓存起来。

tx_ctrl模块:发送逻辑控制部分。负责将tx_fifo中的数据按照UART的协议规定发送出去。

rx_ctrl模块:接收逻辑控制部分。负责将外部数据线上的数据按照UART协议规定解析出来,存储到tx_fifo中。

rx_fifo模块:接收缓冲区256深度、宽度为8,该缓冲区设计一个高电平有效的复位。负责将接收

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值