SD卡读写_Verilog实现SD卡读写

SD卡读写——Verilog实现SD卡读写

本文主要介绍如何设计Verilog程序实现SD卡读写。现在的很多FPGA开发板中都预留了sd卡槽,常见的卡槽包括标准的SD卡以及TF卡两种,某些情况下,我们可能需要利用FPGA实现sd卡存储数据,针对这种需求,整理本篇博客内容供大家参考,共同学习。

SD卡相关知识介绍

目前常见的SD卡有两种形式,一种是标准的SD卡,另外一种是tf卡,无论标准的SD卡或者TF卡,其基本协议是相同的,因此对于程序设计来说,这两种类型的SD卡的读写方式是相同的。

SD卡引脚接口介绍

针对两种不同类型的SD卡,其引脚接口信号定义如下图所示:

标准SD卡:
标准SD卡外观
标准SD卡引脚接口信号介绍

TF卡:
TF卡外观
TF卡引脚信号介绍

对于上述的两种类型的SD卡,都支持两种操作模式,分别是SD模式和SPI模式,通过这两种模式都可以实现对SD卡的读写,本文主要介绍现在常用的SPI模式。而SD卡的引脚接口在不同的模式下分别表示不同的功能,具体方式如下表所示:
两种模式下SD卡引脚接口功能定义
因此,对于SPI模式,除电源和地信号外,我们只需要四个数据线分别是CLK、CS、MISO和MOSI,对应SD的接口分别是CLK、CS/DAT3、DAT0和CMD。

SD卡命令协议

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们在实际应用中,常用的一些重要的SD命令及其响应数据格式如下:
在这里插入图片描述

SD卡初始化流程

  1. 首先延时74个CLK(SPI时钟频率是25Mhz),等到SD卡内部操作完成;
  2. 片选CS低电平选中SD卡;
  3. 然后发送CMD0({8’h40, 8’h00, 8’h00, 8’h00, 8’h00, 8’h95} )命令,需要得到返回值0X01,进入Idle状态;
  4. 然后进入卡类型检验,为了检验卡的类型,首先发送只有V2.0版的SD卡才具有的命令CMD8({8’h48, 8’h00, 8’h00, 8’h01, 8’haa, 8’h87} ),然后检测返回值;
    返回值若是0X01,则表示此卡为V2.0卡,然后再发送循环命令CMD55({8’h77, 8’h00, 8’h00, 8’h00, 8’h00, 8’hff})+ACMD41({8’h69, 8’h40, 8’h00, 8’h00, 8’h00, 8’hff}),直到返回0x00,确定SD2.0卡初始化成功;然后再发送CMD58命令,接收返回的OCR 寄存器的数据,其中第31位用于判断V2.0的卡是否为SDHC类型(初始化成功后,也可以不验证是否为SDHC类型)。
    若返回值不为0X01,则进一步判断是V1.0卡还是MMC卡;先发送循环命令CMD55+ACMD41,如果返回0x00,则为V1.0卡并且初始化成功;
    否则考虑是MMC卡,再使用CMD1进行初始化,如果无返回错误,则表明是MMC卡并且初始化成功;否则表示是无法识别的卡。

从上面的初始化过程可以看出主要涉及到几个特殊的命令:CMD8、CMD55、ACMD41和CMD58。对于CMD55和ACMD41的讲解,有很多文章都有,不多解释,此复位命令的返回值和CMD1的返回值相同,成功复位时返回0X00;对于CMD58,其命令码格式是标准格式,其中数据填充0即可,CRC也可省略,只要最后加上停止位‘1’即可,不作详解;其返回值为R3类型,首先接收到一个字节应该为0X00,表示SD卡响应命令成功,然后接收4字节的OCR寄存器值;OCR寄存器的第30位(CCS)指示了卡的类型是否为SDHC,此位为1则为SDHC,为0则为SDSC;

SD卡的读操作:

在这里插入图片描述
其中,CMD17 指令的具体内容是 {8’h51,read_sec_i[31:24],read_sec_i[23:16],read_sec_i[15:8],read_sec_i[7:0],8’hff};sec_i是一个32bit的数据,表示的是读SD卡的扇区的地址。

SD卡的写操作:

