SPI从设备(VHDL)

逻辑主页

代码下载

版本1.2: spi_slave.vhd (8.1 KB)
微调架构以提高与更多工具的综合兼容性

版本1.1: spi_slave_v1_1.vhd (8.0 KB)
新增异步低电平有效复位功能

版本1.0: spi_slave_v1_0.vhd (7.5 KB)
初始发布版本

特性

  • 用户可自定义SPI模式
  • 用户可自定义数据宽度
  • 状态寄存器包含发送就绪、接收就绪及接收溢出错误标志位
  • 状态寄存器标志位可通过SPI通信和/或独立引脚中断供主设备读取
  • 状态寄存器标志位可供用户逻辑使用

简介

本文详述了采用VHDL编写的、适用于CPLD和FPGA的SPI从机组件。该组件使用Quartus II 11.1版本进行设计。资源需求取决于具体实现方案(即数据宽度)。图1展示了SPI从机集成至系统的典型应用示例。

1. 应用示例

背景

SPI通信方案采用四线制全双工数据链路。主机通过拉低从机选择(SS)线来启动传输。由主机驱动的串行时钟(SCLK)线提供同步时钟源。主机通过主出从入(MOSI)线发送数据,通过主入从出(MISO)线接收数据。

主机可通过多种技术与多个从机通信。最常见配置中,每个从机有独立的SS线,但与其他从机共享SCLK、MISO和MOSI线。当从机的SS线未被拉低时,该从机会忽略共享线路。

SPI有四种工作模式,基于两个参数:时钟极性(CPOL)和时钟相位(CPHA)。主从设备必须使用相同模式才能清晰通信。若CPOL为0,则SCLK通常为低电平,首个时钟边沿为上升沿。若CPOL为1,则SCLK通常为高电平,首个时钟边沿为下降沿。CPHA定义数据对齐方式。若CPHA为0,则首个数据位在SS下降沿写入,在首个SCLK边沿读取。若CPHA为1,数据在首个SCLK边沿写入,在第二个SCLK边沿读取。图2的时序图展示了四种SPI模式。

2. SPI时序图

端口描述

表3描述了SPI从设备的端口。从设备的工作模式由GENERIC参数cpolcpha 定义 。发送与接收数据总线宽度由GENERIC参数d_width 声明。

3. 端口描述

功能描述

从设备组件的SPI模式由用户通过VHDL实体中的cpolcpha GENERIC参数设置。

该SPI从设备组件与SPI主设备之间的每次通信必须包含一个8位命令,后跟一个N位数据传输。数据传输的大小N由VHDL实体中的GENERIC d_width参数决定,并由用户设置。图3展示了cpol =0、cpha =0且d_width =8时的通信时序。

8 位命令

表1定义了主设备通过MOSI发送的8位命令。主设备必须首先发送命令的最高有效位(MSB)。

1. 8位命令格式

05_00

SPI从设备组件包含三个寄存器:接收寄存器、发送寄存器和状态寄存器。wr_addr 位标识MOSI线在数据传输期间写入哪个从机寄存器,rd_addr 位标识MISO线将哪个寄存器的数据传回主设备。表2显示了各寄存器的地址。

2. 寄存器地址表

06_00

接收寄存器

接收寄存器是用于缓存通过MOSI线从主设备接收数据的缓冲区。用户逻辑若要访问接收数据,必须在组件未执行事务时(即busy 输出为低电平时)触发rx_req 输入信号。从设备随后会在rx_data 端口输出接收寄存器的内容。

发送寄存器

发送寄存器是用于缓存从设备准备通过MISO线向主设备传输数据的缓冲区。用户逻辑通过在tx_load_data 端口提供数据,并在组件未执行事务时(即busy 输出为低电平时)触发tx_load_en 输入信号来填充该寄存器。

状态寄存器

SPI从设备可不使用状态寄存器运行。该寄存器向用户提供从设备组件的状态信息,但并非使用该组件的必要条件。

状态寄存器包含三个状态位。主设备可通过寻址该寄存器的事务来读取、设置或清除这些位。在读写状态寄存器的事务期间,发送的前三个数据位分别对应trdyrrdyroe 状态位。从设备组件会忽略事务期间发送或接收的其余数据位。用户逻辑可通过对应名称的端口访问这些状态位。用户逻辑还可通过在st_load_trdyst_load_rrdyst_load_roe 输入端口设置期望值,并在组件未执行事务时(即busy 输出为低电平时)触发st_load_en 输入信号来设置或清除这些状态位。

trdy

trdy (发送就绪) 位表示用户逻辑在上次SPI事务后已向发送寄存器写入新数据,主设备尚未读取当前数据。当主设备下次读取发送寄存器时,组件会清除trdy 位。

rrdy

rrdy (接收就绪)位表示主设备在用户逻辑上次读取接收寄存器后已写入新数据,用户逻辑尚未获取最新数据。当用户逻辑请求数据时,该组件会清除rrdy 位。

roe

roe (接收溢出错误)位表示主设备在用户逻辑读取数据前已覆盖了最后接收的数据。主设备可通过SPI事务写入状态寄存器来清除roe 位,或用户逻辑可通过上述st_load 输入写入状态寄存器来清除该位。

中断

trdyrrdyroe 端口 还提供了一种无需SPI事务即可通过SPI从设备状态变化中断SPI主设备或用户逻辑的方式。用户可将这些端口连接到SPI主设备、用户逻辑、两者或都不连接。

事务示例

图4展示了一个事务示例(在ModelSim Altera Starter Edition 10.0c中模拟)。从设备配置为以“00”模式运行。当从设备不忙时,用户逻辑在tx_load_data 总线上呈现数据“10101010”的同时触发tx_load_en 输入。trdy 信号立即变为高电平,表示有新数据待发送。随后主设备以命令“00000000”启动事务,指示从设备将后续MOSI数据加载到接收寄存器,并将发送寄存器的内容输出到MISO。当最后一位数据发送完毕,trdy 信号变为低电平,表示发送寄存器的当前值已发送给主设备。同样,当从设备将最后一位数据读入接收寄存器时,rrdy 信号置位表示已接收到新数据。用户逻辑随后触发rx_req 输入,从设备响应并在rx_data 总线上输出接收到的数据“10110001”。rrdy 输出随后取消置位,表示接收寄存器中的数据已被用户逻辑读取。

4. 示例事务

复位

SPI从设备组件的reset_n 输入端口必须保持逻辑高电平才能正常工作。该端口的低电平信号会异步复位组件。复位期间,miso 输出呈现高阻抗状态,且rx_data 输出端口被清除。发送寄存器、接收寄存器、发送就绪、接收就绪和接收溢出错误寄存器均被清除。

结论

该VHDL SPI从机提供用户可定义的模式和数据宽度。它包含发送就绪、接收就绪和接收溢出错误的状态信号。

相关主题

SPI主控制器(VHDL)

SPI三线制主控制器(VHDL)

SPI转I2C桥接器(VHDL) - 此设计利用本页描述的SPI从机实现SPI到I2C的桥接功能。