eFlash控制器的Datasheet
硬件和软件交互的文档,提供Datasheet
1.eFlash控制器功能列表
eFlash存储控制器一局软件要求完成写擦操作,其提供系统boot时的命令数据,并在main区(存储器分为Main和Infr area)存放各个IP模块工作所需要的命令数据.一般情况下,系统只对其进行读操作,除非系统进行版本更新,那么就需要进行擦写操作,在用户模式下,为了防止软件对关键的boot区数据误擦写,本控制器增加了boot区间的擦写保护功能,具体功能如下:
- 支持32位的AHB slave interface(不支持该总线busy传输类型)
- 支持eFlash的多周期读\写\页擦操作(2块独立的eFlash串联封装)
- eFlash操作可配置(时序,功能)
- 支持eflash中boot区空间的擦写保护
- 支持DFT功能
2.Flash控制器架构图
3.eFlash工作时序图描述
3.1 读操作
3.2 写操作
3.3 页擦操作
3.4 eFlash操作需要用到的timing参考表
4.eFlash控制器功能验证描述
4.1 验证环境说明
验证环境简单说明如下:
- 连线和信号初始化
TMR = 1'b1;
TM[2:0] = 3'b0;
VPP = 1'b0;
上述三类信号是从eFlash核直接接入的,只有这样才能是eFlash处在正常的用户模式下面
- 为了完善写和页擦功能测试,要将eflash_wp_n = 1'b1;在完成boot程序之后,boot_en拉低,使得系统从main区的零地址开始读取命令
- 本控制器不支持AHB总线发出的BUSY数据传输类型功能
- 另外为了加快仿真速度,对模型的时序参数做了改动
Trvc,Tnvs,Tnvh,Tpgs,Tprog,Tprog_min,Tprog_max,分别缩小10倍
Terase,Terase_min,Terase_max分别缩小1000倍,这样可以大大减少仿真时间
4.2 页擦和写操作说明
对eFlash操作时,特别是对其进行页擦和写操作时,也就是在配置寄存器让其工作时,需要注意配置寄存器的先后顺序:
- 对于页擦操作:先配置pe_num_r和pe_main_infr_sel_r(两者无先后差异),然后载配置pe_en_r
- 对于写操作,先配置prog_addr_r和prog_data_r寄存器(两者无先后差异),然后再配置wr_en_r寄存器
4.3 验证总体结构
5.eFlash控制器寄存器列表
base address:0x0006_0000
timing寄存器的复位值是按照最悲观的情况(120MHz,正常情况下跑到100MHz),设置一个最大值,保证默认情况下flash读写操作可以正常进行
- 每个寄存器是32bit,占4byte地址,AHB读写都是32bit,每次读写只能访问一个寄存器
- R/W -- 表示该寄存器可以进行读写
- R -- 只读寄存器,CPU对其只有读的权限,没有写的权限,比如状态寄存器,它的值是由IP内部决定的,CPU只能读取不能写
- 寄存器内部复位值,表示当前上电之后,初始化的值是多少
- 寄存器中所包含的域段也需要进行描述
- wr_en_r/pe_en_r -- 写使能和擦除使能
- pe_num -- 擦除哪一页
- pe_main_infr_sel_r -- 选择擦除哪一部分
- int_en_r -- 中断使能寄存器是可以进行读写
- flash_status_r -- 状态寄存器(是擦完成还是写完成)
6.eFlash寄存器详细描述
寄存器是硬件设计工程师提供给软件工程师的重要信息,从而实现软硬件交互,软件工程师根据这些寄存器描述,利用C语言编写驱动,也称为fireware
在寄存器详细描述中,描述了寄存器中的域段信息,寄存器是31bit的但是并不是全部都使用,一部分是reserved
- nvstr_setup_timing(Tnvs)寄存器
2.nvstr_hold_timing(Tnvh)
3.prog_setup_timing(Tpgs)
4.prog_sethold_timing(Tads/Tadh/Tpgh)
5.prog_proc_timing(Tprog)
6.read_aces_timing(Txa or Tya)
7.pe_timing(Terase)
8.rcv_timing(Trcv)
9.w_en_r
10.p_en_r
11.pe_num_r
12.pe_main_infr_sel_r
13.prog_addr_r
14.prog_data_r
15.int_en_r(中断使能寄存器)
16.flash_status_r(中断状态寄存器)
17.boot_pe_wr_error_r
7.eFlash控制器Program Guide
- 根据不同域段进行使用,具体会给出default值
- Tads/Tadh/Tpgh -- 时间比较短,放在一个寄存器中,就是一个寄存器分为几个域段