基于FPGA的EMMC大容量存储

持续更新。。。。

项目背景:在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”表示写入成功。

 后面持续更新实现细节!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值