胥嘉佳,黄克平
(南京模拟技术研究所科研处,江苏南京 210016)
FPGA在电子各个领域得到广泛应用,因为通过对FPGA的设计,不仅可以在FPGA内部对所需软件进行开发,还可以对所需硬件进行设计,从而使得FPGA成为一个SOIP(集成片上系统)的载体。正是这种特性,在设计FPGA硬件系统时,可尽量减少FPGA外围器件,而将逻辑类外围器件都做到FPGA内部,从而增加硬件设计的可靠性和可验证性。然而FPGA中一般不集成PROM(可编程只读存储器),如果想存储掉电不失的数据,往往需要增加一片 PROM芯片。FPGA配置芯片一般为Flash芯片,其是PROM的一种,具备掉电不失和可修改特性[1],因此提出了一种利用FPGA配置用SPI接口的Flash芯片实现PROM扩展的方法,在FPGA正常工作后通过FPGA对其配置芯片的控制来实现读写操作,从而能在不增加任何其他存储芯片情况下扩展出PROM功能。
SPI串行接口是一种高速、全双工、同步的通信总线,在芯片的引脚上只用4根线,不仅节约了芯片的引脚,同时在PCB布局上还节省空间,正是这种简单、易用的特性,被越来越多的FPGA设计者使用,SPI接口的Flash作为FPGA的配置芯片[2]。而现在FPGA也越来越多地提供这种配置方式,例如Altera公司的Cyclone II、Cyclone III、Stratix II、Stratix II GX、Stratix III系列和Arria GX系列,以及Xilinx公司的Spartan-3E、Spartan-6、Virtex-5、Virtex-6系列和 7系列FPGA等,都提供了SPI接口的Flash配置方式。本文将以 Xilinx公司的 Spartan-3E系列 FPGA芯片XC3S100E和ST公司M25Pxx系列Flash芯片为例,介绍PROM在FPGA中的扩展方法,FPGA与配置用SPI接口Flash的硬件连接如图1所示,其中,D为Flash的数据输入脚,Q为Flash的数据输出脚,S为Flash的片选脚,C为Flash的时钟脚,将 FPGA 的 M2、M1、M0配置为‘0’、‘0’、‘1’,FPGA 在上电后将以 Master SPI配置方式进行配置。由于 FPGA的 MOSI、DIN、CSO_B和CCLK的4个管脚均是复用管脚,因此在上电配置完成之后,这4个引脚将作为IO脚,可以通过程序来控制SPI接口Flash的各项操作[3]。
图1 FPGA与配置用SPI Flash的硬件连接图
M25xx系列 Flash是 ST公司的高速 SPI接口Flash,读写时钟最快可达到40 MHz,分为1 MB、2 MB、4 MB、8 MB、16 MB等多种容量,不同容量的芯片管脚和封装完全相同。在利用配置用Flash芯片作PROM扩展时,可根据设计需要自由选择Flash芯片容量,例如在使用Xilinx公司的Spartan-3E系列FPGA芯片XC3S100E时,配置程序的容量一般<2 MB,那么若使用8 MB的Flash芯片M25P80作其配置芯片,就可以有6 MB的空间可用于PROM扩展。配置程序一般从Flash芯片0x000000的地址放置,那么可用于PROM扩展的6 MB空间的地址范围为0x040000~0x0FFFFF[3]。
M25Pxx系列Flash有许多基本操作,文中提出的PROM扩展方法所需要用到的操作主要有写使能操作、读状态寄存器操作、扇区擦除操作、写数据操作和读数据操作这5个。
写使能操作必须在每次对Flash芯片进行的写状态寄存器操作、芯片擦除操作、扇区擦除操作和写数据操作之前,确保这些操作的有效性[4-5]。写使能操作只要向Flash芯片写入指令0x06即可,时序如图2所示。
图2 M25Pxx系列Flash芯片写使能操作时序图
读状态寄存器操作能够从Flash芯片中读出状态寄存器值,寄存器的最低位为写操作忙碌标记位,若为‘1’则标志写操作正在进行,为‘0’则标志写操作已经完成,可以再次进行写操作,所以读状态寄存器操作必须在每次对Flash芯片进行的写寄存器操作、芯片擦除操作、扇区擦除操作和写数据操作之后,以确保这些操作完成。读寄存器操作需要先向Flash芯片写入指令0x05,然后从芯片中读入8 bit寄存器值,时序如图3所示。
图3 M25Pxx系列Flash芯片读寄存器操作时序图
扇区擦除操作能够擦除Flash芯片中的任意扇区。M25Pxx系列Flash中每512 kB分为一个扇区,向每个扇区中写数据前必须先对该扇区进行擦除操作,否则数据将无法写入。扇区擦除操作需要先向Flash芯片写入指令0xD8,然后写入24 bit地址,之后这个地址所在的扇区将被擦除,时序如图4所示。
图4 M25Pxx系列Flash芯片读寄存器操作时序图
写数据操作就是从Flash芯片中某个地址开始依次写入若干个Byte的数据,每次写数据操作最多可写入256 Byte。写数据操作需要先向Flash芯片写入指令0x02,然后写入24 bit地址,最后写入需要的若干个Byte的数据,时序如图5所示。
图5 M25Pxx系列Flash芯片写数据操作时序图
读数据操作就是从Flash芯片中某个地址开始依次读出若干个Byte的数据,每次读据操作最多可读出256 Byte。读数据操作需要先向Flash芯片写入指令0x03,然后写入24 bit地址,最后读出需要的若干个Byte的数据,时序如图6所示。
图6 M25Pxx系列Flash芯片读数据操作时序图
FPGA具有较强的时序操作能力,因此在FPGA中可以轻松地对以上5个时序进行设计,以得到Flash芯片的控制程序模块。
FPGA对Flash芯片的控制程序可采用状态机的方式实现,依据以上的5个操作,给出实例操作程序流程如图8所示,用虚拟逻辑分析仪软件ChipScope观测到的逻辑运行结果如图7所示,其中FPGA的M25P80_CE_OBUF、M25P80_SCK_OBUF、M25P80_SI_OBUF 和M25P80_SO_OBUF的4个管脚分别连接M25P80芯片的4个管脚 S、C、D 和 Q,Addr和 data_o均为FPGA的内部寄存器,分别显示当前读取数据操作对应的地址和前一个读取操作读取到的数据。从图7中可以看出,从 Flash地址0x0F0000~0x0F0003读出的4个Byte数据为 0xA0、0xB1、0xC2 和 0xD3,与设计流程图8中给定的写入数据完全一致,说明提出的方法正确可行。
图7 用ChipScope软件观测到的逻辑运行结果
提出了使用FPGA的配置Flash实现PROM扩展的方法,并通过具体实例操作验证了该方法的可行性,由于扩展该方法的硬件是基于FPGA最小系统,而不需增加额外的存储芯片开销,因此可以减小硬件设计复杂度,并减少FPGA的管脚开销,具备一定的工程实用性。
图8 FPGA控制Flash的实例操作程序流程
[1]Xilinx Conpration.Spartan - 3E FPGA family:complete data sheet[M].USA:Xilinx Conpration,2012.
[2]张立为,钟慧敏.实现基于FPGA的SPI Flash控制器设计[J].微计算机信息,2010(17):124-126.