FPGA基于SDIO-4线模式读写SD卡、TF卡、SDNAND

项目背景:在以FPGA做项目时尤其是图像、视频类项目时,对存储器的使用可谓是必不可少,其中作为高速缓存的动态存储器例如SDRAM、HyperRam、DDR3、DDR4等。这些易失性存储器使用的频率是最高的,但同时有些非易失性存储器也常常会使用到,一般对于存储参数类的小容量存储器会使用eeprom(iic接口)、flash(spi)接口等。但是如果要用大容量的而且对读写速率还有一定要求的应用场景呢??根据以往的项目经验在这个场合下会使用EMMC、SD卡等存储器。

        本文就着重介绍下FPGA基于SDIO-4线模式实现 UHS-1 的协议来读写SD卡,向下兼容SD2.0协议。实现读写速率约600Mb/s.本文主要介绍FPGA在不使用文件系统的方式对SD卡进行基于物理地址的读写。网上基于SD2.0的协议介绍也比较多,在此就不太详细的介绍协议细节,主要介绍FPGA读写SD卡需要的具体内容 。

   

1、SD卡的类型

        常见的SD卡按类型分为

                标准容量卡(<=2GB):                存储地址的单位是以字节为单位

                高容量卡    (>2GB <=32GB)    存储地址的单位是块(512Byte)为单位

2、SD的初始化

 系统上电,发送 74 个时钟,等待 sd 卡内部初始化

 发送 cmd0,复位 sd 卡

 发送 cmd8,如果 sd 卡有响应,则 sd 卡属于 sdhc 类型,并且工作电压正常,初始化工程。如 果 sd 卡无响应,则 sd 卡可能属于 sdsc 类型,或者工作电压不正常,或者当前卡不属于 sd 卡,初始化失败。

 发送 cmd55 和 acmd41

 发送 cmd2,获取 sd 卡的 CID 序列。

 发送 cmd3,获取 sd 卡的 RCA 地址。

 发送 cmd7,选中 sd 卡。

 发送 cmd55+acmd6,设置总线宽度。 

3、SD的写数据

 发送 cmd16                                  复位设置块的大小

 发送 cmd55+acmd23                   预擦除

 发送 cmd25                                  连续写的命令

 发送数据(N*block_num)

 发送 cmd12                                  制停止数据传输,数据写结束

 发送 cmd13                                  查询卡是否恢复ready状态

4、SD的读数据

 发送 cmd16                                   复位设置块的大小

 发送 cmd18                                  连续读的命令

 发送 cmd12                                   强制停止数据传输,数据写结束

5、时序波形

FPGA读写SDVerilog设计逻辑Quartus工程源码文件,FPGA型号Cyclone4E系列中的EP4CE10F17C8,Quartus版本18.0。 module top_sd_rw( input sys_clk , //系统时钟 input sys_rst_n , //系统复位,低电平有效 //SD接口 input sd_miso , //SDSPI串行输入数据信号 output sd_clk , //SDSPI时钟信号 output sd_cs , //SDSPI片选信号 output sd_mosi , //SDSPI串行输出数据信号 //LED output [3:0] led //LED灯 ); //wire define wire clk_ref ; wire clk_ref_180deg ; wire rst_n ; wire locked ; wire wr_start_en ; //开始写SD数据信号 wire [31:0] wr_sec_addr ; //写数据扇区地址 wire [15:0] wr_data ; //写数据 wire rd_start_en ; //开始写SD数据信号 wire [31:0] rd_sec_addr ; //读数据扇区地址 wire error_flag ; //SD读写错误的标志 wire wr_busy ; //写数据忙信号 wire wr_req ; //写数据请求信号 wire rd_busy ; //读忙信号 wire rd_val_en ; //数据读取有效使能信号 wire [15:0] rd_val_data ; //读数据 wire sd_init_done ; //SD初始化完成信号 //***************************************************** //** main code //***************************************************** assign rst_n = sys_rst_n & locked; //锁相环 pll_clk u_pll_clk( .areset (1'b0 ), .inclk0 (sys_clk ), .c0 (clk_ref ), .c1 (clk_ref_180deg), .locked (locked ) ); //产生SD测试数据 data_gen u_data_gen( .clk (clk_ref), .rst_n (rst_n), .sd_init_done (sd_init_done), .wr_busy (wr_busy), .wr_req (wr_req), .wr_start_en (wr_start_en), .wr_sec_addr (wr_sec_addr), .wr_data (wr_data), .rd_val_en (rd_val_en), .rd_val_da
FPGA 读写SD音乐播放例程Verilog逻辑源码Quartus工程文件+文档说明,,FPGA型号Cyclone4E系列中的EP4CE6F17C8,Quartus版本17.1。 实验简介 在其他实验中我们已经完成了 SD 读写和音频模块的录音播放,本实验通过搜索 SD 中 WAV 音乐文件,然后送到音频模块播放,完成一个简单音乐播放器的功能。 2 实验原理 本实验一个关键是在没有文件系统的情况下,搜索 SD 每个扇区的内容,匹配出 WAV 文件, 这里有一个假设:假设每一个文件都是从一个扇区第一个字节开始而且文件是连续存储的,经过 大量实验,发现 FAT32 文件格式中的文件确实如此。 2.1 WAV 文件格式 大部分的文件都有文件头,WAV 也丌例外,我们通过分析 SD 一个扇区的前几个字节,判 断这个文件是否为 WAV 文件。 WAV 文件作为多媒体中使用的声波文件格式之一,它是以 RIFF 格式为标准的。RIFF 是英文 Resource Interchange File Format 的缩写,每个 WAV 文件的头四个字节便是“RIFF”,所以本实验 就简单的以每个扇区的前 4 个字节是否为“RIFF”判断该文件是否为 WAV 文件,紧接着 4 个字节 表示文件的大小,这样我们就可以确定要读取的数据量。WAV 文件头大小是 88 字节,在播放时 要把前 88 个字节的文件头去掉。 module top( input clk, input rst_n, input key1, input wm8731_bclk, //audio bit clock input wm8731_daclrc, //DAC sample rate left right clock output wm8731_dacdat, //DAC audio data output input wm8731_adclrc, //ADC sample rate left right clock input wm8731_adcdat, //ADC audio data input inout wm8731_scl, //I2C clock inout wm8731_sda, //I2C data output sd_ncs, //SD card chip select (SPI mode) output sd_dclk, //SD card clock output sd_mosi, //SD card controller data output input sd_miso, //SD card controller data input output [5:0] seg_sel, output [7:0] seg_data ); wire[9:0] lut_index; wire[31:0] lut_data; wire[3:0] state_code; wire[6:0] seg_data_0; //I2C master controller i2c_config i2c_config_m0( .rst (~rst_n ), .clk (clk ),
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值