概要

UART(Universal Asynchronous Receiver/Transmitter,通用异步收发传输器)是一种常用的串行通信协议,通过两根信号线(TX 发送、RX 接收)实现全双工通信,无需时钟线同步,广泛应用于嵌入式系统、传感器通信等场景。以下从核心原理、帧结构、关键模块设计和Verilog 实现展开详细说明。

一、UART 核心原理

UART 通信基于异步传输,发送端和接收端需预先约定相同的波特率(数据传输速率,如 9600bps、115200bps)和帧格式,通过起始位和停止位实现数据同步。
在这里插入图片描述

1. 波特率与时钟关系

波特率:每秒传输的比特数(bit/s),例如 9600bps 表示每秒传输 9600 位。
采样时钟:UART 内部通常使用16 倍波特率时钟(或更高倍数),用于精确检测起始位和采样数据位(如 9600bps 对应 16×9600=153600Hz 采样时钟)。
在这里插入图片描述
在这里插入图片描述

2. 帧结构(标准异步帧)

一个完整的 UART 帧包含以下字段(从左到右传输):

起始位:1 位低电平(逻辑 0),标志数据传输开始。
数据位:5~9 位(通常 8 位),传输实际数据(可带奇偶校验)。
奇偶校验位(可选):1 位,用于简单错误检测(奇校验 / 偶校验 / 无校验)。
停止位:1~2 位高电平(逻辑 1),标志数据传输结束。
在这里插入图片描述

例如,8 位数据 + 无校验 + 1 位停止位的帧结构为:1位起始位 + 8位数据 + 1位停止位 = 10位/帧。

二、UART 关键模块设计

UART 通常分为发送器(TX) 和接收器(RX) 两部分,核心模块包括波特率发生器、发送逻辑、接收逻辑和校验逻辑。

1. 波特率发生器

功能:生成16 倍波特率的采样时钟(用于接收端精准采样)和波特率时钟(用于发送端定时移位)。
实现方式:通过分频器对系统时钟分频,公式为:
分频系数 = 系统时钟频率 / (16 × 波特率)
例如,系统时钟 50MHz,波特率 9600bps:
分频系数 = 50,000,000 / (16 × 9600) ≈ 325.52 → 取326

2. 发送器(TX)设计

功能:将并行数据按帧格式转换为串行信号,依次发送起始位、数据位、校验位(可选)、停止位。
工作流程:

当检测到发送使能信号(tx_en)且发送缓冲区空闲时,启动发送。
先发送 1 位起始位(低电平)。
按低位在前(LSB) 顺序发送 8 位数据位。
若使能校验,发送 1 位奇偶校验位(奇校验:数据位中 1 的个数为奇数时校验位为 0,否则为 1;偶校验相反)。
发送 1 位停止位(高电平)。
发送完成后,输出发送完成标志(tx_done)。

3. 接收器(RX)设计

功能:将串行信号按帧格式转换为并行数据,通过采样时钟消除噪声干扰。
工作流程:

空闲时,RX 线为高电平(停止位状态)。
检测到 RX 线从高电平跳变为低电平时(可能是起始位),启动 16 倍波特率计数器。
当计数器计数到 8(中间位置)时,再次采样 RX 线,若仍为低电平,确认起始位有效。
之后每计数 16(1 个波特率周期),采样一次数据位(共 8 次),按低位在前拼接数据。
采样校验位(若有),进行奇偶校验。
采样停止位,若为高电平,确认帧有效,输出并行数据和接收完成标志(rx_done)。

三、Verilog 完整实现(带校验功能)

以下是支持 8 位数据、奇偶校验可选、1 位停止位的 UART 收发器实现,包含波特率发生器、发送器和接收器。
在这里插入图片描述

四、模块解析

1. 波特率发生器

通过对系统时钟分频,生成 16 倍波特率的baud_clk,用于接收端的精准采样(每 16 个baud_clk对应 1 位数据的传输时间)。
分频系数根据系统时钟和目标波特率计算,确保采样时钟稳定。

2. 发送器(TX)

状态机:包含TX_IDLE(空闲)、TX_START(起始位)、TX_DATA(数据位)、TX_PARITY(校验位)、TX_STOP(停止位)5 个状态,按顺序切换。
移位逻辑:并行数据tx_data加载到tx_shift_reg后,通过右移操作逐位发送(低位在前)。
校验位生成:根据PARITY_EN和PARITY_TYPE计算奇偶校验位,随数据发送。

3. 接收器(RX)

状态机:包含RX_IDLE(空闲)、RX_START(检测起始位)、RX_DATA(接收数据位)、RX_PARITY(校验位)、RX_STOP(停止位)5 个状态。
采样逻辑:利用 16 倍波特率时钟,在每个位的中间位置(第 8 个baud_clk)采样,提高抗噪声能力。
错误检测:若校验位不匹配或停止位为低电平,置位rx_err标志。

五、关键特性与参数配置

可配置参数:通过CLK_FREQ(系统时钟)、BAUD_RATE(波特率)、PARITY_EN(校验使能)、PARITY_TYPE(校验类型)适配不同场景。
全双工通信:发送和接收独立工作,可同时进行。
错误处理:支持校验位错误和停止位错误检测,提升通信可靠性。

六、测试与验证

可通过仿真验证 UART 功能,测试场景包括:

无校验模式下,发送端发送数据8’ha5,接收端应正确接收并输出rx_done=1。
使能偶校验,发送数据8’h33(二进制00110011,含 4 个 1,偶校验位为 0),接收端校验通过。
模拟噪声导致停止位为低电平,接收端应输出rx_err=1。

总结

UART 通过异步帧结构实现串行通信,核心是波特率同步和帧格式解析。本文设计的 UART 支持可配置波特率和校验方式,通过状态机和移位寄存器实现并串 / 串并转换,适合嵌入式系统中低成本、低速率的通信需求。实际应用中,可根据需要扩展功能(如硬件流控、多字节缓冲)。

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