
本文概述
用FPGA实现SPI接口是面试常考的实战题,面试官想听的不是“调现成的IP”,而是你懂不懂SPI协议的四种模式(CPOL/CPHA)、怎么用状态机产生时序、时钟分频与相位对齐、以及读写数据时的字节/位级操作和跨时钟域处理。本文从“SPI是四线主从同步协议”讲起,讲CPOL/CPHA四种模式的时序含义、状态机设计(IDLE→发送→接收→完成)、数据移位与MOSI/MISO时序产生、以及如何配置与验证,强调SPI的时钟频率和时序由从机规格决定,不套固定值。
核心要点
SPI是四线同步主从协议:SCK、MOSI、MISO、CS,一个主机多个片选
四种模式由CPOL(时钟极性)和CPHA(相位)组合,决定数据在哪个边沿采样,必须匹配从机
FPGA实现核心:状态机产生SCK并控制MOSI输出、MISO采样、CS拉低时序
数据收发:移位寄存器按位发送/接收,注意MSB/LSB顺序与从机要求一致
SCK频率由主时钟分频产生,受从机最高时钟限制,要按从机规格算
验证:用仿真看时序是否匹配模式,实测定点回读数据确认正确
面试官考察点
考察点拆解
面试官问FPGA实现SPI,重点考察:第一,你懂不懂SPI协议的四种模式(CPOL/CPHA),能不能说清数据在哪个边沿采样;第二,你会不会用状态机设计时序产生逻辑;第三,你懂不懂数据移位收发和字节/位级操作;第四,你会不会验证——仿真看时序、实测定点回读。
追问方向:CPOL/CPHA怎么理解、状态机怎么设计、SCK频率怎么定、怎么保证时序、怎么验证。
回答思路
答题主线
建议按“SPI协议 → 模式匹配 → 状态机设计 → 数据收发 → 验证”来答,体现你能从协议到实现闭环。
先讲SPI协议:四线同步主从,片选、时钟、数据。
讲模式:CPOL/CPHA四种模式,数据采样边沿。
讲状态机:IDLE→发送/接收→完成,SCK产生。
讲数据:移位收发、位序。
讲验证:仿真时序、定点回读。
参考回答
我先讲SPI协议,再讲FPGA怎么实现。
第一,SPI协议。SPI是同步串行主从协议,四根线:
SCK:主机产生的时钟;
MOSI:主机输出、从机输入;
MISO:从机输出、主机输入;
CS:片选,低有效,选中从机。
一个主机可以接多个从机,通过多个CS选择。SPI是全双工:每个时钟同时发一位收一位。
第二,四种模式。模式由CPOL(时钟极性)和CPHA(相位)决定:
CPOL:空闲时SCK是高电平还是低电平;
CPHA:数据在SCK的第一个边沿还是第二个边沿采样。
组合成Mode 0/1/2/3。FPGA实现前必须先确认从机的模式(看从机datasheet),模式不匹配数据必然出错。比如Mode 0(CPOL=0、CPHA=0)是最常见的:空闲低、上升沿采样。
第三,状态机设计。核心是一个状态机控制一次传输:
IDLE:空闲,SCK保持空闲电平,CS为高;
起始:拉低CS,开始传输;
移位发送/接收:按SCK节拍逐位发送MOSI、采样MISO,移位寄存器按位操作;
完成:拉高CS,置完成标志,把接收到的字节交给上层。
SCK由主时钟分频产生,分频比按目标SCK频率算,受从机最高SCK频率限制。
第四,数据收发。发送用移位寄存器:每个SCK节拍把要发的位放到MOSI、同时把MISO采到的位移入接收寄存器。注意MSB先行还是LSB先行要和从机一致。
第五,验证。先在仿真里看SCK、MOSI、MISO、CS的时序是否符合选定的模式和数据要求;再在实际FPGA上回读从机寄存器,确认读写数据正确。验证是必须的闭环。

扫码关注





























