1.UART协议
uart(universal asynchronous reciver and transmitter)
通用异步收发器,是一种通用串行数据总线,用于异步通信,将数据的二进制位一位一位的进行传输。
该总线双向通信,可以实现全双工传输(rxd txd可同时工作)和接受。
基础的数字通信概念
同步通信和异步通信
- 发送方和接收方按照同一个时钟节拍工作就叫同步;发送方和接收方按照自己的节拍工作就叫异步;
- 同步通信中,通信双方按照统一节拍工作,所以配合很好;一般需要发送方给接收方发送信息同时发送时钟信号,接收方根据发送方给它的时钟信号来安排自己的节奏。同步通信用在通信双方信息交换频率固定,或者经常通信时。
- 异步通信又叫异步通知。在双方通信的频率不固定时(有时3ms收发一次,有时3天才收发一次)不适合使用同步通信,而适合异步通信。异步通信时接收方不必一直在意发送方,发送方需要发送信息时会首先给接收方一个信息开始的起始信号,接收方接收到起始信号后就认为后面紧跟着的就是有效信息,才会开始注意接收信息,直到收到发送方发过来的结束标志
电平信号和差分信号
- 电平信号和差分信号是用来描述通信线路传输方式的,即如何在通信线路上表达1和0。
- 电平信号的传输线中有一个参考电平线(一般是GND),然后信号线上的信号值是由信号线电平和参考电平线的电压差决定。
- 差分信号的传输线中没有参考电平,所有都是信号线,1和0的表达依靠信号线之间的电压差。
- 电平信号的2根通信线之间的电平差异容易受到干扰,传输容易失败;差分信号不容易受到干扰因此传输质量比较稳定,现代通信一般都使用差分信号。
并行接口和串行接口
- 串行、并行主要是考虑通信线的根数,就是发送方和接收方同时可以传递的信息量的多少;
- 譬如在电平信号下,1根参考电平线+1根信号线可以传递1位二进制;如果我们有3根线(2根信号线+1根参考线)就可以同时发送2位二进制;如果想同时发送8位二进制就需要9根线。
在差分信号下,2根线(彼此差分)可以同时发送1位二进制;如果需要同时发送8位二进制,需要16根线。 - 似乎并行接口比串行接口要快(串行接口一次只能发送1位二进制,而并行接口一次可以发送多位二进制)要更优秀;但是实际上串行接口才是王道,用的比较广。因为更省信号线,而且对传输线的要求更低、成本更低;而且串行时可以通过提高通信速度来提高总体通信性能,不一定非得要并行。经过这么多年发展,最终胜出的是:异步、串行、差分,譬如USB和网络通信。
- 串口通信时因为是异步通信,所以通信双方必须事先约定好通信参数,这些通信参数包括:波特率、数据位、奇偶校验位、停止位(串口通信中起始位定义是唯一的,所以一般不用选择)
波特率
(1)波特率(bandrate),指的是串口通信的速率,也就是串口通信时每秒钟可以传输多少个二进制位。
- 譬如每秒种可以传输9600个二进制位(传输一个二进制位需要的时间是1/9600秒,也就是104us),波特率就是9600。
(2)串口通信的波特率不能随意设定,而应该在一些值中去选择。
- 一般最常见的波特率是9600或者115200(低端单片机如51常用9600,高端单片机和嵌入式SoC一般用115200)。
- 为什么波特率不可以随便指定?第一,通信双方必须事先设定相同的波特率这样才能成功通信,如果发送方和接收方按照不同的波特率通信则根本收不到,因此波特率最好是大家熟知的而不是随意指定的。第二,常用的波特率经过长久发展,就形成了共识,大家常用就是9600或者115200。
UART通信协议
通信协议即数据传输的格式
(1)起始位:先发出一个逻辑”0”的信号,表示传输字符的开始。
需要起始位的原因是,UART没有控制线,数据的传输只有一根线,如果想要让接收方知道什么时候开始接收数据,则需要在发送数据前,先发一位低电平信号作为数据发送的起始标志,接收方在空闲时,当检测到有一个低电平,则开始逐位接收数据。
(2)数据位:紧接着起始位之后。数据位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。
(3)奇偶校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。
(4)停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。
(5)空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。
(6)波特率:数据传输的速率。有以下几个档位:300、600、1200、2400、4800、9600、19200、38400、43000、56000、57600、115200。在数据传输和接收双方,需要预先统一波特率,以便正确的传输数据。
UART 收发逻辑
- UART的发送逻辑负责驱动发送端口。当发送端口对应的移位寄存器中被载入数据后,发送逻辑首先拉低发送端口电平,表示起始位开始。经过一个周期后,发送逻辑将数据从移位寄存器中依次取出,并在发送端口以高低电平的形式表现出来。该逻辑还可以根据配置添加不同类型的奇偶校验位以及停止位
- UART 的接收逻辑往往工作在比波特率高的时钟频率下,一般使用 8 倍频采样或者 16倍频采样。在每个时钟的上升沿,接收逻辑都会去检测接收端口的电平信息,如果发现接收端口被输入了低电平且持续时间超过了半个波特率信号周期,则认为检测到了起始位信号,并开始接收数据,否则认为起始位无效。当后续数据接收完后,接收逻辑应该将此次接收的一帧数据放到对应的接收FIFO中,并产生一定的信号告知系统已获得有效数据。
2.AMBA-APB 协议
APB主要用在低速且低功率的外围,可针对外围设备做功率消耗及复杂接口的最佳化。APB在AHB和低带宽的外围设备之间提供了通信的桥梁,所以APB是AHB的二级拓展总线。
- 它的架构不像AHB总线是多主设备的架构,主要应用在低带宽的外设上,如UART、I2C。
- APB总线的唯一主设备是APB桥(与AXI或APB相连),因此不需要仲裁一些request/grant信号。
- APB的协议十分简单,甚至不是流水的操作,固定两个时钟周期完成一次读或写的操作,支持最大32-bit的数据位宽。
- 其特性包括:两个时钟周期传输,无需等待周期和回应信号,控制逻辑简单,只有四个控制信号。由于APB的两个通道没有自己的握手信号,因此两个通道不会同时使用,即不支持读写并行操作
APB Slave(UART…):左侧的输入信号是来自bridge的,输出只有一个,那就是读出来的数据送给AHB
APB信号
APB传输时序
apb通过实现状态机来实现
对每一笔数据的传送,均需花2个周期的时间
一是SETUP cycle,另一个是ENABLE cycle
APB读写
Write/read transfer with no wait states
- PENABLE表示传输的ENABLE阶段的开始
- PREADY表示slave可以在PCLK的下一个上升沿完成传输
Write/read transfer with wait states
Write
Read
- 当ENABLE阶段开始时,如果PENABLE拉高时,PREADY为低,那么传输会一直等待,直到PREADY拉高为止
- 当PENABLE拉低时,PREADY可以取任何值。
- 当PREADY保持低位时,其他信号应保持不变
- 建议地址和写信号在传输后不要立即改变,而是保持稳定,直到另一个访问发生。这样可以降低功耗
3.APB-UART DUT 设计
APB-UART模块可以实现串行数据和并行数据的转换,发送和接收逻辑分别用FIFO来存储数据,CPU可以通过APB总线访问该模块,进而间接的实现对UART串行数据的访问。
UART执行的动作为:
• 接收receive:对从外围设备接收到的数据进行串行到并行转换。
在进行数据接收操作时,串行数据通过接收端口后会进入到接收逻辑模块,该模块对数据进行格式检测后,会将其中的起始位、校验位以及停止位移除,并把剩下的数据暂时存储在Receive FIFO中,等待CPU访问。
• 发送transmit:对传输到外围设备的数据进行并行到串行转换。
在进行数据发送操作时,需要发送的数据通过 APB 总线被写入到APB-UART模块后,会暂时存储在发送 FIFO(TFIFO)中。发送逻辑模块会在特定的时刻从 Transmit FIFO 中取走数据,并添加上起始位、奇偶校验位以及停止位,形成一个完整的数据帧。最后发送逻辑会将该数据帧放入到发送端口一侧的移位寄存器中,按照特定的波特率将数据串行移位,实现数据发送的功能。当没有数据发送时,发送端口保持为高电平。
UART接口信号
1.面向APB总线接口信号
2.面向外围设备接口信号
UART模块设计
1.波特率配置Baud Rate Generator Module
- UART包括红外数据关联(IrDA)串行红外(SIR)协议编码器/解码器(ENDEC)。
- 包括一个可编程波特率发生器,从UART内部参考时钟输入UARTCLK生成一个通用的发送和接收内部时钟。
- 波特率生成器包含自由运行计数器,用于生成内部x16时钟、Baud16和IrLPBaud16信号。
Baud16为UART发送和接收控制提供定时信息。Baud16是一个脉冲流,宽度为一个UARTCLK时钟周期,频率为波特率的16倍。
IrLPBaud16提供定时信息,以在低功率模式下生成IrDA编码传输比特流的脉冲宽度。
- 由于外部环境存在各种干扰,传输信号很容易产生毛刺,所以该 Uart_Monitor 还需要在 16 倍频采样下,对最开始接收到的 8个电平进行检测。如果这 8 个电平是连续的低电平,就认为采集到了起始位,否则就认为是噪声干扰,需要重新进行采样
- UART 的物理接口可以是 RS-232、RS-485 和 IrDA 红外线等,它们的主要区别在于其各自的电平范围不相同
- 这个模块用于为 UART 的收/发器提供时钟,这个时钟为 UART 的波特率的 16 倍频,即如果波特率要求为 9600bps 时,该模块输出的时钟为 9600Hz×16=153600Hz。输出时钟需要可配置
2.接收器UART receiver Module
- 接收器时刻监视 UART 总线的 RXD 线的电平,当检测到起始位,接收器启动接收状态机,根据寄存器(UCSRB、UCSRC)的设定,解析RXD 线的电平,当完成一个字节接收,输出接收到的数据和线状态。
接收器的设计主要是围绕“有限状态机”而进行。
3.发射器UART Transmitter Module
- 发送器是监视 EBI 总线,当检测需要发送一个字节时,发送器启动发送状态机,同样时,发送器会根据寄存器(UCSRB、UCSRC)的设定,逐位往 UART 总线的 TXD 线发送数据。当发送完成一个字节,发送器输出发送状态。
和接收器相似地,发送器的设计也是围绕“有限状态机”而进行
RTL代码结构详解
-
apb_uart_top
-
apb_slave
-
apb_uart
(1)Configuration Registers
(2)tick_generator
input 波特率 产生 output 发送数据和接收数据的时钟
由apb_uart的寄存器进行配置(Configuration Registers)
input
output
(3)uart_transmitter
发送数据到外围设备,进行并行到串行转换。
添加上起始位、奇偶校验位以及停止位,形成一个完整的数据帧
从帧长度计算出校验位
帧长度分为5/6/7/8位
校验方式分为奇校验偶校验(4)uart_rx_BB文章来源:https://www.toymoban.com/news/detail-643481.html
从外设接收数据,从串行转回并行,将起始位、校验位、停止位移除
波特率计数文章来源地址https://www.toymoban.com/news/detail-643481.html
-
到了这里,关于APB-UART-1的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!