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

一、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;引脚分配与定义如下;在这里插入图片描述:

image-20241106234505040

二、SD 卡样片

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

在这里插入图片描述:

image-20241106234515418

三、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-20241106234559529

3.2 SOC 搭建

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

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

image-20241106234609128

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

image-20241106234649694

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

image-20241106234708383

点击 Create Block Design 创建 BD 工程

image-20241106234719321

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

image-20241106234728015

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

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

image-20241106234745270

添加 TimerA IP;

image-20241106235212326

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

image-20241106235221986

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

image-20241106235231159

生成比特流文件;

image-20241106235241703

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

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

image-20241106235309720

image-20241106235320866

四、软件搭建

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

点击 file -> new -> Application project;

image-20241106235332805

在新建的过程中创建一个 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 32764
static 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 封装更适合无卡槽的嵌入式开发板设计,在一定的应用领域有着简化硬件设计、减小硬件面积的功能。

官网体验

最后贴上测试工程的链接,还迎复现实验: https://gitee.com/gewenjie_host/sd_-nand_-zynq700_test

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

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

相关文章

小程序与服务器通信webSocket和UDPSocket

UDPSocket 官方文档链接UDPSocket webSocket 官方文档链接 WebSocket 任务 先用webSocket 测试成功后&#xff0c;由于WSS的问题最后决定用UDPSocket&#xff0c;两个都记录一下。 UDPSocket 项目里主要就使用了以下几个方法, 先用wx.createUDPSocket创建UDP Socket 实例&a…

HTMLCSS:爱上班的猫咪

这段HTML和CSS代码是一个SVG动画的示例&#xff0c;它描述了一个包含猫咪和笔记本电脑的复杂场景 HTML <div class"content"><div class"container"><svg id"bongo-cat" xmlns"http://www.w3.org/2000/svg" xmlns:x…

使用SearXNG-搭建个人搜索引擎(附国内可用Docker镜像源)

介绍 SearXNG是聚合了七十多种搜索服务的开源搜索工具。我们可以匿名浏览页面&#xff0c;不会被记录和追踪。作为开发者&#xff0c;SearXNG也提供了清晰的API接口以及完整的开发文档。 部署 我们可以很方便地使用Docker和Docker compose部署SearXNG。下面给出Docker部署Se…

基于前后端分离架构,SaaS云平台与私有云部署的智慧校园源码,java电子班牌源码

基于前后端分离架构&#xff0c;SaaS云平台与私有云部署的智慧校园源码&#xff0c;java电子班牌源码&#xff0c;自主研发&#xff0c;自主版权&#xff0c;上百个学校应用案例&#xff0c;支持二次开发。 在信息技术飞速发展的今天&#xff0c;教育领域也迎来了一场革命性的变…

java.lang.NoClassDefFoundError: kotlin/jvm/JvmInline

springboot项目&#xff0c;调用接口时&#xff0c;报这个错误&#xff0c;跟踪断点发现数据库也查询到了数据&#xff0c;就是在返回时报错了&#xff0c;后来一看是pom.xml中引入了 <dependency><groupId>com.fasterxml.jackson.module</groupId><artif…

yolov8涨点系列之替换幽灵卷积GhostConv

文章目录 核心思想主要步骤优势yolov8.yaml文件增加CBAMyolov8.yamlyolov8.yaml将Conv卷积替换成GhostConv 幽灵卷积&#xff08;Ghost Conv&#xff09;是一种新颖的卷积操作方法&#xff0c;旨在解决传统卷积神经网络中参数量和计算量过大的问题&#xff0c;尤其适用于资源受…

MongoDB Shell 基本命令(三)聚合管道

管道含义 类似Linux中的管道&#xff0c;前一个命令的输出作为后一个命令的输入。 显示网络连接、路由表和网络接口统计信息 netstat -ano -netstat:network statistics 网络统计 -a:显示所有连接和监听端口&#xff0c;包括所有活动的TCP和UDP连接。 -n:以数字形式显示地址…

C++重启/秋招已保底备战春招

C面向对象高级开发&#xff08;上&#xff09;学习笔记 第三节&#xff1a; 问题1&#xff1a;C中对构造函数使用初始列和函数体中赋值结果是一样的&#xff0c;但是为什么使用初始列的形式更好 解答&#xff1a;最重要的还是1和2&#xff0c;效率更高避免调用默认构造函数&…

云渲染怎么用?一片看懂云渲染渲染农场渲染100操作指南

