Zynq7000系列中的Quad-SPI(四线制串行外设接口)Flash控制器详细介绍

Quad SPI闪存控制器是位于PS内的输入/输出外围设备(IOP)的一部分。它允许处理器(如ARM Cortex-A系列或类似的处理器)以高速和低引脚数的方式与串行Flash存储器设备进行交互。Quad-SPI接口特别适用于需要高吞吐量(如存储密集型应用)但希望减少物理引脚数量的场合。

控制器以三种模式之一运行:I/O模式、线性寻址模式和传统SPI模式。在I/O模式下,软件与闪存设备协议密切交互。软件使用四个TXD寄存器将闪存命令和数据写入控制器。

软件读取包含从闪存设备接收到的数据的RXD寄存器。

线性寻址模式使用设备操作的子集来消除I/O模式读取闪存所需的软件开销。线性模式使用硬件向闪存发出命令,并控制从闪存总线到AXI接口的数据流。控制器响应AXI接口上的存储器请求,就像闪存是ROM存储器一样。在传统模式下,QSPI控制器充当普通SPI控制器。


控制器可以连接到一个或两个闪存设备。两个设备可以并联连接以获得8位性能,也可以堆叠4位排列以减少引脚数量。

Quad-SPI Flash控制器的特性主要包括以下几个方面:

接口与协议

  • AXI接口:提供32位AXI接口,用于线性寻址模式下的数据传输。这种接口使得CPU可以直接通过AXI总线访问Flash存储器,提高了数据传输效率。
  • APB接口:提供32位APB接口,用于I/O模式下的数据传输。在I/O模式下,软件需要详细了解Flash的协议,并通过APB接口发送命令和数据。
  • 可编程总线协议:支持Micron和Spansion等品牌的Flash存储器,允许用户根据具体的Flash设备配置总线协议。

性能与扩展性

  • Legacy SPI和可扩展性能:支持传统的SPI接口以及1x、2x、4x、8x等多种I/O宽度,以满足不同性能需求。
  • 灵活的I/O模式:包括单从器件4位I/O闪存接口模式、双从器件8位并行I/O闪存接口模式、双从器件4位堆叠I/O闪存接口模式以及单从器件传统SPI接口模式,提供了丰富的配置选项。

容量与密度

  • 设备寻址能力:每个设备支持16MB寻址(两个设备时可达32MB)。
  • 设备密度:在I/O和线性模式下,支持高达128Mb的设备密度。在I/O模式下,还支持密度大于128Mb的设备。

操作模式

  • I/O模式
    • 软件发出指令并管理Flash操作。
    • 提供中断功能用于FIFO控制。
    • 配备63字的接收FIFO(RxFIFO)和63字的发送FIFO(TxFIFO)。
  • 线性寻址模式
    • 控制器解释内存读写操作,无需软件干预。
    • AXI端口可缓冲多达四个读请求。
    • 支持AXI地址递增和回绕功能,方便进行连续的内存访问。

其他特性

  • eXecute-In-Place (XIP):在某些配置下,支持XIP功能,即应用程序可以直接在Flash闪存内运行,无需先复制到RAM中。
  • 可编程写保护区域:允许用户根据需要设置Flash中的写保护区域,以防止数据被意外修改。
  • ECC功能:部分控制器可能配备ECC(错误纠正码)功能,用于提高数据传输的可靠性。

系统观点

在系统视角中,Quad-SPI(四路SPI)闪存控制器是输入/输出处理器(IOP)的一部分,它通过主输入/输出(MIO)接口与外部SPI闪存存储器相连,如图12-1所示。这个控制器支持一个或两个存储器设备。

线性地址模式下的地址映射和设备匹配

当使用一个设备时,直接内存读取的地址映射从FC00_0000开始,最大可达FCFF_FFFF(即16MB)。

在双设备系统中,地址映射取决于内存设备和I/O配置。重要的是,Quad-SPI设备需要来自同一供应商,以确保它们具有相同的协议。

  • 8位并行I/O配置:要求设备具有相同的容量。地址映射从FC00_0000开始,一直到两个设备总容量的地址,最大可达FDFF_FFFF(即32MB)。

  • 4位堆叠I/O配置:设备可以有不同的容量,但必须具有相同的协议。如果使用两个不同大小的设备,AMD建议将128Mb的设备放在较低的地址。在这种模式下:

    • QSPI 0设备从FC00_0000开始,最大可达FCFF_FFFF(即16MB)。
    • QSPI 1设备从FD00_0000开始,最大可达FDFF_FFFF(即另一个16MB)。
    • 如果第一个设备小于16MB,则在两个设备之间将存在内存空间空洞。

