
本文概述
UART是FPGA工程师最常被要求手写的接口之一,也是面试高频题。面试官想听的不是“调用现成IP”,而是你懂不懂UART的异步协议(起始位、停止位、无时钟线)、波特率分频怎么算、接收端在什么时机采样最稳、发送和接收状态机怎么设计。本文从“UART是异步串口,靠波特率对齐”讲起,讲波特率时钟分频计算、接收端中间采样(波特率时钟16倍过采样或中点采样)、收发状态机(IDLE→起始位→数据位→停止位)、奇偶校验和常见坑(采样时机、FIFO、时钟精度),强调分频系数和采样点按系统时钟与波特率现算,不套固定值。
核心要点
UART异步协议:一帧=起始位(0)+数据位(5~8)+可选校验+停止位(1/1.5/2),无时钟线
波特率分频:分频系数=系统时钟/波特率,按实际时钟算(如100MHz/115200≈868)
发送:状态机按位移位输出,起始位拉低、数据位LSB先发、停止位拉高
接收:检测下降沿确认起始位,在数据位中点采样最稳(抗毛刺),可16倍过采样
接收采样:起点+半个位宽采样第一位,之后每个位宽采样一次,注意时钟精度和累计误差
常见坑:采样时机偏(边沿采样不稳)、波特率误差、丢位、FIFO缓冲
面试官考察点
考察点拆解
面试官问FPGA实现UART,重点考察:第一,你懂不懂UART异步协议(起始位/停止位、无时钟);第二,你会不会算波特率分频;第三,你懂不懂接收为什么在数据位中点采样;第四,你会不会写收发状态机,知道常见坑。
追问方向:波特率分频怎么算、为什么中点采样、起始位怎么检测、状态机几个状态、怎么验证。
回答思路
答题主线
建议按“协议 → 波特率 → 发送 → 接收采样 → 状态机与验证”来答,先讲协议再讲实现。
先讲协议:帧结构、异步含义。
讲波特率:分频计算。
讲发送:移位输出。
讲接收:起始位检测+中点采样。
讲状态机与验证:状态划分、仿真实测。
参考回答
我先讲UART协议,再讲FPGA实现。
第一,协议。UART是异步串行通信,一帧由:起始位(拉低一个位宽)、数据位(LSB先发,5~8位)、可选奇偶校验位、停止位(拉高1/1.5/2个位宽)组成。没有时钟线,收发双方靠约定好的波特率对齐,所以波特率精度和采样时机很关键。
第二,波特率分频。发送/接收需要一个波特率时钟:分频系数 = 系统时钟频率 / 波特率。比如系统100MHz、波特率115200,分频系数约868。注意:如果还要过采样(如16倍),则分频系数 = 系统时钟/(波特率×16)。分频可能不整除,会有误差,要评估误差是否在可接受范围(通常要求波特率误差在1%~2%以内,按协议和对方容忍度)。
第三,发送实现。发送状态机:IDLE(线保持高)→ 检测到发送请求 → 拉低起始位一个位宽 → 逐位移出数据位(LSB first)→ 可加校验位 → 拉高停止位 → 回到IDLE。本质是按位定时的移位输出。
第四,接收实现。接收的关键是采样时机:
起始位检测:RX线从高变低(下降沿),再确认在采样点仍是低(防毛刺误判),进入接收;
中点采样:在每位数据的中间采样最稳,避免边沿抖动和信号建立区。实现上从起始位下降沿起,延迟半个位宽采起始位中点确认,之后每过一个位宽采一个数据位;
过采样:更稳的做法是16倍过采样,用多数判决抗毛刺,适合噪声环境。
第五,状态机与验证。接收状态机:IDLE → 确认起始位 → 采样数据位(计数8位)→ 校验(可选)→ 检查停止位 → 输出数据。验证:仿真(激励带起始位停止位的帧,检查接收数据)和实测(FPGA连PC串口/另一块板回环测试)。注意加FIFO缓冲,避免接收未及时取走丢数据。

扫码关注





