就拿“渲染 100”云渲染来说吧&#xff0c;它的使用教程是这样的&#xff1a; 1.安装客户端 在渲染之前要准备好安装“渲染 100”云渲染客户端&#xff0c;注册个账号然后登录客户端。 您可以在浏览器里打开渲染 100 云渲染的官网&#xff1a;xuanran100.com/?ycode5858, 在…

私有化视频平台EasyCVR海康大华宇视视频平台视频诊断技术是如何实时监测视频质量的?

在现代视频监控系统中&#xff0c;确保视频流的质量和稳定性至关重要。随着技术的进步&#xff0c;视频诊断技术已经成为实时监测视频质量的关键工具。这种技术通过智能分析算法对视频流进行实时评估和处理&#xff0c;能够自动识别视频中的各种质量问题&#xff0c;并给出相应…

ECRS工时分析软件:工业工程优化利器,引领生产工序革新

在竞争日益激烈的工业领域&#xff0c;生产效率的提升成为企业持续发展的关键。为此&#xff0c;工业工程学中的程序分析原则应运而生&#xff0c;其中最为核心的便是ECRS四大原则——取消、合并、调整顺序和简化。这些原则为生产工序的优化提供了有力的指导&#xff0c;旨在消…

端侧小模型新星,SmolLM2 1.7B击败了Llama 3.2、Qwen 2.5

SmolLM2开源了&#xff1a;更快、更好、更便宜&#xff0c; 包含三个尺寸&#xff1a;135M、360M 和 1.7B。 端侧小型语言模型新星——SmolLM2 1.7B击败了Qwen 2.5 1.5B和Llama 3.2 1B&#xff1a; Apache 2.0许可 训练于11万亿个令牌 在FineWeb-Edu、DCLM、The Stack以及新的…

[LeetCode-45] 基于贪心算法的跳跃游戏 II-最少跳跃次数的求解(C语言版)

/* 题目出处&#xff1a;LeetCode 题目序号&#xff1a;45. 跳跃游戏 II 题目叙述&#xff1a;给定一个长度为 n 的整数数组 nums。初始位置为 nums[0]。每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转…

数据结构 —— 红黑树

目录 1. 初识红黑树 1.1 红黑树的概念 1.2 红⿊树的规则 1.3 红黑树如何确保最长路径不超过最短路径的2倍 1.4 红黑树的效率:O(logN) 2. 红黑树的实现 2.1 红黑树的基础结构框架 2.2 红黑树的插⼊ 2.2.1 情况1&#xff1a;变色 2.2.2 情况2&#xff1a;单旋变色 2.2…

第J9周:Inception v3算法实战与解析(pytorch版)

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营]中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊]** &#x1f4cc;本周任务&#xff1a;&#x1f4cc; 了解并学习InceptionV3相对与InceptionV1有哪些改进的地方 使用Inception完成天气…

什么是 AWS PrivateLink

您可以使用 Amazon VPC 定义虚拟私有云&#xff08;VPC&#xff09;&#xff0c;这是一个逻辑隔离虚拟网络。您可以在 VPC 中启动 AWS 资源。您可以允许 VPC 中的资源连接到该 VPC 外部的资源。例如&#xff0c;向 VPC 添加互联网网关以允许访问互联网&#xff0c;或添加 VPN 连…

vue2 -- el-form组件动态增减表单项及表单项验证

需求 在数据录入场景(如订单信息录入)中,可根据实际情况(如商品种类增加)动态添加表单项(如商品相关信息)。包含必填项验证和数据格式验证(如邮箱、电话格式),防止错误数据提交。 效果 代码一 <template><div>

旧衣回收小程序:提高回收效率,扩大服务范围

近年来&#xff0c;旧衣回收作为一种新兴回收模式&#xff0c;逐渐走入了大众的生活中&#xff0c;在回收市场中形成了新的商业模式&#xff0c;也为大众带来了新的创业选择。 随着社会生活的快速发展&#xff0c;人们的生活水平不断提高&#xff0c;为旧衣市场发展提供了基础…

电子电气架构 --- Trace 32(劳特巴赫)多核系统的调试

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所有人的看法和评价都是暂时的,只有自己的经历是伴随一生的,几乎所有的担忧和畏惧,都是来源于自己的想象,只有你真的去做了,才会发现有多快乐。…

使用C++和QT开发应用程序入门以及开发实例分享

目录 1、搭建开发环境&#xff08;VS2010和QT4.8.2&#xff09; 2、创建一个QT窗口 3、在QT窗口中添加子窗口 4、QT界面布局 5、QT信号&#xff08;SIGNAL&#xff09;和槽&#xff08;SLOT&#xff09; 6、最后 C软件异常排查从入门到精通系列教程&#xff08;专栏文章列…