持续更新。。。。
项目背景:在FPGA做数据采集相关项目时有需要用到大容量存储的情况,例如需要几十GB~几百GB的存储容量,那么这类项目需要用什么样的方案呢?这里一起探讨一下。在网上经常能看到FPGA驱动SATA或pcie接口的NVME固态硬盘,这种方案存储容量大,数据带宽高,适用于要求非常高的应用场景 ,一般项目使用起来,无论是技术难度还是成本都非常高。今天我们来讨论一个低成本高性价比的存储方案,FPGA来读写EMMC来作为存储!emmc相关资料非常多,下文我直击要害介绍FPGA来读写EMMC需要了解的内容,然后其他需求就比较好扩展了。
项目完成情况:FPGA读写EMMC模块 就1个纯verilog模块,模块代码400多行即完成初始化、数据读写、CRC7、CRC16等EMMC读写所需要的所有功能。
一、fpga读写EMMC所需的接口
1、EMMC的接口有如下接口
(1)、emmc_clk FPGA给出控制EMMC的时钟,初始化为400Khz以内的低速时钟,数据传输阶段为高速时钟。具体要给据设置的速率模式来。(high speed、hs200、hs400)。
(2)、emmc_cmd FPGA控制EMMC的命令信号线,inout类型。EMMC的应答会通过该信号给出。
(3)、emmc_data[7:0] FPGA控制EMMC的数据信号线,inout类型。
2、EMMC初始化
fpga来读写EMMC需要完成一个初始化,初始化只需要按照协议来实现一下几个命令就可以。我列出来,具体功能可以直接根据命令名字去查细节。
(0)、上电后至少给74个时钟,可以多给一些然后开始发寄存器
(1)、CMD0 复位寄存器
(2)、CMD1
(3)、CMD2 获取CID寄存器的值
(4)、CMD3 进行RCA地址进行分配(SD卡是读取的RCA地址)
(5)、CMD7 选中设备根据RCA地址(就是上面设置的RCA地址)
(6)、CMD6 设置数据位宽、速率模式 黄色背景为初始化的命令
//此时状态转换到高速时钟模式
(7)、CMD8(可选) 这里是读取EXT_CSD寄存器来获取EMMC的实际最大容量
(8)、CMD16 设置Block大小
(9)、CMD23 设置Block数量
(10)、CMD25 连续写数据的起始地址 绿色背景为写数据的命令
(11)、CMD16 设置Block大小
(12)、CMD23 设置Block数量
(13)、CMD18 连续读数据的起始地址 蓝色背景为读数据的命令
2、EMMC数据格式注意事项
CMD命令格式如下
数据格式如下
3、EMMC读写数据的波形
上述文件分别为用FPGA内部ILA抓取的关键波形和用逻辑分析仪抓取的关键波形,及其介绍。
需要具体源文件可以看最后一张图。
上2张图为EMMC初始化的相关命令波形。需要具体源文件可以看最后一张图。
上1张图为EMMC写数据相关命令波形.
上2张图为EMMC写完一个Block后的CRC状态=“010”表示写入成功。
后面持续更新实现细节!