最近在研究MachXO2芯片的On-chip Flash,除了我们所知道存储比特流的用途,看还有什么是可以给用户使用的。
1. CPLD的存储单元
MachXO2芯片包含两种内部的存储单元:SRAM 和 Flash。
下图为MachXO2中,ERB SRAM和UFM的配置容量。
1.1 Flash
CPLD中的Flash也可以成为On-chip Flash或Internal Flash Memory,是非易失性存储器。与FPGA不同,Flash是位于CPLD内部的存储单元。
On-chip Flash中提供了三个独立的扇区:
- Configuration Flash
- User Flash Memory (UFM)
- Feature Row
Configuration Flash用于存储压缩的Configuration Data。
UFM可作为Configuration Flash的扩展、或存储EBR初始化数据、或作为一般闪存给用户存储数据使用。
Feature Row是与芯片特征配置和芯片运行状态有关的数据,不要轻易改写。
1.2 SRAM
SRAM中存储的是active configuration,即现行配置,芯片中正在运行的配置。SRAM本质上是定义FPGA行为的“熔断器”,是掉电易失的,因此需要每次上电后从On-chip Flash中加载数据进行配置。
2. UMF
2.1 UFM特性
容量:24~256 kbits(2000-HC为80kbits)
寿命:100,000次写循环
访问:可通过WISHBONE, SPI, I2C 和 JTAG接口访
UFM是芯片中提供的一个硬核资源,是用户可读写的内部Flash。其中只有在MachXO2 640及以上的芯片才包含UFM。
注:
(1)UFM执行Erase后为0(表现为只能0改写为1,不能1改写为0,要改写为0只能Erase)
(2)UFM要先执行Erase,再执行Write,这样才能改写成功
2.2 UFM用途
UFM是CPLD芯片内部Flash的一个扇区,除作为Configuration Flash的扩展或EBR初始化存储之外,还可以作为一般闪存给用户存储数据使用。
Configuration Flash的扩展
一般情况下,On-chip-flash中用于存储Configuration Data的Configuration Flash扇区是足够大的,只要设计中不要包含非常多的预初始化EBR数据,Configuration Data就不会溢出。虽然溢出是极少情况,但是当发生溢出时,可以用UFM来存储溢出数据。
EBR初始化存储
EBR:Embedded Block RAM
Diamond软件默认会将EBR初始化数据存放在Configuration Flash扇区,当Diamond Spreadsheet View’s Global Preferences的配置中设置CONFIGURATION为CFG_EBRUFM,Diamond软件就会从第一个Page开始存储EBR初始化数据。
当EBR初始化为全零时,是不会占用UFM资源的,因此为了最大化UFM的数量,可以将EBR初始化为全零模式。
一般闪存
如果将UFM作为一般存储单元给用户使用,则需要防止Configuration Data溢出到UMF,需要在Diamond Spreadsheet View’s Global Preferences的配置中设置CONFIGURATION为CFG选项。
当UFM作为一般闪存使用时,可以芯片提供的外部接口去访问,比如MCU可以通过I2C去读写UFM,还可以由用户自己通过编写程序去获取UFM的内容。
2.3 UFM访问接口
MachXO2器件的可以访问UFM的外部接口:SPI, I2C 和 JTAG,以及内部WISHBONE总线接口,各端口优先级如下,高优先级可以打断低优先级:
1. JTAG Port
2. Slave SPI Port
3. I2C Primary Port
4. WISHBONE Slave Interface
虽然MachXO2提供了多个接口访问Flash,但是Flash的对外接口确实统一的,如下图16.1所示为 Flash Command Interface。Flash Command Interface通过解析不同的命令,来决定要访问的扇区和要执行的操作。
User-Logic为用户自己编写的逻辑,这就说明,用户逻辑可以通过编写符合WISHBONE总线时序的程序,去访问Flash。
(注意:这里需要说明I2C Primary Port不是指主从,而是主要I2C端口,lattice中其实有连个I2C端口,Primary I2C和Secondary I2C,主要接口和辅助接口的意思,这两个I2C都也里设置为主从。区别就是Primary I2C是芯片已经预先分配好接口的,不可改变,而Secondary I2C的端口需要用户分配,两个I2C可访问的位置不一样,只有I2C Primary Port可以访问Flash Memory。)
2.4 UFM访问控制
UFM是以page为单位组织的Flash扇区,每个page包含128位,共16字节。
因此UFM不能进行字节寻址,必须以page为单位进行读写,并且自动增量地址。如果需要修改某个字节,需要先将page全部读出,然后修改特定字节,再将整个page的数据写入。
注意:Flash的擦除是以扇区为单位进行的,因此擦除只能选择擦除整个UFM扇区的内容。
所以当要擦除UFM之前,应先读出UFM的内容作为备份。
2.5 UFM访问应用
图16.1可知,I2C, SPI以及WISHBONE总线接口都是EFB中的硬核资源,那么在实际调用中需要使用Diamond软件来调用EFB,根据实际需要引出需要的接口,以使用外部接口I2C,内部使用 WISHBONE总线接口为例,说明如何调用。
2.5.1 软件Global Preferces配置
首先使用I2C要在软件中使能I2C端口。因为I2C端口作为系统端口是可以作为一般IO使用的,默认设置就是当做普通用户IO使用。
其次UFM作为一般闪存给用户使用,那么就要保证UFM不会被Configuration Data溢出占用。
因此在Diamond软件中,需要将Spreadsheet View-->Global Preferces做如下配置,如下图所示:
2.5.2 EFB例化
Diamond中,选择Tools-->IPexpress-->EFB,根据需求填好Project Path, File Name, Module Output,然后点击Customize,如 图 2.5.1。
图 2.5.1
此时将出现“EFB配置”对话框,如图2.5.2所示,EFB窗口的左侧显示了与每个IP函数关联的I/O,使能不同的IP会出现对应的IP端口。我们需要使能Primary I2C的Configuration功能, 使能User Flash Memory,再设置WISHBONE总线频率。
使能Primary I2C是通过I2C向UFM读写数据,因为只有Primary I2C的Configuration功能才能访问到UFM(见2.3小节的图16.1)。
图 2.5.2
选择I2C配置页面,如图 2.5.3所示。
注意这里有两个I2C配置,如图2.5.3中方框标出,左侧Primary I2C的总线频率、I2C地址是可以用户配置的,这个I2C是不能访问UFM的。右侧UFM/Configuration I2C是可访问UFM的,它的地址是固定的100000不可改变,I2C总线频率与左侧配置相同。
设置Primary I2C频率和地址,I2C可以选择7bit寻址或10bit寻址。最后Generate,例化EFB成功。
图 2.5.3
选择UFM配置页面,如图2.5.4所示,分配使用的page数量,根据需要选择UFM的初始化方式,初始化为0或者可以指定初始化文件。
注意使用的page数量填好后,自动产生分配好的起始页面Initialization Data Starts at Page,是从UFM的后端开始分配。因为如果要使用UFM去存储EBR的初始化数据,是从UFM前端开始分配,这也有效防止了两种数据的重叠。
图2.5.4
产生的EFB的sym和tmp文件如下,前缀wb为WISHBONE总线接口,前缀i2c为I2C接口,_irqo为中断信号。
2.5.3 UFM初始化文件
图2.5.4中,在设置使用UFM的page数目下方,显示用户分配的UFM的初始化有两种方式:
1. 初始化为全0
2. 使用.mem初始化文件初始化
下面介绍使用.mem文件初始化,.mem文件格式支持二进制和十六进制,每一行就是一个page数据(16Bytes),因此初始化几页就写几行数据。
(1)Diamond中选择File-->New
在弹出界面中,左侧选择Other Files,右侧选择Memory Files,填好初始化文件,选择新建New。
(2)填写初始化文件内容
每一格就是一个page的初始化内容,填写需要的内容然后保存。
保存后Diammond自动生命.mem文件,为了查看.mem文件内容,我们用txt的形式把文件打开,正常使用时就用Diamond打开即可。
由下图可以看出,共16个page的初始化数据,每一行由左到右是byte15~byte0。通过Wishbone或I2C读数据时,也是byte15开始输出。
(3)在EFB例化中绑定初始化文件
3.参考文档
本文参照文档如下:
FPGA-TN-02162-4-8-Using-User-Flash-Memory-and-Hardened-Control-Functions-in-MachXO2-Devices
FPGA-TN-02163-2-8-UFM-and-Hardened-Control-Functions-in-MachXO2-Reference-Guide