基于Zynq FPGA的雷龙SD NAND存储芯片性能测试

文章目录

  • 前言
  • 一、SD NAND特征
    • 1.1 SD卡简介
    • 1.2 SD卡Block图
  • 二、SD卡样片
  • 三、Zynq测试平台搭建
    • 3.1 测试流程
    • 3.2 SOC搭建
  • 四、软件搭建
  • 五、测试结果
  • 六、总结

前言

随着嵌入式系统和物联网设备的快速发展,高效可靠的存储解决方案变得越来越重要。雷龙发展推出的SD NAND存储芯片,作为一种基于NAND FLASH和SD控制器集成的创新存储解决方案,以其紧凑的设计、强大的坏块管理以及优秀的纠错能力,在众多应用场景中展现出了显著的优势。为了验证这类存储芯片在实际应用中的表现,本文通过基于Xilinx Zynq 7020 FPGA平台的实验设置,对两种不同容量(4GB和32GB)的SD NAND芯片进行了详细的读写速度及稳定性测试。整个测试不仅包括了对SD卡的基本读写操作及其速度评估,还特别关注了在多次读写循环下的数据一致性和可靠性。通过这次详尽的测试,为开发者们提供有关如何有效利用SD NAND存储解决方案的第一手资料,也展示了此类存储介质在嵌入式项目中的潜在价值。

一、SD NAND特征

1.1 SD卡简介

雷龙公司推出的SD NAND存储解决方案,如CSNP4GCR01-AMW与CSNP32GCR01-AOW等型号,是专为满足现代嵌入式系统需求而设计的一种高效存储介质。这些SD NAND存储芯片结合了高性能NAND闪存与先进的SD控制器技术,能够在确保数据完整性的同时提供出色的读写速度。特别是它们具备强大的坏块管理能力和先进的纠错算法,即使在遭遇意外断电的情况下也能有效保护数据免受损失。

从技术规格来看,这些SD NAND产品兼容SD2.0标准,支持2线或4线接口配置,适用于各种不同的应用场景。它们的工作电压范围为2.7V至3.6V,这使得它们非常适合作为便携式设备或电池供电系统的理想选择。此外,这些芯片提供了两种工作模式以适应不同的性能需求:默认模式下,最大接口传输速度可达12.5MB/s;而在高速模式下,这一数值翻倍达到25MB/s,极大地提升了数据处理效率。值得注意的是,无论处于哪种模式,均需配合4条并行数据线来实现最佳性能表现。

雷龙的SD NAND存储方案还特别强调了环境适应性,其工作温度范围宽泛,从-40°C到+85°C,确保了即便是在极端条件下也能稳定运行。同时,这些芯片拥有极低的待机电流消耗(<250uA),有助于延长移动设备的电池寿命。安全性方面,除了基本的数据保护措施外,该系列产品还集成了符合SDMI最高安全标准的内容保护机制,支持通过CMD42命令实现SDNAND密码保护,增强了用户数据的安全性。另外,物理层面的写保护功能可以通过外部机械开关激活,而内部则同时提供了永久性和临时性的写保护选项,进一步增加了灵活性。

在通信协议的支持上,雷龙SD NAND芯片既支持SDIO读写也兼容SPI协议,这为开发者提供了更多样化的接入方式选择。尽管官方标称的最大读写速度可达25MB/s,但实际能达到的速度水平将取决于具体的MCU性能及所用接口类型等因素。对于那些对读写速率没有过高要求的应用场景而言,采用SPI协议往往是一个更为简便且成本效益更高的解决方案。无论是采取哪种协议,都必须严格遵循相关规范,以确保正确地建立文件系统并维持良好的数据交换质量。凭借其卓越的性能指标、丰富的功能特性以及广泛的应用潜力,雷龙SD NAND存储解决方案无疑成为了当今嵌入式领域内极具竞争力的产品之一。

1.2 SD卡Block图

image-20241107100521009

该SD卡封装为LGA-8;引脚分配与定义如下;在这里插入图片描述:

image-20241107100549001

二、SD卡样片

与样片同时寄来的还有转接板,转接板将LGA-8封装的芯片转接至SD卡封装,这样只需将转接板插入SD卡卡槽即可使用。

在这里插入图片描述:

image-20241107100621007

