项目简介
该项目旨在实现一个NAND Flash Controller,支持ONFI和toggle两种闪存接口,并且支持LDPC ECC纠错
闪存接口及其时序
不管是哪一种接口,闪存的读写都按照先是命令周期,地址周期,数据周期的顺序进行的,接口和模式主要是在信号以及时序上有差别
ONFI async
ONFI异步模式的信号
信号 | 用途 |
---|---|
CE# | 片选使能,低电平有效 |
WE# | 写使能,低电平有效 |
RE# | 读使能 |
CLE | 命令锁存信号,命令周期应将其拉高,保证命令锁存 |
ALE | 地址锁存信号,地址周期应将其拉高,保证地址锁存 |
I/O[7:0] | 复用的信号线,命令,地址,数据的传输路线(双向) |
R/B# | 状态指示信号,1为就绪,0为忙碌(输出) |
WP# | 写保护,通常情况下应保持在1(或者在前端设计时直接不考虑该信号) |
接口设计思路
使用状态机进行时序的控制,同时设计了两个计数器,一个用于辅助状态的跳转,一个用于确保数据全部输入或输出
LDPC ECC原理
寄存器配置
寄存器组
名称 | 用途 | 地址 |
---|---|---|
col_addr1 | 传输的第一个8位地址,或者说列地址 | 0 |
col_addr2 | 传输的第二个8位地址,或者说列地址 | 1 |
row_addr1 | 传输的第三个8位地址,或者说行地址 | 2 |
row_addr2 | 传输的第四个8位地址,或者说行地址 | 3 |
row_addr3 | 传输的第五个8位地址,或者说行地址 | 4 |
id_reg0 | id的第一部分 | 5 |
id_reg1 | id的第二部分 | 6 |
id_reg2 | id的第三部分 | 7 |
id_reg3 | id的第四部分 | 8 |
cmd_reg | 存储命令 | 9 |
err_reg | ecc错误标志 | 10 |
status_reg | 存储闪存的状态 | 11 |
对于寄存器的说明
寄存器对于
主控逻辑
AHB-Lite接口设计
坏块管理
异步FIFO
由于AHB_LITE总线的工作频率快于闪存的工作频率。为了解决跨时钟域会带来的亚稳态问题,必须使用异步FIFO对数据进行同步后才能进行传输。异步FIFO选用了SYNOPSYS的designware库中的成熟IP。
信号 | 用途 |
---|---|
hclk | 快时钟,整个控制器使用 |
hreset_n_in | 复位信号 |
ahb_haddr | 32位,总线访问的地址 |
ahb_write | 写使能 |
ahb_hsize | 3位,传输尺寸 |
ahb_hburst | 3位,突发传输类型 |
ahb_htrans | 2位,传输类型 |
ahb_hwdata | 32位,主机给从机的数据 |
ahb_hrdata | 32位,从机给主机的数据 |
ahb_hready | 从机反馈给主机的就绪信号 |
clk_s | 慢时钟 |
dclk | 延迟相位时钟 |
R_Bn | 闪存的就绪或者忙信号 |
DQ | 8位,闪存的命令/地址/数据复用接口 |
DQS | 闪存的数据选通信号 |
CLE | 闪存的命令锁存信号 |
CE_n | 片选信号 |
ALE | 闪存的地址锁存信号 |
RE_n | 闪存的读使能信号 |
WE_n | 闪存的写使能信号 |
Comments | NOTHING