【Zynq FPGA】基于 Zynq FPGA 的雷龙 SD NAND 测试

对于芯片正常读写的测试结果,还是很让人满意的,芯片的价格也很合理。并且LGA-8封装更适合无卡槽的嵌入式开发板设计,在一定的应用领域有着简化硬件设计、减小硬件面积的功能。贴上测试工程的链接,还迎复现实验: https://gitee.com/gewenjie_host/sd_-nand_-zynq700_t

目录

一、SD NAND特征

二、SD卡样片

三、Zynq测试平台搭建

四、软件搭建

五、测试结果

六、总结


一、SD NAND特征

1.1 SD卡简介

  雷龙的SD NAND有很多型号,在测试中使用的是CSNP4GCR01-AMW与CSNP32GCR01-AOW。芯片是基于NAND FLASH和 SD控制器实现的SD卡。具有强大的坏块管理和纠错功能,并且在意外掉电的情况下同样能保证数据的安全。

  其特点如下:

接口支持SD2.0 2线或4线;

电压支持:2.7V-3.6V;

默认模式:可变时钟速率0 - 25MHz,高达12.5 MB/s的接口速度(使用4条并行数据线)

高速模式:可变时钟速率0 - 50MHz,高达25 MB/s的接口速度(使用4条并行数据线)

工作温度:-40°C ~ +85°C

存储温度:-55°C ~ +125°C

待机电流小于250uA

修正内存字段错误;

内容保护机制——符合SDMI最高安全标准

SDNAND密码保护(CMD42 - LOCK_UNLOCK)

采用机械开关的写保护功能

内置写保护功能(永久和临时)

应用程序特定命令

舒适擦除机制

  该SD卡支持SDIO读写和SPI读写,最高读写速度可达25MB/s,实际读写速度要结合MCU和接口情况实测获得。通常在简单嵌入式系统并对读写速度要求不高的情况下,会使用SPI协议进行读写。但不管使用SDIO还是SPI都需要符合相关的协议规范,才能建立相应的文件系统;

1.2 SD卡Block图

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

二、SD卡样片

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

在这里插入图片描述:

三、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次并打印报告。

3.2 SOC搭建

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

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

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

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

点击Create Block Design创建BD工程

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

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

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

 添加TimerA IP;

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

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

生成比特流文件;

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

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

四、软件搭建

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

  点击file -> new -> Application project;

在新建的过程中创建一个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的物理不可克隆特性,所以这方面的测试无法进行;

  对于芯片正常读写的测试结果,还是很让人满意的,芯片的价格也很合理。并且LGA-8封装更适合无卡槽的嵌入式开发板设计,在一定的应用领域有着简化硬件设计、减小硬件面积的功能。

  最后贴上测试工程的链接,还迎复现实验: SD_Nand_Zynq700_test: SD Nand SOC test

————————————————

【本文参考自CSDN,作者:PPRAM】

  亲爱的卡友们,如果看完文章之后还是有疑惑或不懂的地方,请联系,自己去理解或猜答案是件很累的事,请把最麻烦的事情交给我们来处理,术业有专攻,闻道有先后,深圳市雷龙发展专注存储行业13年,专业提供小容量存储解决方案。

SD NAND-贴片式TF卡-贴片式SD卡-免费样品包邮-【雷龙发展】 - SD NAND,贴片式TF卡,贴片式SD卡,SPI NAND, PSLC NAND,存储芯片,闪存芯片icon-default.png?t=O83Ahttps://www.longsto.com/

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【PyTorch][chapter31][transformer-5] MQA,CQA, GQA

前言&#xff1a; Trans 翻译 《Variants of Multi-head attention: Multi-query (MQA) and Grouped-query attention (GQA) 为例兼顾性能,和模型的效率Google 又陆续提出了三种注意力架构. 当一个模型训练过度时&#xff0c;它会过度拟合或记忆训练数据&#xff0c;从而降低…

数据结构之排序--选择排序详解

选择排序 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的数据元素排完 。 直接选择排序: 在元素集合 array[i]--array[n-1] 中选择关键码最大 ( 小 ) 的数据元素 若它不是这组元…

spring组件介绍

1. Spring Core&#xff08;Spring核心&#xff09;&#xff1a; • BeanFactory&#xff1a;Spring IoC容器的基础接口&#xff0c;提供了配置框架和基本的功能&#xff0c;用于管理任何类型的对象。 • ApplicationContext&#xff1a;BeanFactory的子接口&#xff0c;提供了…

软件测试基础:单元测试与集成测试

单元测试的重要性 单元测试是软件开发过程中的必要步骤。它通过针对软件的最小可测试单元进行测试&#xff0c;可以及早发现代码中的逻辑错误和缺陷。根据统计数据显示&#xff0c;单元测试可以在软件开发初期就发现约70%的错误&#xff0c;从而减少了后期修改的成本和时间消耗…

sql专题 之 常用命令

文章目录 查询基础语法查询全表查询选择查询&#xff1a;常量和运算&#xff1a; 条件查询where运算符&#xff1a;、 !、<、>空值&#xff1a;null模糊查询&#xff1a;like逻辑运算&#xff1a;and or not 去重&#xff1a;distinct排序&#xff1a;order by截断和偏移…

