【黑金云课堂】FPGA技术教程FPGA基础:FIFO与Uart通信

FIFO 知识总结

一、FIFO 基础概念

定义:FIFO(First In First Out)是一种先进先出的数据缓冲结构,先写入的数据先被读出。

1. 核心特性

  • 读写顺序一致
  • 支持同时读写
  • 提供空(empty)和满(full)状态指示

2. 与 RAM/ 寄存器的区别

FIFO 自动管理指针,无需地址控制,适合顺序访问和速率匹配。

3. 核心价值

  • 跨时钟域(CDC):消除亚稳态风险
  • 数据缓冲:解耦生产与消费
  • 速率匹配:协调不同数据速率模块

4. 类型

  • 同步 FIFO:读写同钟,设计简单,用于同频域缓冲
  • 异步 FIFO:读写独立时钟,用于跨时钟域传输(重点)

二、FIFO 结构原理

  • 存储单元:通常由 RAM 或 BRAM 实现,配合读写指针进行顺序访问。
  • 写操作
    • 写使能(wr_en)+ 时钟上升沿触发
    • 写前需检查 full 信号,避免溢出
    • 写指针自动递增(环形地址)
  • 读操作
    • 读使能(rd_en)+ 时钟上升沿
    • 读前需检查 empty 信号,避免读空
    • Standard 模式下,读使能后数据延迟一拍出现

三、异步 FIFO 核心技术(重点★)

  • 必要性:解决跨时钟域的亚稳态问题,避免数据采样错误。
  • Gray 码(格雷码)
    • 相邻数值仅变化 1 bit,适合跨时钟域传输
    • 即使发生亚稳态,也仅导致单 bit 错误
  • 同步器
    • 双触发器(2FF)同步器,降低亚稳态传播概率
    • 写指针(gray 码)同步到读时钟域,用于判断空
    • 读指针(gray 码)同步到写时钟域,用于判断满

(同步器结构图)