三、Zynq测试平台搭建

  • 测试平台为 Xilinx 的Zynq 7020 FPGA芯片;
  • 板卡:Digilent Zybo Z7
  • Vivado版本:2018.3
  • 文件系统:FATFS
  • SD卡接口:SD2.0

3.1 测试流程

本次测试主要针对4G和32G两个不同容量的SD卡,在Zynq FPGA上搭建SD卡读写回路,从而对SD卡读写速度进行测试,并检验读写一致性;

测试流程:

进入测试程序前,首先会对SD卡初始化并初始化建立FATFS文件系统,随后进入测试SD卡测试程序,在测试程序中,会写入一定大小的文件,然后对写入文件的时间进行测量,得到写入时间;然后再将写入的文件读出,测量获得读出时间,并将读出数据与写入数据相比较,检测是否读写出错。

通过写入时间、读出时间可计算得到写入速度、读出速度;将以上过程重复100次并打印报告。

image-20241107100646139

3.2 SOC搭建

硬件搭建框图如下,我们在本次系统中使用PS端的SDIO接口来驱动SD NAND芯片,并通过UART向PC打印报告;

PL端的硬件搭建也很简单,只需一个Timer定时器来做时间测量;

image-20241107100714090

我们直接使用Zybo板卡文件创建一个工程,工程会将Zybo具有的硬件资源配置好;

image-20241107100746929

首先点击setting->IP->Repository->+;添加Timer IP核的路径,Timer IP核会在工程中给出;

image-20241107100816796

点击Create Block Design创建BD工程

Create Block Design创建BD工程

在创建的过程中添加Zynq 内核;

SD NAND添加Zynq 内核

​ 由于我们使用了板卡文件,所以内核IP是配置好的,我们只需稍作修改即可,如果是其他板卡,则需要自行配置DDR等配置;

双击内核IP,点击Clock Configuration->PL Fabric Clocks,将FCLK_CLK0的时钟频率修改为100Mhz

  双击内核IP,点击Clock Configuration->PL Fabric Clocks,将FCLK_CLK0的时钟频率修改为100Mhz

添加TimerA IP;

 添加TimerA IP

依次点击上方的自动设计,完成SOC搭建;

SOC搭建

点击BD设计,并创建顶层文件

SD NAND的SOC搭建

生成比特流文件;

SD NAND的SOC搭建 比特流文件

​ 在生成比特流文件后,将其导入SDK;

点击Export->Export Hardware,导出硬件;然后点击Launch SDK打开SDK进行软件设计;

Export->Export Hardware,导出硬件Launch SDK打开SDK进行软件设计

四、软件搭建

在SDK中新建一个空白工程;

点击file -> new -> Application project;

SD NAND软件搭建

在新建的过程中创建一个main.c文件,并在里面编写测试程序如下:

在每次读写开始前,通过TimerA0_start()函数开始计时,在读写结束后可以通过TimerA0_stop()结束计时,从而测得消耗时间。

相应的Timer驱动函数在user/TimerA_user.c中定义;

