作者:FPGA技术实战
引言:UART是一种通用串行数据总线,用于异步通信。该总线双向通信,可实现全双工传输和接收。UART通常用来实现与PC之间数据通信,命令和控制信息的传输等。本文我们介绍UART通信协议、传输时序及如何利用HDL编程实现FPGA与PC通信。
1.异步串行通信的理解
通信协议:指双方实体完成通信或服务所必须遵循的规则和约定。交流什么、怎样交流及何时交流,都必须遵循某种互相都能接受的规则。这个规则就是通信协议。
异步通信:它是对于同步通信来说的,异步通信在发送字符时,所发送的字符之间的时隙可以是任意的,当然,接收端必须时刻做好接收的准备(如果接收端主机的电源都没有加上,那么发送端发送字符就没有意义,因为接收端根本无法接收)。发送端可以在任意时刻开始发送字符,因此必须在每一个字符的开始和结束的地方加上标志,即加上开始位和停止位,以便使接收端能够正确地将每一个字符接收下来。
UART使用的是异步串行通信机制,其数据传输协议格式如下图所示。
空闲位:处于逻辑“1”状态,表示当前线路上没有数据信息传输。
UART数据传输协议格式,通常需要在收发设备提前定义好,如传输数据的位数、是否需要校验位、停止位。另外还一个重要的参数就是数据传输的波特率。
图2:常见标准波特率
UART数据传输的速度通常用波特率来衡量。在一次串口通信过程中,数据接收与发送双方没有共享时钟,因此,双方必须协商好数据传输波特率。根据双方协议好的传输速率,相邻bit的时间间隔就会固定下来,接收端即可对发送端的数据进行采样。
本文设定传输协议为:1位起始位+8位数据位+1位结束位,无奇偶校验位,传输波特率为9600bps。
(1)发送端按照预先设定好的传输协议及波特率,发送端依次发送:
其中,起始位为逻辑 0(低电平) ,结束位为逻辑 1(高电平) ,发送端在空闲状态为 1 。
(2)接收端:接收端通过检测电平“1”(空闲状态)到“0”(起始位)的跳变来确定一个数据包的开始。确定开始位接收完成之后,依次接收数据使用更高的采样时钟,完成数据采集。接收完数据位后,继续接收停止位。
硬件上采用USB转RS232芯片CP2104实现PC与FPGA之间通信。电路中设计了一片ESD静电防护芯片RCLAMP0522P,与转换芯片CP2104一起,可以防止静电浪涌烧毁FPGA芯片,起到隔离保护作用。
软件设计划分为接收模块uart_rx.v和uart_tx.v两个模块,顶层模块uart_driver.v互联两个模块,如下图所示。
UART数据传输主要包括两个部分:
波特率的产生设计; 数据传输设计,包括接收与发送。
数据发送模块:设置发送使能信号和待发送的数据。通过计数器,表示10 个数据发送的周期。这 10 个数据,依次为:1位起始位+8 位数据位 +1 位结束位,实现数据位的逐个发送。本设计中,采用PC机的串口调试助手,发送数据位至FPGA。FPGA 接收到数据位之后,立即回传至 PC 机。
编写testbench仿真文件,利用Vivado自带仿真器对软件代码进行功能仿真,仿真结果如下图所示。
图5:UART串行通信仿真
图中①处,仿真UART接收串口信号uart_rx_i输入数据8'b10101001,baud_bps在每个bit位宽中间时刻采样,bit_num计数接收到的数据bit个数,数据按照LSB端接收;
图中②处完成8bit数据位接收后,产生接收完毕信号uart_rx_done;
图中③处,将接收到的数据按照事先定义好的传输协议通过uart_tx_o发送。