一、UART简介
UART 通常是指通用异步串行收发传输器( Universal Asynchronous Receiver/Transmitter)。UART 是一种通用的数据通信总线,也是串行总线接口的总称。我们通常所说的 UART 只有两根信号线,一根是发送数据端口线(TX),一根是接收数据端口线(RX)。
发送数据:发送设备将数据转换成串行数据来传输(并转串)。
接收数据:接收设备将接收到的串行数据转换成并行数据(串转并)。
1)协议层:通信协议(包括数据格式,传输速率等);
2)物理层:接口类型,电平标准等。
二、UART原理
2.1协议层
2.1.1 数据格式
一帧数据由4 部分组成,
• 起始位(1bit)
• 数据位(6\7\8 bit)
• 奇偶校验位(1bit)
• 停止位(1bit\1.5bit\2bit)
数据帧格式:
空闲位:
UART协议规定,当总线处于空闲状态时信号线的状态为‘1’即高电平,表示当前线路上没有数据传输。
起始位:
每开始一次通信时发送方先发出一个逻辑”0”的信号(低电平),表示传输字符的开始。因为总线空闲时为高电平所以开始一次通信时先发送一个明显区别于空闲状态的信号即低电平。
数据位:
起始位之后就是我们所要传输的数据,数据位可以是5、6、7、8,9位等,构成一个字符(一般都是8位)。如ASCII码(7位),扩展BCD码(8位)。先发送最低位,最后发送最高位,使用低电平表示‘0’高电平表示‘1’完成数据位的传输。
奇偶校验位:
数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。 校验位其实是调整个数,以下是奇偶校验两种方式:
- 奇校验(odd parity):如果数据位中“1”的数目是偶数,则校验位为“1”,如果“1”的数目是奇数,校验位为“0”。
- 偶校验(even parity):如果数据为中“1”的数目是偶数,则校验位为“0”,如果为奇数,校验位为“1”。
在代码设计中我们采用一位异或,将每两位相邻数据位异或后得到一位数据,再根据设置的奇校验偶校验来判断校验位的值。
停止位:
它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。
2.1.2 传输速度
波特率:单位时间内传输的码元数量(码元:携带数据的信息单元)
2.1.2.1 什么是波特率
波特率等于每秒钟传输的数据位数,假如我们的全局时钟频率为100MHz,波特率设置为9600,那么意味着每秒该UART传输协议可以传输9600bits的数据,换句话说传输1比特需时间约为:10^9(ns)/9600=104166(ns)。
2.1.2.2 如何换算波特率
如上,时钟频率假如为100MHz,这意味着我们的时钟周期为10ns,因此10416个时钟周期我们就可以传输1bit数据,换言之我们需要一个大小为10416的分频电路来对100MHz时钟进行处理,因此在设计UART的过程中,我们需要使用分频电路依据波特率处理全局时钟,依据分频后的时钟节奏来发送数据和接收数据。
2.2 物理层
接口类型、电平标准
串口电平标准:
TTL电平的串口(3.3v)
RS232电平的串口(+3~+15v为低电平,-5~-15v为高电平)
串口按电气标准分包括:
• RS-232-C:TXD/RXD/GND、15 m/9600bps (全双工)
• RS-422:TX+/TX-/RX+/RX-/GND (全双工,差分信号)
• RS485:A/B/G 、1200 米/9600bps (半双工,差模信号)
三、工程实践
3.1系统框图
3.2时序图
3.2.1 发送时序
3.2.2 接收时序
3.3 代码设计
3.3.1 UART_RX
module uart_rx #(
parameter CLK_FREQ = 50_000_000,
BPS = 115200 ,
CHECK = "NONE" //"Odd"为奇数校验,"Even"为偶数