一种支持多模式的QSPI Flash 控制器
本位介绍了一种支持多模式的QSPI Flash,可以提高嵌入式处理器访问Flash 的效率。该控制器支持直接访问模式、间接访问模式、SPI传统访问模式以及STIG操作模式,可以在单数据速率或双数据速率(SDR/DDR)模式下工作,控制器还支持片内执行(XIP) 模式操作。
介绍一款SoC内嵌的高性能QSPI Flash控制器,支持采用双倍率对闪存进行访问。该控制器可以工作在直接访问模式、间接访问模式以及传统SPI访问模式和STIG操作模式。
1 QSPI Flash控制器架构
QSPI Flash控制器是嵌入式SoC外设的一部分,用于对多位串行Flash器件进行访问,支持
标准的串行SPI外设接口和高性能的四线SPI接口。QSPI Flash控制器可以分别在三种操作模式中工作。直接访问模式、间接访问模式和传统SPI模式。
系统框图如下图所示,该控制器采用AHB总线接口和APB总线接口与高性能ARM cortex-A9连接。ref_clk用来生成QSPI接口时钟,QSPI Flash控制器可在133MHz的频率下工作,内部分频器可以对ref_clk进行2~32分频,默认采用4分频。QSPI Flash控制器通过MIO连接外部器件设备。

QSPI Flash控制器通过AHB总线和APB总线接口连接到SoC架构。
AHB总线接口模块用于数据的传输,在直接访问模式下,AHB总线接口通过地址映射方式直接访问Flash,数据通过直接访问控制器模块写入TX FIFO中,然后通过QSPI接口发送出去。在间接模式下,从AHB总线写入的数据会先在SRAM中缓存,然后通过APB总线接口配置寄存器触发写操作,SRAM中数据再通过间接访问控制器模块送到TX FIFO中,经过QSPI 接口发送出去。APB总线接口模块用于访问寄存,完成对QSPI Flash控制器的控制和检测。该控制器内部包含一个大小为256*32的SRAM和寄存器模块,提供所有的控制寄存器、状态寄存器以及中断寄存器等,软件触发指令生成器模块(STIG)生成Flash指令并提供对闪存的访问。Flash命令生成器模块是根据直接或间接访问控制器生成Flash命令和地址指令,SPI逻辑控制模块是连接外部的Flash器件的接口模块,控制器的内部结构组成如下图所示。

2 工作模式
2.1 直接访问模式
直接访问是指通过AHB总线从接口直接触发对Flash器件的读取或写入操作。它是内存映射的,可以用于访问和执行外部闪存中的代码 。要使用直接访问模式,需要首先设置QSPI的配置寄存器的直接访问模式域来使能直接访问控制器,任何不在可编程间接触发区域内的访问都会被当作直接访问来处理。控制器使用直接访问模式的时候是不使用嵌入式SRAM的,当执行读或写突发操作的时候,AHB接口新的请求将会被推迟,当启用XIP读取指令后,延迟会保持最小。
对于写入操作,尽管直接访问写入请求数量等于AHB总线接口写入的请求次数,但直接访问控制器将触发一系列写入命令,这些命令模仿读取数据的方式,控制器将确保一次Flash突发操作不会超过Flash的页边界。当检测到突发操作跨越了页边界时,该操作将被拆分为两个写操作,第一个写操作只会到达页边界的访问,第二个写操作会处理剩下的地址访问。在写页之前,需要先执行Flash擦除操作,一旦页擦除操作开始,控制器将后续所有的直接访问设置为等待状态,直到页擦除操作完成。
QSPI控制器通过命令与Flash器件进行交互,每条命令包括指令、地址、空指令和数据。地址可以是3字节或者4字节。发送空指令的目的是当采用更高的时钟频率时,留出给Flash器件准备发送数据的时间。在SDR和DDR模式下,空指令的持续时间是指定一定个数的全时钟周期,当Dummy cycles为零时则跳过空指令周期阶段,命令序列直接进入数据阶段。四线模式下的快速读队列时序如下图所示。