#include "xparameters.h"    /* SDK generated parameters */
#include "xsdps.h"        /* SD device driver */
#include "xil_printf.h"
#include "ff.h"
#include "xil_cache.h"
#include "xplatform_info.h"
#include "time.h"
#include "../user/headfile.h"#define    PACK_LEN       32764static FIL fil;        /* File object */
static FATFS fatfs;static char FileName[32] = "Test.txt";
static char *SD_File;char DestinationAddress[PACK_LEN] ;char txt[1024];
char test_buffer[PACK_LEN];void TimerA0_init()
{TimerA_reset(TimerA0);//reset timerA deviceTimerA_Set_Clock_Division(TimerA0,100);//divide clock as 100000000/100 = 1MhzTimerA_Stop_Counter(TimerA0);//stop timerA
}void TimerA0_start()
{TimerA_SetAs_CONTINUS_Mode(TimerA0);
}void TimerA0_stop()
{TimerA_Stop_Counter(TimerA0);
}uint32 SDCard_test()
{uint8 Res;uint32 NumBytesRead;uint32 NumBytesWritten;uint32 BuffCnt;uint8 work[FF_MAX_SS];uint32 take_time=0;uint32 speed = 0;uint32 test_time = 0;uint32 w_t=0;uint32 r_t=0;float wsum = 0;float rsum = 0;TCHAR *Path = "0:/";for(int i=0;i<PACK_LEN;i++){test_buffer[i] = 'a';}Res = f_mount(&fatfs, Path, 0);if (Res != FR_OK) {return XST_FAILURE;}Res = f_mkfs(Path, FM_FAT32, 0, work, sizeof work);if (Res != FR_OK) {return XST_FAILURE;}SD_File = (char *)FileName;Res = f_open(&fil, SD_File, FA_CREATE_ALWAYS | FA_WRITE | FA_READ);if (Res) {return XST_FAILURE;}Res = f_lseek(&fil, 0);if (Res) {return XST_FAILURE;}while(1){TimerA_reset(TimerA0);TimerA0_start();Res = f_write(&fil, (const void*)test_buffer, PACK_LEN,&NumBytesWritten);TimerA0_stop();take_time = TimerA_Read_Counter_Register(TimerA0);w_t+=take_time;xil_printf("--------------------------------\n");xil_printf("take time:%d us\n",take_time);speed = PACK_LEN*(1000000/((float)(take_time)));sprintf(txt,"write speed:%.2f MB/s\n",(float)(speed)/1024/1024);wsum = wsum+speed;xil_printf(txt);xil_printf("--------------------------------\n");if (Res) {return XST_FAILURE;}Res = f_lseek(&fil, 0);if (Res) {return XST_FAILURE;}TimerA_reset(TimerA0);TimerA0_start();Res = f_read(&fil, (void*)DestinationAddress, PACK_LEN,&NumBytesRead);TimerA0_stop();take_time = TimerA_Read_Counter_Register(TimerA0);r_t+=take_time;xil_printf("--------------------------------\n");xil_printf("take time:%d us\n",take_time);speed = PACK_LEN*(1000000/((float)(take_time)));sprintf(txt,"read speed:%.2f MB/s\n",(float)(speed)/1024/1024);rsum = rsum+speed;xil_printf(txt);xil_printf("--------------------------------\n");if (Res) {return XST_FAILURE;}for(BuffCnt = 0; BuffCnt < PACK_LEN; BuffCnt++){if(test_buffer[BuffCnt] != DestinationAddress[BuffCnt]){xil_printf("%dno",BuffCnt);return XST_FAILURE;}}xil_printf("test num:%d data check right!\n",test_time+1);test_time++;if(test_time==100){sprintf(txt,"Total write: %.2f KB,Take time:%.2f ms, Write speed:%.2f MB/s\n",PACK_LEN*100/1024.0,w_t/100.0/1000.0,wsum/100/1024/1024);xil_printf(txt);sprintf(txt,"Total read: %.2f KB,Take time:%.2f ms, Read speed:%.2f MB/s\n",PACK_LEN*100/1024.0,r_t/100.0/1000.0,rsum/100/1024/1024);xil_printf(txt);Res = f_close(&fil);if (Res) {return XST_FAILURE;}return 0;}}}int main(void)
{TimerA0_init();SDCard_test();xil_printf("finish");return 0;
}

五、测试结果

经测试,两种型号的芯片读写速度如下图表所示。

其SD NAND的读写速度随着读写数据量的增加而增加,并且读速率大于写速率,这符合SD卡的特性;

对比两种型号SD NAND芯片,发现CSNP32GCR01-AOW型号具有更高的读写速度;

SD NAND的读写速度数据

SD NAND的写入速度数据SD NAND的读出速度数据

六、总结

在这篇文章中,介绍了对雷龙公司生产的两种型号的SD NAND存储芯片(CSNP4GCR01-AMW与CSNP32GCR01-AOW)进行的性能测试。这些SD NAND芯片基于NAND FLASH和SD控制器实现,提供了强大的坏块管理、纠错功能以及在意外断电情况下的数据安全保障。测试过程中,使用了Xilinx Zynq 7020 FPGA作为测试平台,通过对这两种不同容量(4GB和32GB)的SD NAND芯片进行读写速度测试,发现随着读写数据量的增加,读写速度也随之提高,并且读取速度普遍高于写入速度,这与SD卡的一般特性相符。值得注意的是,CSNP32GCR01-AOW型号表现出更高的读写速度。

测试结果显示,这两种型号的SD NAND芯片在正常读写操作下的表现令人满意,而且价格合理。此外,LGA-8封装形式使得这种存储解决方案非常适合无卡槽的嵌入式开发板设计,有助于简化硬件设计并减少所需空间。然而,在尝试探索这些芯片在信息安全领域的应用时遇到了限制,因为发现芯片内置了复位或初始化机制,这阻止了研究人员提取上电时可能存在的不确定性值,因此无法进一步研究SD NAND的物理不可克隆特性。

