Nand Flash控制器不断从Nand Flash体中通过8位I/O口分4次读取32位数据放置到Flash数据寄存器中,DMA从该数据寄存器中读取数据到DMA数据缓冲fifo中。当fifo内数据量达到设定的Burst大小时,运送至指定内存地址, DMA数据计数器减1,然后继续从Nand Flash数据寄存器中读取数据,填充DMA数据缓冲区,直至计数器至0,即完成预先设定搬运数量, DMA释放总线,这样就完成一页数据的读取工作。如果继续读,则需要由CORE重新发起命令,配置DMA和Nand Flash各寄存器。当然,DMAC和Nand Flash必须用同一个HCLK进行同步,保持模块间动作的一致。而向Nand Flash中写数据,控制过程大致相同,数据流方向相反。
相比与直接由CORE 发送命令字给NandFlash,然后直接从I/O 口读写数据的工作方式而言,通过DMA方式的传输,效率明显要高。特别在连续读取大批量数据的情况下,这种工作方式优点能更好的体现。在实际产品应用中(如数码照片的存取) ,读写数据量一般都是页大小的上千倍,所以这样的设计有助于提高实用性。出于SOC芯片面积和功耗的考虑,简化了通用控制器的一些功能,如识别芯片型号。因为在具体应用时,具体的NandFlash型号是确定的,只需在驱动开发时跳过这一步,直接填上具体已知的信息即可。
4 模块验证和应用开发
4. 1 模块验证
该模块已经先后通过了带有ARM7TDMI CORE的SUN服务器上进行寄存器级(RTL)仿真、后仿真验证和在ARM FPGA开发板上的验证,并在实际芯片演示样机上得到了具体的应用验证。编写测试向量( Testbench)在SUN服务器上进行VCS验证,截图见图4。图中信号内容为系统总线信号。
图4 SUNSERVER Nand Fla sh控制器RTL信号仿真时序图
在ARM FPGA开发板上,使用ADS开发套件和ARM Multi - ICE进行验证程序的屏幕截图见图5。
图5 ARM ADS开发系统界面
内存区内显示的是用C语言编写的测试程序。一般过程是先擦除Flash某块地址的数据,然后向该地址写入一定量数据,再将其读出,在内存区就可以看到开发板上SDRAM或者SRAM的内容,该内容应该和写入的数据完全一致,如果一致则读写都成功。ADS开发套件的使用在此就不展开描述。
4. 2 关于bootloader和从Nand Flash启动系统
由于Nand Flash生产厂家保证第一个block是available block (可用块) ,可以把启动代码( bootloader)放置在Flash的第一个page内,以实现从NandFlash启动系统。设置外部跳线,选择系统从Nand Flash启动方式。当带有芯片的系统板上电启动时, DMAC默认占用系统总线,自动从Nand Flash的第一个page搬运数据(即事先烧入的bootloader程序)到芯片片内的ESRAM,并从ESRAM开始顺序执行bootloader语句。
该段代码用汇编语言编写,完成的主要工作是:
(1) 片外存储控制器( EMI)的初始化,使内存可读写;
(2) 搬运存储在Nand Flash中的操作系统Kernel代码到较大容量的内存(一般是SDRAM) ,然后设置remap寄存器,使Kernel所在内存地址指向零,以满足中断向量表必须从零地址开始存放的要求;
(3) 最后设置程序计数器( PC)到零,从Kernel代码开始运行,真正的开始启动操作系统。
上述应用在实际芯片的演示样机中已经得到具体的实现,达到了预期的设计目的。
5 结束语
本文提出了在一款片上系统( SoC)芯片设计中的Nand Flash控制器实现方案,并介绍了验证过程和应用。该设计方案已在成品芯片的演示样机的应用中得到证实,具有相当的应用价值,达到了预期设计效果。