LocalSend:开源跨平台文件传输工具,让设备互通无阻

在现代社会中&#xff0c;文件共享和设备之间的互联互通已经成为日常生活中不可或缺的一部分。无论是在工作中分享文档&#xff0c;还是在朋友间传输照片和视频&#xff0c;快速而便捷的文件传输工具都显得尤为重要。通常情况下&#xff0c;我们依赖互联网或蓝牙进行文件传输&a…

解决 Vue3、Vite 和 TypeScript 开发环境下跨域的问题,实现前后端数据传递

引言 本文介绍如何在开发环境下解决 Vite 前端&#xff08;端口 3000&#xff09;和后端&#xff08;端口 80&#xff09;之间的跨域问题&#xff1a; 在开发环境中&#xff0c;前端使用的 Vite 端口与后端端口不一致&#xff0c;会产生跨域错误提示&#xff1a; Access to X…

C/C++/PYTHON 改变 console terminal cmd 字体输出颜色

C代码 #include <stdio.h>// 定义一些常用颜色的转义序列 #define RED "\x1b[31m" #define GREEN "\x1b[32m" #define YELLOW "\x1b[33m" #define BLUE "\x1b[34m" #define RESET "\x1b[0m"int main() {// 在控制台输…

android studio 更改gradle版本方法(备忘)

如果出现类似以下&#xff1a; Your build is currently configured to use Java 17.0.11 and Gradle 6.1.1. 或者类似&#xff1a; Failed to calculate the value of task ‘:app:compileDebugJavaWithJavac‘ property ‘options.generatedSo 消息时需要修改gradle版本&…

游戏引擎学习第一天

视频参考: https://www.bilibili.com/video/BV1zGDCYHErA/ 创建一个保存项目的路径 VS的安装略过&#xff0c;个人自行百度 1. vs 创建第一个CMAKE的窗口项目 game.cpp 修改如下的代码 到https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-winmain 去…

基于Spring Boot的养老保险管理系统的设计与实现,LW+源码+讲解

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统养老保险管理系统信息管理难度大&#xff0c;容错率低&a…

【Linux-进程间通信】了解信号量 + 共享内存 + 消息队列的应用

信号量&#xff08;了解&#xff09; 1.概念理论渗透 1.多个执行流&#xff08;进程&#xff09;&#xff0c;能看到的同一份资源&#xff1a;共享资源 2.被保护起来的资源-----临界资源---同步和互斥----用互斥的方式保护共享资源----临界资源 3.互斥&#xff1a;任何时刻…

Normal-GS: 3D Gaussian Splatting with Normal-Involved Rendering 论文解读

看这篇论文之前可以看一下Ref-NeRF&#xff1a;https://arxiv.org/pdf/2112.03907 目录 ​编辑 一、概述 二、相关工作 1、辐射场 2、3DGS在几何和外观上的应用 三、Normal-GS 1、3DGS 2、引入法线的策略 3、训练过程 4、损失函数 四、实验 1、渲染质量的量化对比实…

【Linux探索学习】第十弹——Linux工具篇(五):详解Linux 中 Git 工具的使用与相关知识点

Linux学习笔记&#xff1a;https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言&#xff1a; Git 是一个分布式版本控制系统&#xff0c;广泛应用于软件开发中。它能够有效地管理项目的源代码&#xff0c;支持多种工作流&#xff0c;帮…

【系统文档】系统安全保障措施,安全运营保障,系统应急预案,系统验收相关资料(word原件)

一、身份鉴别 二、访问控制 三、通信完整性、保密性 四、抗抵赖 五、数据完整性 六、数据保密性 七、应用安全支撑系统设计 软件资料获取及全资料学习获取&#xff1a;本文末个人名片或进主页。

Windows Server修改 SID 操作说明

操作场景 Windows操作系统对计算机和用户的识别是通过安全标识符&#xff08;SID&#xff09;进行区分。由于基于同一镜像生产的云服务器实例 SID 相同&#xff0c;会引起无法入域的问题。如果您需要搭建 Windows 域环境&#xff0c;则需要通过修改 SID 以达到入域的目的。 本…

Java项目实战II基于Spring Boot的疗养院管理系统设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着人口老…

Canny边缘检测中Hysteresis Thresholding(滞后阈值)名字的由来

Hysteresis Thresholding直译是滞后阈值。注意区分hysteresis、heuristic、hypothesis。 Hysteresis&#xff1a;在物理学中指滞后现象。 Canny边缘检测中滞后阈值这个名字来源于物理学中的滞后现象。通过设置两个不同的阈值来决定哪些像素属于边缘。这两个阈值分别是高阈值&…

[ Linux 命令基础 6 ] Linux 命令详解-权限和用户管理命令

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

# ubuntu创建新用户和它的家目录

ubuntu创建新用户和它的家目录 一、使用 useradd命令创建新用户和它的家目录&#xff1a; 1、命令如下&#xff1a; #sudo useradd -r -m -s /bin/bash userName #如&#xff1a;sudo useradd -r -m -s /bin/bash zhangsan2、命令参数解释 -r : 建立系统账号。 -m : 自动建…