这种地址映射机制允许系统灵活地配置和管理不同大小和类型的外部SPI闪存设备,以满足不同的存储需求。

方框图

Quad-SPI(四路SPI)闪存控制器的框图如图12-2所示。

在Quad-SPI(四路SPI)闪存控制器的操作中,存在以下限制和注意事项:

  • 单设备使用:当仅使用一个SPI闪存设备时,它必须连接到QSPI 0接口。
  • 双设备使用:如果系统中使用两个SPI闪存设备,则这两个设备必须是相同的(来自同一供应商且具有相同的协议序列)。这是为了确保它们能够正确地与Quad-SPI控制器通信。
  • MIO引脚冲突:Quad-SPI控制器的MIO(主输入/输出)引脚与静态存储器控制器(SMC)的NOR和NAND接口存在冲突。因此,当使用Quad-SPI接口时,无法同时使用NOR/SRAM和NAND接口。这是因为这些接口共享相同的物理引脚,且一次只能激活一个接口。

功能描述

Quad-SPI(四路SPI)闪存控制器可以在I/O模式或线性寻址模式下工作。这两种模式提供了不同的数据访问方式,以满足不同的应用需求。

在读取操作中,控制器在I/O模式和线性寻址模式下都支持单、双和四路读取模式。这些模式允许以不同的数据宽度从SPI闪存中读取数据,从而提高了数据传输的效率。

在写入操作中,控制器在I/O模式下支持单路和四路写入模式。然而,在线性寻址模式下,不支持写入操作。这是因为线性寻址模式主要用于内存映射访问,而写入操作通常通过I/O模式进行,以便更灵活地控制数据写入过程。

操作模式转换

Quad-SPI操作模式的转换如图12-3所示。

在I/O模式下,软件可以通过设置适当的寄存器位来选择不同程度地控制读取数据管理的各个方面。相比之下,在线性模式下,控制器会执行所有必要的读取数据管理,使得内存读取对软件而言就像访问ROM一样简单。

I/O模式详解

在I/O模式下,软件负责根据Quad-SPI协议准备和格式化命令和数据为指令。这些格式化的指令序列(包括CMD和数据)通过重复写入TXD寄存器被推送到传输FIFO(TxFIFO)中。传输逻辑会根据Quad-SPI接口规范将TxFIFO的内容序列化,并将数据发送到闪存。同时,在传输逻辑发送TxFIFO内容的过程中,它会同时采样原始串行数据,执行串行到并行的转换,并将数据存储到接收FIFO(RxFIFO)中。

对于读取命令,当命令和地址字节之后闪存开始发送数据时,MIO会在传输逻辑的控制下在适当的时间从输出切换到输入。数据被移入RxFIFO,这反映了切换的结果,因此在相应的FIFO条目中,RxFIFO中会包含有效的数据。

软件需要从RxFIFO中过滤原始数据以获得相关的数据内容。控制器不会修改软件编写的指令或捕获到RxFIFO中的数据。

控制器支持小端模式,即指令的4字节字中,最低有效字节的最高有效位会首先被发送。

流控制模式

在I/O模式下,数据传输过程中有不同的流控制模式,用户可以通过配置寄存器(如config_reg.MANSTARTEN(Man_start_com))来选择自动模式或手动模式。

自动模式(Automatic Mode):在自动模式下,整个传输序列,包括片选信号(CS)的控制,都由硬件自动完成,无需软件干预。一旦数据通过写入TXD寄存器被推送到TxFIFO中,传输就会立即开始,片选信号自动激活。当TxFIFO为空时,数据传输结束,片选信号自动失活。在这种模式下,为了进行连续的数据传输,软件必须能够以等于或高于MIO上数据移动速率的速度向TxFIFO提供数据。然而,由于从RXD读取和向TXD写入都是在APB时钟速率下进行的,这可能会很困难。

手动模式(Manual Mode):在手动模式下,用户控制数据传输的开始。软件可以将整个传输序列写入TxFIFO,直到TxFIFO满为止。写入Man_start_en位后,控制器接管,激活CS,将TxFIFO中的数据移出并移入RxFIFO,根据需要控制MIO的输入/输出状态,并在TxFIFO为空时通过取消激活CS来终止序列。在这种模式下,每个命令序列的最大字节数受限于TxFIFO的深度,通常为252字节。

