凡亿教育-大康
凡事用心,一起进步
打开APP
公司名片
凡亿课堂 | 面试指南
当前位置: 首页 面试指南
FPGA怎么实现UART收发接口?波特率与采样怎么做?FPGA面试从状态机讲到串口协议
浏览量:287
2026-09-05 09:52:18
FPGA设计中级技术基础题

FPGA开发板连接示波器显示UART串口波形

本文概述

UART是FPGA工程师最常被要求手写的接口之一,也是面试高频题。面试官想听的不是“调用现成IP”,而是你懂不懂UART的异步协议(起始位、停止位、无时钟线)、波特率分频怎么算、接收端在什么时机采样最稳、发送和接收状态机怎么设计。本文从“UART是异步串口,靠波特率对齐”讲起,讲波特率时钟分频计算、接收端中间采样(波特率时钟16倍过采样或中点采样)、收发状态机(IDLE→起始位→数据位→停止位)、奇偶校验和常见坑(采样时机、FIFO、时钟精度),强调分频系数和采样点按系统时钟与波特率现算,不套固定值。

核心要点

  • UART异步协议:一帧=起始位(0)+数据位(5~8)+可选校验+停止位(1/1.5/2),无时钟线

  • 波特率分频:分频系数=系统时钟/波特率,按实际时钟算(如100MHz/115200≈868)

  • 发送:状态机按位移位输出,起始位拉低、数据位LSB先发、停止位拉高

  • 接收:检测下降沿确认起始位,在数据位中点采样最稳(抗毛刺),可16倍过采样

  • 接收采样:起点+半个位宽采样第一位,之后每个位宽采样一次,注意时钟精度和累计误差

  • 常见坑:采样时机偏(边沿采样不稳)、波特率误差、丢位、FIFO缓冲

用FPGA实现一个UART收发器,波特率怎么产生、数据怎么采样、状态机怎么设计?

面试官考察点

考察点拆解

面试官问FPGA实现UART,重点考察:第一,你懂不懂UART异步协议(起始位/停止位、无时钟);第二,你会不会算波特率分频;第三,你懂不懂接收为什么在数据位中点采样;第四,你会不会写收发状态机,知道常见坑。

追问方向:波特率分频怎么算、为什么中点采样、起始位怎么检测、状态机几个状态、怎么验证。

回答思路

答题主线

建议按“协议 → 波特率 → 发送 → 接收采样 → 状态机与验证”来答,先讲协议再讲实现。

  1. 先讲协议:帧结构、异步含义。

  2. 讲波特率:分频计算。

  3. 讲发送:移位输出。

  4. 讲接收:起始位检测+中点采样。

  5. 讲状态机与验证:状态划分、仿真实测。

参考回答

我先讲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缓冲,避免接收未及时取走丢数据。

面试官可能追问

追问 1:波特率分频误差多少能接受?
UART接收在数据位中点采样,累计误差在每一位累积,最差在最后一位(第8位)累计约±半个位宽才会误判。一般要求波特率误差控制在1%~2%以内(双方误差之和),具体按位数和采样裕量算。分频不整除时评估实际误差是否达标。
追问 2:为什么在数据位中点采样?
数据位在起始边沿和结束边沿附近信号可能还在建立/有抖动,中点最稳定。从起始位下降沿开始延迟半个位宽采第一位中点,之后每个位宽采一次,正好落在每位中点,抗毛刺和边沿抖动,降低误码。
追问 3:起始位怎么可靠检测?
检测RX下降沿后,在延迟半个位宽(即起始位中点)再确认RX仍是低电平,才确认是真正的起始位;如果中点变高则是毛刺,忽略。这种“下降沿+中点确认”能有效滤除窄毛刺误触发。
追问 4:发送和接收状态机各分几个状态?
发送:IDLE、发送起始位、发送数据位(按位计数)、(校验)、发送停止位,共4~5个状态;接收:IDLE、确认起始位、采样数据位、检查停止位、输出,共4~5个状态。每个状态对应一个位宽的定时(用波特率时钟计数)。
追问 5:怎么验证UART收发正确?
仿真:构造带起始位、数据、停止位的激励帧,检查接收状态机输出的数据和时序;发送仿真看波形是否符合帧格式。实测:FPGA连PC串口助手收发回环测试,或两片FPGA互连,用示波器看波形和误码。建议加CRC或回环计数验证无误码。

常见失分表达

✗ “UART有时钟线” — UART是异步协议没有时钟线,靠波特率对齐,这是基础。
✗ “采样点在边沿就行” — 边沿采样不稳,必须在数据位中点采样。
✗ “波特率随便分频,误差无所谓” — 分频误差累积会导致误码,必须按位宽和采样裕量评估。
✗ “不用FIFO,收一个读一个” — 接收不及时取走会丢数据,FIFO缓冲是工程必需。
✗ “仿真过就行,不用实测” — 时钟精度、信号质量只有实测能验证,要回环/串口实测。

准备动作

1
用Verilog手写一个UART发送器和接收器,仿真验证
2
计算一个具体时钟(如50MHz)下各常用波特率的分频系数和误差
3
在开发板上实现UART回环,用PC串口助手实测验证
4
研究过采样接收(16倍多数判决)的实现,理解抗毛刺原理

核心关键词

FPGAUART串口波特率状态机起始位停止位中点采样过采样Verilog


声明:本网站所收集的部分公开资料来源于互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。仅供学习交流使用,不构成商业目的。版权归原作者所有,如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时删除。 侵权投诉

相关文章

量产放行前同时发现两种缺陷:你如何判断哪个必须先阻断?

2026-10-27 17:08:57

比较器电路怎么设计?滞回比较器阈值怎么算?开环运放能当比较器吗?硬件面试

2026-09-23 16:22:23

电子工程师面试作品集怎么做?3—5个项目、证据链、保密和现场讲解方法

2026-10-15 21:17:44

开关电源DC-DC的PCB布局怎么设计?电源工程师面试从功率回路讲到热设计

2026-08-31 14:34:39

Boost升压电路怎么设计?电感电流连续CCM和断续DCM区别?电源面试

2026-09-22 09:01:43