在这里插入图片描述
在这里插入图片描述
其中,CMD24 指令的具体内容是 {8’h58,sec_i[31:24],sec_i[23:16],sec_i[15:8],sec_i[7:0],8’hff};sec_i是一个32bit的数据,表示的是写SD卡的扇区的地址。

  • 7
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FPGA读写SD卡Verilog设计逻辑Quartus工程源码文件,FPGA型号Cyclone4E系列中的EP4CE10F17C8,Quartus版本18.0。 module top_sd_rw( input sys_clk , //系统时钟 input sys_rst_n , //系统复位,低电平有效 //SD卡接口 input sd_miso , //SD卡SPI串行输入数据信号 output sd_clk , //SD卡SPI时钟信号 output sd_cs , //SD卡SPI片选信号 output sd_mosi , //SD卡SPI串行输出数据信号 //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
### 回答1: Verilog是一种硬件描述语言,用于设计和开发数字逻辑电路。在实现SD卡读写功能时,Verilog可以用来描述和设计SD卡控制器。 首先,SD卡Verilog的连接可以通过串行通信接口实现,如SPI(串行外设接口)或SDIO(SD输入输出接口)。这些接口需要根据SD卡规范进行配置和控制。在Verilog代码中,我们可以定义具体的接口逻辑和通信协议,以实现SD卡的数据交换。 在读取SD卡数据时,Verilog代码需要实现SD卡初始化、选择SD卡操作模式、发送读命令、接收数据等功能。具体步骤包括: 1. 初始化SD卡:发送初始化命令和参数,以确保SD卡处于可读取状态。 2. 选择操作模式:发送模式选择命令,如读取单块数据或连续读取模式。 3. 发送读命令:根据SD卡规范发送读命令,包括待读取数据的地址、块大小等信息。 4. 接收数据:设置接收缓冲区和计数器,从SD卡中读取数据并保存至内存或其他存储介质。 类似地,在写入SD卡数据时,Verilog代码需要实现SD卡初始化、选择操作模式、发送写命令、发送数据等功能。具体步骤包括: 1. 初始化SD卡:发送初始化命令和参数,以确保SD卡处于可写入状态。 2. 选择操作模式:发送模式选择命令,如写入单块数据或连续写入模式。 3. 发送写命令:根据SD卡规范发送写命令,包括待写入数据的地址、块大小等信息。 4. 发送数据:根据待写入的数据,将数据从存储介质(如内存)发送至SD卡。 使用Verilog实现SD卡读写功能需要仔细研究SD卡规范,并根据具体的需求和接口来设计和开发代码。还需要考虑和处理错误情况,如SD卡未插入、通信错误等。最终,通过正确实现Verilog代码,可以实现SD卡读写功能,从而实现SD卡的数据操作。 ### 回答2: Verilog可以用来实现SD卡读写功能。SD卡作为一种存储媒体,需要通过SPI(串行外设接口)进行数据交互。下面是使用Verilog实现SD卡读写的大致步骤: 1. 初始化SD卡:通过向SD卡发送初始化命令,设置卡片的通信参数和工作模式。 2. 发送读命令:首先,将待读取的扇区地址发送给SD卡;然后,向SD卡发送读指令。 3. 等待应答:SD卡将回应应答标志(ACK)。 4. 读取数据:连续读取512字节的数据,并将其保存到缓冲区中。 5. 继续读取:如果需要读取更多的扇区,可以重复步骤2到步骤4。 6. 发送写命令:与读命令类似,将待写入的扇区地址发送给SD卡,然后发送写指令。 7. 等待应答:SD卡将回应应答标志。 8. 写入数据:将待写入的512字节数据发送给SD卡。 9. 写完成:SD卡完成数据的写入后,将回应应答标志。 10. 继续写入:如果需要写入更多的扇区,可以重复步骤6到步骤9。 通过以上步骤,我们可以利用Verilog实现SD卡读写功能。需要注意的是,SPI通信的时序是非常关键的,需要确保时钟和数据的同步性,以及正确处理应答标志等。此外,还需要对错误和异常情况进行处理,保证数据的完整性和可靠性。 总之,通过Verilog语言的硬件描述能力,我们可以实现SD卡读写的功能,并应用于各种硬件平台和嵌入式系统中。 ### 回答3: Verilog是一种硬件描述语言,适用于数字电路设计和硬件描述。要在Verilog实现SD卡读写功能,涉及到SD卡通信协议和文件系统的具体实现。 首先,需要了解SD卡的通信协议。SD卡使用SPI或SDIO两种接口标准进行数据传输。对于SPI接口,可以通过Verilog实现SPI控制器来与SD卡进行通信。SPI控制器的功能包括发送和接收命令、读取和写入数据以及处理错误报告等。 其次,还需要实现SD卡的文件系统。SD卡上的文件系统通常使用FAT32格式,需要在Verilog实现相应的文件系统算法和数据结构。这涉及到文件的创建、读取、写入和删除等操作。 在Verilog实现SD卡读写功能时,需要进行以下步骤: 1. 设计并实现SPI控制器,包括发送和接收命令、读取和写入数据等操作; 2. 解析SD卡的通信协议,实现命令的发送和接收; 3. 设计并实现SD卡的文件系统,包括FAT表的解析、文件的读写操作等; 4. 集成SPI控制器和文件系统,实现SD卡读写功能; 5. 进行功能验证和测试。 这只是大致的实现思路,具体实现细节会更加复杂。Verilog实现SD卡读写功能需要充分理解SD卡的通信协议和文件系统,并具备硬件描述语言的能力。同时,还需要借助相应的开发工具和环境,如仿真工具和开发板,来验证和测试实现的正确性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值