四、Vivado FIFO IP 使用

  • 推荐方式:工程中 99% 使用 FIFO Generator IP,成熟可靠。
  • 支持类型:同步 FIFO、异步 FIFO、AXI 接口 FIFO
  • 关键参数
    • 数据宽度(1~4096 bit
    • FIFO 深度(16~4M words
    • 实现方式:BRAM、分布式 RAM、移位寄存器
  • 重要信号
    • 写端口:wr_clk, wr_en, din, full, almost_full
    • 读端口:rd_clk, rd_en, dout, empty, almost_empty
  • 工程要点
    • almost_full 做写流控,almost_empty 做读准备
    • 避免数据丢失

五、工程实战要点

  • 典型应用
    • ADC 数据缓存(跨时钟域)
    • 视频流行 / 帧缓冲
    • DMA 数据通道(以太网、PCIe、USB)
  • 设计注意事项
    • 明确时钟域,跨域必用异步 FIFO
    • 深度计算公式:Depth = Burst × (1 - rd_rate/wr_rate),并留余量
    • 延迟控制:异步 FIFO 有 2~3 拍同步延迟,实时系统可选 FWFT 模式
  • 常见问题排查
    • 数据丢失 → 忽略 full 或深度不足
    • 读写不同步 → Gray 码或同步器问题
    • full / empty 误用 → full 用于写,empty 用于读

六、核心总结

  1. FIFO 本质 = RAM + 指针
  2. 异步 FIFO 核心 = Gray 码 + 同步器
  3. FIFO 主要用于:速率匹配、数据缓冲、跨时钟域传输
  4. 掌握 FIFO 是数字系统设计的基础,工程中优先使用 IP 核,关注控制信号(full / empty / almost)的正确使用。

UART 通信原理

一、UART 通信原理

1.1 UART 简介

UART 全称通用异步收发器(Universal Asynchronous Receiver Transmitter),是一种串行、异步、全双工的通信协议,是 FPGA 数字系统设计中最基础、最常用的底层串口通信方式。

核心特点

  • 异步通信,无需时钟线同步,收发双方通过约定的波特率实现同步
  • 极简硬件,仅需 TX(发送)、RX(接收)两根信号线加 GND 即可完成通信
  • 开发门槛低,易于实现
  • 常作为系统调试工具,用于打印运行状态与日志

典型应用场景

  • 实现 FPGA 与 PC、单片机等异构芯片的数据互联
  • 系统调试阶段打印运行日志、状态信息
  • 通过串口完成 Boot 加载,下载 FPGA 程序
  • 连接 GPS、温湿度计等支持串口协议的外设

1.2 UART 通信基础

  • 通信结构:包含发送端(将并行数据转换为串行数据流)、接收端(将串行数据还原为并行数据)、波特率发生器(产生同步时钟),可选 FIFO 缓存用于缓冲数据防止溢出。
  • 硬件连接 :采用交叉互联方式,设备 A 的 TX 连接设备 B 的 RX,反之亦然;必须共地,保证双方参考电平一致。FPGA 开发板通常通过 USB 转串口模块与 PC 通信。
  • 通信方式:支持单工(单向传输)、半双工(双向分时传输)。UART 标准模式为全双工,数据可同时双向独立传输,通信效率最高。

1.3 UART 数据帧格式

  • 数据帧组成 :1 位起始位(低电平,标志数据帧开始)、7-8 位数据位(承载有效信息)、0 或 1 位校验位(用于简单错误检测)、1/1.5/2 位停止位(高电平,标志帧结束)。常用配置为 8N1(8 数据位、无校验、1 停止位)。
  • 波特率 :指每秒传输的码元符号个数。UART 中每个码元对应 1 比特,故波特率近似等于比特率,代表传输速率。常见标准有 9600115200 等。FPGA 中通过对系统时钟分频实现,例如 200MHz 系统时钟实现 115200 波特率,分频系数约为 1736

1.4 UART 发送原理

  • 发送流程 :空闲状态下 TX 线保持高电平。发送时先拉低 TX 线一个波特率周期作为起始位,随后依次发送低位优先的 8 位数据位,最后拉高 TX 线作为停止位,完成一帧传输。
  • 状态机设计 :通过有限状态机(FSM)实现发送逻辑,包含空闲(等待发送请求)、起始位、数据发送、停止位四个核心状态,保证流程清晰可控。
  • 串并转换 :通过移位寄存器实现。将输入的并行数据加载到寄存器中,在波特率时钟驱动下逐位移出,从 TX 引脚串行输出,完成并行到串行的转换。

1.5 UART 接收原理

  • 接收流程 :持续监测 RX 线,检测到高到低的跳变判定为起始位;随后在每个数据位的中间位置采样,逐位接收并拼接为并行数据;最后校验停止位,确认数据帧的完整性。
  • 状态机设计:包含空闲(等待起始位)、起始位等待、数据接收、停止位、数据输出五个状态,完成接收流程的控制。
  • 过采样技术 :采用 16 倍波特率的高频时钟对 RX 信号进行采样,在每个比特周期的中间位置完成最终采样,避开信号跳变的不稳定区,有效抗干扰,容忍一定的波特率误差,大幅降低误码率。

二、工程搭建与仿真调试

2.1 工程搭建

  • 开发环境 :使用 Xilinx Vivado 作为 FPGA 集成开发环境,仿真工具采用官方自带的 Vivado Simulator(XSIM)。
  • 硬件平台 :基于 AX7102 开发板,核心为 Xilinx Artix-7 系列 XC7A100T FPGA,板载 USB 转 UART 和 RS232 UART 两种串口接口。
  • 目录结构 :采用模块化规范目录,rtl/ 目录存放 Verilog 源码,sim/ 目录存放 Testbench 仿真文件,ip/ 目录存放 IP 核,同时包含引脚约束文件。

2.2 模块逻辑设计

  • 发送模块(uart_tx :输入包含系统时钟、复位、8 位待发送并行数据、发送使能;输出包含串行 TX 信号、发送忙状态指示。核心逻辑为波特率计数器控制发送频率、位计数器记录发送进度、状态机控制流程,通过移位寄存器实现数据逐位串行输出。
  • 接收模块(uart_rx :输入包含系统时钟、复位、串行 RX 信号;输出包含 8 位并行接收数据、接收完成指示。核心逻辑为检测起始位下降沿,通过 16 倍过采样在比特中间位置采样,利用移位寄存器将串行数据拼接为并行字节,同时处理波特率误差、停止位校验、噪声过滤等异常情况。

2.3 顶层设计与约束

  • 顶层模块:作为系统枢纽,实例化发送、接收、波特率发生器子模块,完成各模块的信号互联,整合为完整的 UART 系统。
  • 时钟与复位 :推荐使用 PLL IP 核产生低抖动的系统时钟,采用同步复位逻辑,避免亚稳态问题。

2.4 仿真验证

  • Testbench 搭建:编写 Testbench 代码模拟外部运行环境,产生稳定的时钟、复位信号,向被测模块提供输入激励,验证设计的功能是否符合预期。
  • 收发仿真 :发送仿真中,模拟发送使能与并行数据,验证 TX 输出的帧结构、波特率是否符合协议规范;接收仿真中,模拟串行输入信号,验证模块能否正确恢复并行数据,以及接收完成信号的时序是否正确。
  • 波形分析:通过仿真波形检查状态机的状态跳转、计数器的工作情况,分析内部信号,定位深层逻辑问题,确认数据收发的正确性。

2.5 上板调试

  • 程序下载 :连接开发板与 PC,安装 USB 转串口驱动,在设备管理器中确认 COM 口;完成代码综合、布局布线后生成比特流文件,通过 JTAG 调试器将程序下载到 FPGA 中运行。
  • 回环测试 :通过软件回环(将接收数据直接转发给发送模块)或硬件回环(短接 TXRX 引脚),验证 PC 发送的数据能否被原样回显,以此确认 UART 功能是否正常。

2.6 常见问题排查

  • 串口乱码:原因是波特率不匹配或时钟误差导致波特率偏差。解决方法为检查两端波特率配置,确保 FPGA 使用准确的时钟源。
  • 无法接收数据 :原因是 TXRX 引脚接反、双方未共地导致参考电平不一致。解决方法为检查硬件连线,确保 GND 可靠连接。
  • 数据丢失:原因是数据接收过快导致 FIFO 溢出、主程序处理不及时未及时读取缓存。解决方法为增加 FIFO 深度,优化数据处理逻辑。
  • 仿真正常但上板失败:原因是引脚约束错误、IO 电平标准不匹配。解决方法为检查约束文件,确认 IO 电压配置正确。

💡 完整视频讲解可前往 ALINX 视频号进行直播回看

更多细节欢迎关注我们黑金云课堂全年免费直播课

黑金云课堂五月直播日历 我们将在每周二、三、四,同步推进 Verilog开发、Vitis开发、Linux开发三大系列,带你从零开始,稳扎稳打掌握 FPGA 开发全流程!

系列 内容定位
Verilog开发 硬件描述语言基础、逻辑设计、仿真调试
Vitis开发 Zynq软硬件协同、外设驱动、网络协议栈
Linux开发 嵌入式Linux系统移植、驱动编写、应用开发
相关推荐
zlinear数据采集卡1 小时前
定时器电路深度解析:从经典555到STM32定时器,从ZLinear采集卡的工程化设计实战
stm32·单片机·嵌入式硬件·fpga开发·自动化
逻辑诗篇2 小时前
FT-M6678+JFM7VX690T互联调试
fpga开发
szxinmai主板定制专家2 小时前
基于 ARM+FPGA精密多轴实时运动控制卡设计方案,适用于半导体设备等高精度领域(一)
arm开发·人工智能·嵌入式硬件·fpga开发·架构·语音识别
2301_809049425 小时前
blog_vitis_platform_system_application
fpga开发
zlinear数据采集卡7 小时前
单点接地设计电路深度解析:从理论原理到ZLinear采集卡的低噪声实战
c语言·单片机·嵌入式硬件·fpga开发
湉湉家的小虎子7 小时前
【科普贴】浅谈UFS接口——偏硬件解析
驱动开发·嵌入式硬件·fpga开发·硬件工程
2301_809049429 小时前
phase3_note_vivado_2020_ip_packager_revision
linux·fpga开发
GateWorld9 小时前
LCD显示技术完全指南:原理·制造·驱动·FPGA实现之点屏二
fpga开发·lcd显示·fpga点亮屏幕·minilvds
汽车仪器仪表相关领域1 天前
南华 NHA-604/605 汽车排放气体测试仪:国六b全适配高精度便携检测设备
大数据·人工智能·功能测试·深度学习·安全·fpga开发·压力测试