135.FPGA 低速 + 高速接口实战,吃透时序、状态机与 IP 核配置
2026/9/14 20:46:09 网站建设 项目流程

摘要*
本文以FPGA接口设计为主线,选取最典型的UART串口与DDR3内存接口作为案例,从接口协议本质、时序约束、状态机设计到板级调试,完整呈现一个接口从零到可用的全过程。所有代码基于Xilinx Artix-7系列器件,使用Verilog HDL编写,已在XC7A35T开发板上验证通过。文章不堆砌概念,只讲可落地的工程方法。

应用场景
FPGA接口设计覆盖以下典型场景:

  1. 与MCU/传感器进行低速串行通信(UART/SPI/I2C)。
  2. 与DDR3/DDR4 SDRAM进行高速数据交换(图像缓存、数据采集)。
  3. 与PC通过PCIe/GbE进行高速数据传输。
    本文聚焦前两类,因为它们是FPGA开发中使用频率最高、且最容易出错的接口类型。UART用于验证基础时序设计能力,DDR3用于验证复杂协议与物理层约束能力。

核心原理
接口设计的本质是“时序对齐”问题。
对于UART,核心是波特率生成与采样点对齐。发送端按波特率逐bit移位输出,接收端需在bit中心采样以规避边沿抖动。工程实现上采用“16倍过采样”技术:以16倍波特率时钟计数,在bit中心(计数到8)时采样,可容忍±4个过采样周期的时钟偏差。
对于DDR3,核心是“源同步接口”与“训练序列”。DDR3数据线DQ在读写时均有DQS伴随,读数据时DQS由DDR3芯片输出,与DQ边沿对齐,FPGA需用IDELAY将DQS延迟90度以在DQ中心采样;写数据时FPGA输出DQ与DQS,要求DQS中心对齐DQ。此外,DDR3控制器需完成上电初始化、刷新、读写命令调度,这些均由状态机控制。

详细步骤
UART接口设计步骤

  1. 确定协议参数:波特率115200,8位数据,无校验,1停止位。
  2. 生成波特率时钟:系统时钟50MHz,分频系数 = 50_000_000 / (115200 * 16) = 27.13,取整数27,实际波特率误差约0.3%,可接受。
  3. 发送模块:状态机空闲→发送起始位0→发送8个数据位LSB first→发送停止位1。
  4. 接收模块:检测起始位下降沿→启动16倍过采样计数器→在每个bit中心采样→组装字节。
  5. 添加FIFO缓冲,隔离读写速率差异。

DDR3接口设计步骤

  1. 使用Xilinx MIG IP核生成DDR3控制器,配置为:时钟400MHz,数据位宽16,Bank为8,列地址10,行地址14。
  2. 编写用户接口逻辑:MIG的用户接口为简单的读写请求握手协议(app_rdy/app_wdf_rdy/app_en)。
  3. 设计读写测试状态机:上电后等待MIG初始化完成(init_calib_complete拉高),然后依次执行写地址0x0000→写64个数据→读地址0x0000→读64个数据→比较。
  4. 添加ILA(集成逻辑分析仪)核,抓取app_*信号与读写数据,验证时序。
  5. 时序约束:在XDC文件中约束DDR3物理层引脚、时钟周期、输入延迟,确保MIG的约束文件正确加载。

完整可运行代码

UART发送模块(uart_tx.v)

module uart_tx ( input clk, // 50MHz系统时钟 input rst_n

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询