摘要 接口设计是FPGA开发中可靠性要求最高的环节。本文以UART和SPI两个典型接口为例,从协议层、电气层到FPGA实现层逐层拆解,给出完整的可综合Verilog代码、仿真验证方法和工程避坑指南。内容覆盖时钟域处理、边沿检测、状态机设计、仿真Testbench编写等关键技能,帮助读者建立从协议理解到硬件落地的完整知识链路。
应用场景 FPGA接口设计广泛存在于以下场景:
- 工业控制:与MCU、传感器通过UART/SPI/I2C通信。
- 数据采集:ADC/DAC的SPI配置与数据回读。
- 通信系统:与PHY芯片的GMII/RGMII接口对接。
- 板级互联:FPGA之间或与CPU之间的高速串行通信。 本文选取UART(异步串行)与SPI(同步串行)作为案例,覆盖了同步与异步两类典型接口设计范式。
核心原理
- 异步传输,无需时钟线,双方约定波特率(如115200bps)。
- 帧格式:1起始位(低电平)+ 8数据位(LSB first)+ 1停止位(高电平)。
- 接收端需在数据位中点采样,以规避信号边沿抖动。
- 同步传输,需SCLK、MOSI、MISO、CS四根线。
- 四种模式(CPOL/CPHA组合),本设计采用Mode 0(CPOL=0,CPHA=0):空闲时SCLK为低,数据在上升沿采样。
- 全双工通信,主从机同时收发。
- 跨时钟域处理: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,


