FRAM读写模块设计与仿真-Verilog实现
FRAM特性介绍
FRAM(ferromagnetic random access memory)即铁电存储器。是一种利用铁电晶体的铁电效应的存储器。有如下特点:
l 速度和读写特性与SRAM很相似,都是异步存储器,与SDRAM不同,FRAM和SRAM都是以一个Cycle为时间单位进行读写,所以SRAM的读写逻辑只需稍作移植就能应用于FRAM。
l 与SRAM和SDRAM相比,掉电不丢失。
l 相比于E2PROM和Flash,FRAM读写次数几乎不受限制,当然,受制于实际工艺条件,FRAM还是存在一定的读写寿命。
FM16W08是赛普拉斯推出的一款容量为8K*8bits的并行FRAM存储芯片。其关键特性如下:
读写次数 | 100 trillion (1014) read/writes |
数据保存时间 | 151 Years |
访问时间Access Time | 70 ns |
读写周期Cycle Time | 130 ns |
功耗 | Active <12mA,Standby 20uA |
供电电压 | 2.7V~5.5V |
温度范围 | -40~+85℃ |
封装 | SOIC-28,1.27mm pitch |
最突出的特点是读写次数和数据保存时间,作为非易失性存储器,我们可以做如下对比:
型号 | 种类 | 读写次数 | 数据保存时间/年 |
FM16W08 | FRAM | 1014 | 151 |
W25Q64 | SPI NOR Flash | 10万次 | 20 |
AT24C64 | EEPROM | 1百万次 | 100 |
可见,FRAM的读写次数差不多是Nor Flash的10亿倍,是EEPROM的1亿倍!数据保存时间也明显优于其他两者。
其实,为了兼顾RAM的速度又想让数据掉电不丢失,之前就有人尝试过将电池集成到SRAM模组内部,这就叫BBSRAM(battery-backed SRAM)。但使用电池保持数据的方式本身存在很多不可靠的因素。FRAM完全克服了这个问题。
FM16W08介绍
管脚分布和同为异步存储器的SRAM类似,地址线不复用,控制线还是CE/OE/WE,该芯片的PinOut如下图:
与SRAM的不同
FRAM会将地址锁存。以读为例,CE拉低会锁存Address总线上的内容,在下一个Cycle之前,主控哪怕改变Address总线上的内容,也不会对这个Cycle内的操作产生任何影响。这一点使得FRAM的稳定性优于SRAM。在硬件电路设计的时候也要注意,SRAM的片选管脚CE可以直接接GND以简化时序设计,而FRAM不能这么做,需要将CE上拉到VDD!
操作时序
最关键的三个参数是访问时间tCA,预充电时间tPC和Cycle Time。一般来说tCA+tPC=Access Time,但实际做RTL设计时,三者都要满足。具体参数见数据手册。
时序逻辑设计
读时序
(1)准备地址,拉高CE和OE
(2)拉低CE以锁存地址,拉低OE。虽然拉低OE的时候地址都没保持好,更别说有效数据输出了,但OE拉低不会导致异常,这样会简化时序。
(3)等待至少70ns时间以满足tCA和tCE的需求。
(4)读取数据
(5)拉高OE和CE至少维持60ns以满足tPC的要求。
FM16W08的读时序图如下:
双向端口FRAM_data要设置为输入:
reg FRAM_data_dir;//FRAM databus direction control.| 1:output 0:input |
assign FRAM_data=FRAM_data_dir ? data_in:8'hzz;
data_in来自内部总线,要写到FRAM中的数据就从这里进来。FRAM_data_dir为高时,设置为输出。为低时,双向端口被置为高阻输入。
CE控制的写时序
写时序和SRAM几乎一样,没什么特别的地方。
(1)准备地址和数据、拉低WE。
(2)拉低CE并等待至少70ns以满足tCA的要求。因为满足tCA(70ns)一定也会满足tAH(15ns)和tDS(30ns)的要求。
(3)写入数据。
(4)拉高CE和WE,至少等待60ns以满足tPC的要求。tCA+tPC=tWC,正好是一个Write Cycle。
OE始终拉高。
双向端口要设置为输出。
仿真验证
由于FRAM时序非常简单,并且笔者设置的FPGA主时钟只有50MHz,所以只需做前仿基本就能验证RTL代码是否能正常工作。仿真环境为Modelsim ASE,FRAM芯片的模型是赛普拉斯提供的VerilogHDL Model,这个模型使用VerilogHDL语言编写,完全根据芯片实际的时序参数设计,所以能很好的整合到仿真工程中。
Testbench用来验证单字节读写功能:
(1)初始化FM16W08中的每一个单元中的内容为0xFF。
(2)准备地址0x0000和数据0x88,产生一个写Request信号
(3)等待至少一个写Cycle,通过波形观察FRAM地址0中的数据是否由0xFF变位0x88
(4)准备与(2)同样的地址和数据,产生一个读Request
(5)等待至少一个读Cycle,通过波形观察数据总线上是否出现0x88
仿真波形图如下:
从上图可以看出,单字节读写功能被成功验证。至于多字节连续读写,只要设置好Request信号和地址数据,问题也不大,此处不再赘述。
虽然FRAM目前成本偏高,但作为一种新的高性能存储器,未来可能会随着工艺的改进而不断被推向市场。
附件是完整的RTL、Testbench代码和Modelsim工程,在不同电脑使用时注意设置工程目录(点击下载附件)