此外,在手动模式下,用户还可以选择控制片选信号,以补充对传输开始的控制。软件首先将包含命令的传输序列写入TxFIFO,直到TxFIFO满为止。然后,软件激活CS,并手动启动传输。硬件接管后,但不会在TxFIFO为空时自动取消激活CS。软件可以再次用适当的数据填充TxFIFO以继续之前的命令。这种方法取消了每个命令序列的字节数限制,并可用于大数据传输。在命令序列完成后,软件通过写入Manual_CS位来取消激活CS。

总的来说,自动模式简化了数据传输过程,但可能受限于APB时钟速率和TxFIFO的容量。而手动模式提供了更高的灵活性和控制精度,特别适用于需要精确控制数据传输时机或进行大数据传输的场景。

I/O模式传输寄存器(TXD)

在I/O模式下,软件通过写入字节序列来与特定的闪存设备进行通信,这些字节序列需要遵循Quad-SPI设备供应商的规范。控制器提供了四个仅写入的32位TXD寄存器(TXD0, TXD1, TXD2, TXD3),允许软件向闪存发送一系列命令以获取状态、读取或写入数据。

Quad-SPI TXD寄存器的写入格式在表12-1中有详细描述。每次对TXD0、TXD1、TXD2或TXD3寄存器的访问都会导致相应的数据写入到TxFIFO中。

用户必须在连续访问不同的TXD寄存器之间清空TxFIFO,以避免数据冲突或覆盖。具体来说,需要在以下情况下清空TxFIFO:

  • 从TXD0访问到TXD1/TXD2/TXD3
  • 从TXD1访问到TXD0/TXD1/TXD2/TXD3
  • 从TXD2访问到TXD0/TXD1/TXD2/TXD3
  • 从TXD3访问到TXD0/TXD1/TXD2/TXD3

但是,如果是从TXD0到TXD0的连续访问,则不需要清空FIFO,因为这是在同一个寄存器上进行的操作,不会影响到TxFIFO中的数据序列。

注意:在Quad-SPI(四线SPI)通信中,某些针对选定内存的指令需要包含虚拟数据字节(dummy data bytes)。这些虚拟数据字节是指令序列的一部分,与打算从内存中读取的字节数一起发送。虚拟数据字节的目的是确保有足够的总线转换时间,以便将I/O从输出切换到输入。如果为某个指令提供的虚拟数据字节数量不足,那么内存可能会读取到错误的数据,因为总线可能还没有完成从输出到输入的转换,或者设备还没有准备好发送数据。要了解特定指令所需的虚拟数据字节数量,应查阅目标内存的数据手册。数据手册通常会详细列出每种指令的格式,包括需要发送的虚拟数据字节的数量、地址字节的数量、以及可以读取或写入的数据字节的数量。

FIFO的读写

在Quad-SPI通信中,TxFIFO(发送FIFO)和RxFIFO(接收FIFO)共享同一个门控时钟。这意味着每当从TxFIFO中移出一个字节(包括命令和地址字节)时,都会有一个相应的字节被移入RxFIFO中。这种机制确保了数据的同步传输和接收。

为了从Quad-SPI闪存中读取数据,软件需要将适当的命令、地址、模式(在四线或双线I/O模式下)以及根据Quad-SPI闪存要求所需的虚拟数据写入TxFIFO中。此外,软件还必须在TxFIFO中填充额外的虚拟数据。这些额外的虚拟数据提供了必要的时钟周期(CLK),以便将数据移入RxFIFO中。

I/O模式下的考虑因素

在I/O模式下使用Quad-SPI接口时,有几个重要的考虑因素需要注意。其中之一是关于RxFIFO中断状态位的行为。这个状态位可能会在数据实际可用之前就被置位,表示有数据待读。这种延迟通常与跨时钟域操作相关,但大多数情况下,这种延迟会被软件处理中断所需的时间所弥补。

另一个重要的考虑因素是在执行读命令时,软件需要向TxFIFO写入虚拟数据(dummy data)以从设备接收数据。这是因为在Quad-SPI通信中,数据的传输是双向的,且传输方向可以在单个指令的执行过程中改变。为了确保设备有足够的时间来准备数据并将其放置在数据总线上,软件需要在发送完命令和地址后,继续向TxFIFO写入虚拟数据。这些虚拟数据为设备提供了必要的时钟周期,以便将数据移入RxFIFO中。

此外,在自动模式下,如果TxFIFO为空,Quad-SPI控制器将取消片选信号(chip select)。这意味着如果软件没有及时向TxFIFO发送足够的数据(包括命令、地址和虚拟数据),那么设备可能会认为指令已经结束,从而停止数据传输。因此,为了继续接收数据,软件必须重新发送读命令和地址到设备,并确保TxFIFO中有足够的数据来维持数据传输。