雷龙的SD NAND存储芯片展示出了良好的性能与性价比,特别是在嵌入式开发领域中展现了其独特优势。对于那些寻求可靠且紧凑型存储解决方案的开发者而言,这是一个值得考虑的选择。

贴上测试工程的链接: https://gitee.com/gewenjie_host/sd_-nand_-zynq700_test

免费申请 SD NAND 样品,可以去官网:http://www.longsto.com/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/465790.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【动态规划 数学】2745. 构造最长的新字符串|1607

本文涉及知识点 C动态规划 数学 LeetCode2745. 构造最长的新字符串 给你三个整数 x &#xff0c;y 和 z 。 这三个整数表示你有 x 个 “AA” 字符串&#xff0c;y 个 “BB” 字符串&#xff0c;和 z 个 “AB” 字符串。你需要选择这些字符串中的部分字符串&#xff08;可以全…

【Linux驱动开发】timer库下的jiffies时间戳和延时驱动编写

【Linux驱动开发】timer库下的jiffies时间戳和延时驱动编写 gitee地址&#xff1a; https://gitee.com/Mike_Zhou_Admin/Linux_Driver_Timestamp_Driver/更新以gitee为准 文章目录 timer库时间戳函数延时函数驱动代码应用测试附录&#xff1a;嵌入式Linux驱动开发基本步骤开发…

了解云计算工作负载保护的重要性及必要性

云计算de小白 云计算技术的快速发展使数据和应用程序安全成为一种关键需求&#xff0c;而不仅仅是一种偏好。随着越来越多的客户公司将业务迁移到云端&#xff0c;保护他们的云工作负载&#xff08;指所有部署的应用程序和服务&#xff09;变得越来越重要。云工作负载保护&…

C语言 循环高级

时间&#xff1a;2024.11.6 一、学习内容 1、无限循环 无限循环&#xff1a;循环永远停不下来 注意点&#xff1a;无限循环因为永远停不下来&#xff0c;所以下面不能再写其他的代码了 2、break 跳转控制语句&#xff1a; 在循环的过程中&#xff0c;跳到其他语句上执行 #…

易语言模拟真人动态生成鼠标滑动路径

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序&#xff0c;它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言&#xff0c;原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势&#xff1a; 模拟…

CSS学习之Grid网格布局基本概念、容器属性

网格布局 网格布局&#xff08;Grid&#xff09;是将网页划分成一个个网格单元&#xff0c;可任意组合不同的网格&#xff0c;轻松实现各种布局效果&#xff0c;也是目前CSS中最强大布局方案&#xff0c;比Flex更强大。 基本概念 容器和项目 当一个 HTML 元素将 display 属性…

聊一聊Elasticsearch的索引的分片分配机制

1、什么是分片分配 分片分配是由ES主节点将索引分片移动到ES集群中各个节点上的过程。 该过程尽量保证&#xff0c;同一个索引的分片尽量分配到更多的节点上&#xff0c;以此来达到读写索引的时候可以利用更多硬件资源的效果。 在分配过程当中&#xff0c;也不能将某个主分片…

springboot的增删改查商城小实践(b to c)

首先准备一张表&#xff0c;根据业务去设计表 订单编号是参与业务的&#xff0c;他那订单编号里面是有特殊意义的&#xff0c;比如说像什么一些年月日什么的&#xff0c;一些用户的ID都在那编号里面呢&#xff1f;不能拿这种东西当主件啊 根据数据量去决定数据类型 价格需要注意…

Ubuntu 安装 RTL8811cu 网卡驱动

一、支持的网卡 RTL8811AU、RTL8811CU、RTL8821AU、RTL8821CU 二、下载驱动 github&#xff1a;https://github.com/brektrou/rtl8821CU 直接下载zip源码即可 三、安装驱动 sudo su -i #切换到root用户 apt-get update #更新安装源 apt-get install -y dkms …

解锁炎症和肿瘤免疫治疗新靶点:TREM1&TREM2

前 言 TREM家族属于细胞表面受体&#xff0c;介导调控炎症反应&#xff0c;现已成为癌症、神经退行性疾病以及炎症性疾病等多种疾病最有潜力的药物靶点。截至2023年6月&#xff0c;有5项FDA注册的临床前或临床试验正在进行中&#xff0c;有3项是TREM2在阿尔茨海默症&#xff…

