FPGA怎么实现UART收发接口?波特率与采样怎么做?FPGA面试从状态机讲到串口协议

浏览量:184
时间: 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


声明:本网站所收集的部分公开资料来源于互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。仅供学习交流使用,不构成商业目的。版权归原作者所有,如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时删除。侵权投诉
相关推荐HOT
嵌入式Linux根文件系统与Flash分区怎么设计?UBIFS、JFFS2与MTD怎么理解?嵌入式Linux面试

嵌入式Linux中高级技术基础题本文概述Flash上的文件系统选择决定数据的可靠性和寿命,是嵌入式Linux系统设计的关键,也是面试的进阶题。面试官想听的不是“... 详情>>

2026-09-09 13:32:01
STM32 UART串口怎么配置?波特率怎么算、printf怎么重定向?嵌入式面试

一句话答案STM32 UART 配置三步:开时钟→配 GPIO 复用(TX/RX)→设波特率/数据位/停止位/校验;printf 重定向重写 fputc() 到... 详情>>

2026-09-16 10:04:04
面试后怎么复盘与跟进?技术面试复盘与offer准备怎么做?电子工程师求职面试策略

其他类面试基础求职策略题本文概述面试复盘是把每次面试变成成长机会的关键动作,也是求职策略类面试的常考题。面试官想听的不是“面完就等结果”,而是你懂不懂复盘的价值... 详情>>

2026-09-09 13:32:42
Linux内核模块编译加载失败怎么排查?

📂 分类:嵌入式Linux📊 经验级别:中级⭐ 难度:★★★☆☆📝 题型:调试排查题本文概述Linux内核模块编译和加载失败的排查要分阶段进行:编译阶段主... 详情>>

2026-08-11 11:24:16
电子工程师怎么谈薪资?面试谈薪技巧与薪资谈判实用指南

其他类面试基础难度面试技巧谈薪技巧薪资谈判本文概述薪资谈判是电子工程师求职中的关键环节。谈薪前要先做行情调研,了解同行业同岗位的薪资范围。谈判中永远不要先报具体... 详情>>

2026-08-26 17:30:13
开班信息