欢迎光临
我们一直在努力

115.FPGA 接口设计通关:亚稳态处理、中点采样、状态机规范写法

摘要 接口设计是FPGA开发中可靠性要求最高的环节。本文以UART和SPI两个典型接口为例,从协议层、电气层到FPGA实现层逐层拆解,给出完整的可综合Verilog代码、仿真验证方法和工程避坑指南。内容覆盖时钟域处理、边沿检测、状态机设计、仿真Testbench编写等关键技能,帮助读者建立从协议理解到硬件落地的完整知识链路。

应用场景 FPGA接口设计广泛存在于以下场景:

  • 工业控制:与MCU、传感器通过UART/SPI/I2C通信。
  • 数据采集:ADC/DAC的SPI配置与数据回读。
  • 通信系统:与PHY芯片的GMII/RGMII接口对接。
  • 板级互联:FPGA之间或与CPU之间的高速串行通信。 本文选取UART(异步串行)与SPI(同步串行)作为案例,覆盖了同步与异步两类典型接口设计范式。

核心原理

  • UART协议要点
    • 异步传输,无需时钟线,双方约定波特率(如115200bps)。
    • 帧格式:1起始位(低电平)+ 8数据位(LSB first)+ 1停止位(高电平)。
    • 接收端需在数据位中点采样,以规避信号边沿抖动。
  • SPI协议要点
    • 同步传输,需SCLK、MOSI、MISO、CS四根线。
    • 四种模式(CPOL/CPHA组合),本设计采用Mode 0(CPOL=0,CPHA=0):空闲时SCLK为低,数据在上升沿采样。
    • 全双工通信,主从机同时收发。
  • FPGA实现关键点
    • 跨时钟域处理:UART接收时钟与系统时钟不同源,需同步器消除亚稳态。
    • 边沿检测:对SCLK和CS信号打拍后提取上升沿/下降沿。
    • 状态机设计:明确IDLE、START、DATA、STOP各状态转换条件。

    详细步骤 步骤1:定义系统架构

    • 系统时钟50MHz,UART波特率115200,SPI时钟分频至1MHz。
    • 顶层模块包含UART接收、UART发送、SPI从机、FIFO缓冲(可选)四部分。 步骤2:编写UART接收模块
    • 使用计数器产生波特率时钟使能(BaudTick)。
    • 检测起始位下降沿,延迟半位后采样数据位中点。 步骤3:编写UART发送模块
    • 状态机控制发送帧,移位寄存器逐位输出。 步骤4:编写SPI从机模块
    • 对SCLK和CS打三拍,提取上升沿和下降沿。
    • 在上升沿采样MOSI,在下降沿更新MISO。 步骤5:编写顶层文件与约束文件
    • 分配引脚,设置IO电平标准(如LVCMOS33)。 步骤6:编写Testbench进行仿真验证
    • 模拟UART主机发送0x55,检查SPI输出;再模拟SPI主机回读数据。

    完整可运行代码(带注释) 以下代码基于Vivado 2020.2验证通过,器件为Xilinx Artix-7。

    // 模块1:UART接收器
    module uart_rx #(
    parameter CLK_FREQ = 50_000_000,

    赞(0)
    未经允许不得转载:171主机测评 » 115.FPGA 接口设计通关:亚稳态处理、中点采样、状态机规范写法
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址