2.2 间接访问模式
间接访问需要用到嵌入式SRAM,将数据暂时存放在控制器的SRAM ,通过APB总线接口配置寄存器和AHB总线数据接口触发间接访问,从而完成控制器与Flash器件之间的数据传递。
2.2.1 间接读操作
间接操作模式的目的是从闪存中一次性读取大量数据,并不用持续占用AHB总线接口来触发它。在间接读操作之前需要先通过APB接口配置特定的寄存器,如间接读控制寄存器(0*6)、间接读水平线寄存器(0*64)、间接读起始地址寄存器(0*68)和间接读字节数量寄存器(0*6c)。
配置的信息会被传输给具有SPI协议的状态机模块来产生高效优化的Flash读取 ,将读取的数据缓存到本地的SRAM模块中,然后这些数据可以被外部的AHB主设备快速低延迟地读取。在启用间接操作之前,必须先设置好期望传输数据的起始地址以及数据长度。一次最多可以进行两次间接操作编程,第二次可以在第一次进程中触发,从而提高传输效率。
在间接读操作中,一次间接读取的字节总数不受SRAM大小限制,当SRAM中数据存满时,控制器将会暂停Flash的读操作,直到SRAM中有可用的空间为止。控制器首先会完成当前的突发读操作,等到SRAM中有足够的空间时,再接着先前终止的突发结束地址发起新的突发读操作 。要从闪存中读取数据到SRAM中,外部主接口需要发出32bit读数据到AHB 接口,当控制器将读取的数据缓存到本地的SRAM中后,可以通过外部AHB 主机来读取SRAM中的数据。传入AHB读取访问的地址必须位于间接触发地址范围:indirect_trigger_address到indirect_trigger_address+sram_size*2**(indirect_trigger_range)-1,通过AHB间接触发地址编程,默认有16个地址,可以支持AHB主机发起16拍突发。实际的AHB 地址只需在间接触发范围内即可,从而AHB地址与Flash地址不直接映射。如果AHB读地址不在这个范围内,那本次的读操作被当作直接访问处理,间接读过程状态机如下图所示。

2.2.2 间接写操作
间接写操作是编程SRAM到Flash中的数据,间接写操作可以看作是间接读操作的逆过程,和间接读操作一样在发出间接写操作之前需要通过APB总线接口配置相关的间接写寄存器,从而触发从SRAM到Flash的间接写操作,然后再执行高效的Flash写入突发操作。间接写操作可以将大量数据从处理器批量的传输到闪存中,间接写数据到SRAM过程如下图所示。在间接写操作中,Flash耗费的周期是最少的,可以最大化延长器件的使用寿命。间接写队列与间接读队列非常相似,同样可以支持两个间接写操作,同时可以减少相邻两次间接写操作之间的间隔。当AHB的写地址在这个范围内时,控制器就知道该操作对象是SRAM而非Flash器件,当前操作会被转换为对SRAM的一层写操作。当SRAM中没有足够的空间时,那么控制器将会发出反压信号推迟AHB数据接口进一步的写请求。

2.3 SPI传统模式及STIG操作模式
Flash命令控制器用一种灵活且可编程的软件方式来访问Flash器件的方法,称为STIG(Soft-ware Triggered Instruction Generator)操作。指令操作码、地址字节数、写入数据字节数、写入数据长度和读取数据长度都是可以编程的。直接访问和间接访问都是用于传输数据的。为了访问控制器当中的配置寄存器、状态寄存器以及执行擦除操作,需要一个单独的软件控制寄存器STIG模块。首先在Flash命令控制寄存器(0×90)中设置操作命令,STIG模块会根据该寄存器的执行域来执行触发命令。这是一个通用控制器,可以用于执行Flash器件所支持的任何指令。位0用于触发该命令,位1用于轮询命令执行状态。对于读,当命令执行完毕后,位1从1切换为0,最多支持8个字节读取数据。对于写操作,写数据应放置在Flash命令写数据寄存器(0×A8)中。
SPI传统模式允许软件直接访问内部的TX FIFO和RX FIFO,从而绕过直接、间接和STIG控制器。由于传统SPI操作模式本质是双向的,在使能片选功能的同时,数据沿一个方向连续传输,即使驱动程序只希望从闪存设备中读取数据也必须写出伪数据来确保片选保持有效。比如对具有3个地址字节的设备执行4个字节的基本读取,软件必须将8个字节写入TX FIFO。第1个字节是指令操作码,后3个字节是地址,最后4个字节是伪数据,以确保在返回读数据的时候片选保持有效。
FPGA及Verilog入门和进阶教程:Verilog入门教程-CSDN博客
更多推荐



所有评论(0)