【Unity】Unity拖拽在Android设备有延迟和卡顿问题的解决

一、介绍 在制作Block类游戏时&#xff0c;其核心的逻辑就是拖拽方块放入到地图中&#xff0c;这里最先想到的就是Unity的拖拽接口IDragHandler,然后通过 IPointerDownHandler, IPointerUpHandler 这两个接口判断按下和松手&#xff0c;具体的实现逻辑就是下面 public void On…

Postman断言与依赖接口测试详解!

在接口测试中&#xff0c;断言是不可或缺的一环。它不仅能够自动判断业务逻辑的正确性&#xff0c;还能确保接口的实际功能实现符合预期。Postman作为一款强大的接口测试工具&#xff0c;不仅支持发送HTTP请求和接收响应&#xff0c;还提供了丰富的断言功能&#xff0c;帮助测试…

NewStar CTF 2024 misc WP

decompress 压缩包套娃&#xff0c;一直解到最后一层&#xff0c;将文件提取出来 提示给出了一个正则&#xff0c;按照正则爆破密码&#xff0c;一共五位&#xff0c;第四位是数字 ^([a-z]){3}\d[a-z]$ 一共就五位数&#xff0c;直接ARCHPR爆破&#xff0c;得到密码 xtr4m&…

鸿蒙开发案例:七巧板

【1】引言&#xff08;完整代码在最后面&#xff09; 本文介绍的拖动七巧板游戏是一个简单的益智游戏&#xff0c;用户可以通过拖动和旋转不同形状的七巧板块来完成拼图任务。整个游戏使用鸿蒙Next框架开发&#xff0c;利用其强大的UI构建能力和数据响应机制&#xff0c;实现了…

C++_STL_xx_番外01_关于STL的总结(常见容器的总结;关联式容器分类及特点;二叉树、二叉搜索树、AVL树(平衡二叉搜索树)、B树、红黑树)

文章目录 1. 常用容器总结2. 关联式容器分类3. 二叉树、二叉搜索树、AVL树、B树、红黑树 1. 常用容器总结 针对常用容器的一些总结&#xff1a; 2. 关联式容器分类 关联式容器分为两大类&#xff1a; 基于红黑树的set和map&#xff1b;基于hash表的unorder_set和unorder_ma…

Django目录结构最佳实践

Django项目目录结构 项目目录结构配置文件引用修改创建自定义子应用方法修改自定义注册目录从apps目录开始 项目目录结构 └── backend # 后端项目目录&#xff08;项目名称&#xff09;├── __init__.py├── logs # 项目日志目录├── manage.py #…

AnytimeCL:难度加大,支持任意持续学习场景的新方案 | ECCV‘24

来源&#xff1a;晓飞的算法工程笔记 公众号&#xff0c;转载请注明出处 论文: Anytime Continual Learning for Open Vocabulary Classification 论文地址&#xff1a;https://arxiv.org/abs/2409.08518论文代码&#xff1a;https://github.com/jessemelpolio/AnytimeCL 创新…

2020年美国总统大选数据分析与模型预测

数据集取自&#xff1a;2020年&#x1f1fa;&#x1f1f8;&#x1f1fa;&#x1f1f8;美国大选数据集 - Heywhale.com 前言 对2020年美国总统大选数据的深入分析&#xff0c;提供各州和县层面的投票情况及选民行为的可视化展示。数据预处理阶段将涉及对异常值的处理&#xff0…

工业以太网PLC无线网桥,解决用户布线难题!

工业以太网无线网桥 功能概述 本产品是工业以太网(Profinet、EtherNet/IP、ModbusTCP等)转无线设备,成对使用(一对一),出厂前已经配对好,用户不需要再配对,即插即用。适用于用户布线不方便的场景。使用方式简单,只需要把拨码开关设置好并上电即可工作,无需进行其它设置。支持P…

Android13 系统/用户证书安装相关分析总结(三) 增加安装系统证书的接口遇到的问题和坑

一、前言 接上回说到&#xff0c;修改了程序&#xff0c;增加了接口&#xff0c;却不知道有没有什么问题&#xff0c;于是心怀忐忑等了几天。果然过了几天&#xff0c;应用那边的小伙伴报过来了问题。用户证书安装没有问题&#xff0c;系统证书(新增的接口)还是出现了问题。调…