线性寻址模式(Linear Addressing Mode)

线性寻址模式(Linear Addressing Mode)是Quad-SPI控制器提供的一种高级功能,它通过32位AXI从接口支持读操作的线性地址映射。当主设备通过此端口发出AXI读命令时,Quad-SPI控制器会生成相应的QSPI命令来加载对应的存储器数据,并通过AXI接口发送回主设备。

在线性模式下,闪存子系统表现得像一个带有AXI接口的只读存储器(ROM),它支持深度为四的命令流水线。这种模式通过减少软件开销,提高了用户友好性和整体读内存吞吐量,与I/O模式相比具有显著优势。从软件的角度来看,访问线性Quad-SPI内存子系统与其他ROM没有明显区别,除了可能存在的更长延迟。

要切换到LQSPI(Linear QSPI)模式,需要将qspi.LQSPI_CFG.[LQ_MODE]位设置为1。在进入线性寻址模式之前,用户必须确保TxFIFO和RxFIFO都是空的。一旦qspi.LQSPI_CFG.[LQ_MODE]位被设置,FIFOs将自动由LQSPI模块控制,对TXD和RXD的IO访问将不再定义。在线性模式下,片选(CS)引脚将自动由QSPI控制器控制。在切换到LQSPI模式之前,用户必须确保qspi.Config_reg[Man_start_en]qspi.Config_reg[PCS]都被设置为零。

图12-2展示了控制器的简化框图。

AXI接口操作

在AXI接口操作中,当Quad-SPI控制器配置为线性寻址模式时,仅支持AXI读命令。对于所有有效的写地址和写数据,它们会被立即确认但会被忽略,即不会对闪存执行相应的编程(写)操作。所有AXI写操作都会在写响应通道上生成SLVERR错误。

该接口支持递增地址或回环地址的突发读取,但不支持固定地址的突发读取,因为这会导致SLVERR错误。因此,在arburst[1:0]字段中,唯一被识别的值是2'b01(INCR,递增突发)或2'b10(WRAP,回环突发)。所有读访问都必须是字对齐的,且数据宽度必须是32位(不允许窄突发传输)。

表12-2列出了主设备发出的读地址通道信号,这些信号在接口中被忽略。这些被忽略的信号通常与写操作相关,因为在线性寻址模式下,控制器只响应读命令。

AXI从接口提供的读接受能力为4,意味着它能够同时接受最多四个待处理的AXI读命令。这种设计是为了提高系统的并行处理能力和数据吞吐率。

AXI读命令处理

AXI读突发命令的处理:AXI读突发命令被系统转换为SPI闪存的读指令。这些读指令随后被发送到Quad-SPI控制器的TxFIFO(发送FIFO)中。这一步骤是AXI从接口与Quad-SPI控制器之间的接口转换过程,确保了AXI协议下的读请求能够被转换为SPI协议下可执行的读指令。

传输逻辑:Quad-SPI控制器的传输逻辑负责从TxFIFO中检索这些读指令,并按照SPI协议将它们发送到SPI闪存。这意味着传输逻辑需要理解SPI协议的时序和信号要求,以确保读指令能够正确地被SPI闪存接收并执行。

64深度的FIFO:为了存储从SPI闪存读取的数据,系统使用了一个64深度的FIFO。这个FIFO的容量足够大,可以存储最多四个16位数据突发(burst-of-16 data)。这意味着在一次读操作中,系统可以连续地从SPI闪存中读取最多64位(或8字节)的数据,并将其存储在FIFO中以供后续处理。

数据过滤和线性地址模块:当芯片选择信号激活时,Rx FIFO开始接收来自SPI闪存的数据。然而,这些数据不仅包括有效的数据,还可能包括指令代码、地址、空循环(dummy cycles)以及AXI读指令的响应。为了获取纯净的有效数据,系统使用了一个线性地址模块来过滤掉这些非数据部分。线性地址模块会检查接收到的数据,并移除与指令代码、地址、空循环等相关的数据部分,只保留AXI读请求所期望的有效数据。

接口配置和读模式

在AXI与SPI闪存之间的通信过程中,AXI读突发传输是一个关键环节。当AXI从接口接收到读突发请求时,这些请求会被系统转换成SPI闪存能够理解的读指令。这些读指令随后被发送到Quad-SPI控制器的TxFIFO中。TxFIFO作为一个缓冲区,暂时存储了这些待发送的SPI读指令。Quad-SPI控制器的传输逻辑(Transmit Logic)负责从TxFIFO中检索这些读指令,并按照SPI协议的时序和信号要求,将它们正确地发送到SPI闪存设备。

  • SPI读命令配置:软件通过写入qspi.LQSPI_CFG[INST_CODE]寄存器来定义在线性寻址模式下使用的SPI读命令。

  • 寄存器设置:支持的读命令代码和推荐的配置寄存器(qspi.LQSPI_CFG)设置列在Table 12-3中。对于使用33 MHz PS_CLK(处理器系统时钟)的Quad-SPI启动性能,Table 6-10和Table 12-3中给出了最优的寄存器值。这些寄存器值可以在非安全模式下使用BootROM头文件中的寄存器初始化功能进行编程,以加速FSBL(第一阶段引导加载程序)/用户代码的加载。

  • 时钟分频器调整:如果使用了更快的PS_CLK,那么需要根据实际情况调整时钟分频器,以确保Quad-SPI控制器与SPI闪存设备之间的正确通信。

Quad-SPI接口的操作模式选择主要取决于所连接的SPI闪存设备的性能和能力。

I/O Fast Read模式:地址和数据都使用4位并行传输,这是最快的传输方式。因为它同时利用了地址和数据线的并行性,可以显著减少数据传输所需的时间。

Output Fast Read模式:仅数据使用4位并行传输,而地址可能仍然是串行传输或按其他方式处理。尽管如此,这种模式的性能仍然优于串行位模式,因为它至少利用了数据线的并行性来加速数据传输。

性能模式

为了获得最高性能,用户应在四输入/输出模式下使用四SPI控制器。用户可以通过在连续读取模式下使用Quad SPI设备来提高读取性能。这消除了连续命令的读取指令开销。

数据读取管理

63个深度的RxFIFO用作读取数据的缓冲区,其容量足以至少存储三个AXI突发传输的数据,每个突发传输的长度为16字节。这意味着RxFIFO能够暂存至少48字节(3个突发传输×16字节/突发)的数据,但实际上它的容量更大,可以存储多达63个数据单元。

数据对齐当芯片选择信号(chip-select signal)激活时,RxFIFO立即开始接收数据。这是因为在许多串行接口(如QSPI)中,一旦选择了设备,就会开始数据传输。然而,传输的初始部分可能包含不直接作为读取数据一部分的信息,如指令代码、地址和哑周期(dummy cycles)。

读取的数据必须与地址指定的相应字边界对齐。为了数据对齐,控制器可以在将地址发送到闪存设备之前修改地址,如图12-4所示。地址修改涉及将地址减少最多3个字节的位置,以便自动对齐预期的返回数据。地址更改量对AXI接口是透明的,并且取决于指令。

例如,如果Cmd+address+mode+dummy(QSPI_instruction)的结束位置不在32位边界上,线性控制器将根据需要减去1、2或3个字节的地址偏移量,以确保读取的数据能够对齐到32位边界。这种对齐对于保持数据一致性和优化数据传输效率至关重要。

读延迟

在线性模式下,默认读取模式为快速四路I/O。以下是一个示例,用于计算100 MHz下具有2个虚拟字节的四路I/O模式下存储器的延迟。对于单个设备,从8位指令码和24位地址可用到第一个32位数据可用的时钟周期数为:

Total latency = instruction latency + address latency + overhead (mode + dummy bites + 
offset) + latency
= 8 cycles + 6 cycles + 8 (2+4+2) cycles + 8 cycles
=30 cycles

SPI时钟为100 MHz时,存储器接口的延迟为320 ns。其他读取模式具有更高的延迟,可以以类似的方式计算。

不支持的设备

许多设备实现了用于闪存访问的自定义4位宽SPI类接口,如SST的SQI设备和Atmel的Fast4设备。其他一些Quad SPI设备,如一些Micron/Numonyx设备,提供了一种通过非易失性配置位将操作切换到这种自定义4位接口的选项。

这些接口的操作方式与Quad SPI控制器支持的设备不同。这些闪存设备在指令阶段以及地址和数据阶段以4位模式运行。这要求Quad SPI闪存控制器在4位模式下通电并永久保持在该模式下(或者,如果该选项可用,则直到另行配置)。没有计划启用对这些自定义接口的支持。

支持的内存读写命令

支持在SCLK的每个上升沿传输一位地址,并从闪存返回SCLK的每一个上升沿1、2或4位数据的命令。对于1位数据,这些命令称为读取或快速读取;双输出读取用于2位数据,四输出用于4位数据。

支持在SCK的每个上升沿传输2或4位地址和数据的命令。

这些被称为2位双I/O和4位四I/O。

命令识别后,设备立即从双路切换到四路。虚拟周期的数量取决于频率和命令。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值