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

文章目录

  • SD NAND特征
    • SD卡简介
    • 1.2 SD卡块图
  • SD卡样片
  • Zynq测试平台搭建
    • 测试流程
    • SOC搭建
    • 软件搭建
  • 测试结果
  • 总结

SD NAND特征

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最高安全标准

密码保护(密码保护)

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

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

应用程序特定命令

舒适擦除机制

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

1.2 SD卡块图

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

SD卡样片

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

在这里插入图片描述:
在这里插入图片描述

Zynq测试平台搭建

测试平台为 Xilinx 的Zynq 7020 FPGA芯片;

板卡:迪吉伦特Z7

Vivado版本:2018.3

文件系统:FATFS

SD卡接口:SD2.0

测试流程

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

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

通过写入时间、读出时间可计算得到写入速度、读出速度;将以上过程重复100次并打印报告。
在这里插入图片描述

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中新建一个空白工程;

点击文件—>新建—>应用项目;
在这里插入图片描述

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

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

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

#include "xparameters.h" /* SDK生成的参数 */#include "xsdps.h" /* SD 设备驱动程序 */#include "xil_printf.h"#包含 "ff.h"#include "xil_cache.h"#include "xplatform_info.h"#包含 "time.h"#include "../user/headfile.h"#定义 PACK_LEN 32764静态 FIL fil; /* 文件对象 */静态FATFS FATFs;静态字符 FileName[32] = "Test.txt";静态字符 *SD_File;char目的地地址[PACK_LEN]char txt[1024];字符测试缓冲区[PACK_LEN];虚空 TimerA0_init(){TimerA_reset(TimerA0);//重新设置TimerA设备TimerA_Set_Clock_Division(TimerA0,100);//将时钟分割为 100000000/100 = 1MhzTimerA_停止计数器(TimerA0);//停止计时器A}无TimerA0_start(){TimerA_设置为连续模式(TimerA0);}无TimerA0_停止(){TimerA_停止计时器(TimerA0);}uint32 SDCard_test(){uint8 Res;uint32 NumBytesRead;uint32NumBytesWritten;uint32 BuffCnt;uint8 工作[FF_MAX_SS];uint32 占用时间=0;uint32速度=0;uint32测试时间=0;uint32 w_t=0;uint32 r_t=0float wsum = 0float rsum=0;TCHAR *Path = "0:/"forint i=0;<PACK_LEN;i++{test_buffer[i] = 'a'}Res = f_mount(&fatfs, Path, 0);如果(Res!= FR_OK) {返回XST失败;}Res = f_mkfs(路径,FM_FAT32, 0, 工作,工作大小);如果(Res!= FR_OK) {返回XST失败;}SD_File =char *) 文件名;Res = f_open(&fil, SD_File, FA_始终生成 | FA_写入 | FA_读取);如果(Res) {返回XST失败;}Res = f_lseek(&fil, 0);如果(Res) {返回XST失败;}同时(1{TimerA_重置(TimerA0);TimerA0_开始();Res = f_write(&fil, (const void*) test_buffer, PACK_LEN,&写入字节数);TimerA0_停止();take_time = TimerA_Read_Counter_Register(TimerA0);w_t+=需要时间;xil_printf("--------------------------------\n");xil_printf("花时间:%d 我们\n",抽时间);speed = PACK_LEN*1000000/(浮动)(占用时间)));sprintf(txt,"写入速度:%2f MB/s\n",(浮动)(速度)/1024/1024);wsum = wsum + speed;xil_printf(txt);xil_printf("--------------------------------\n");如果(Res) {返回XST失败;}Res = f_lseek(&fil, 0);如果(Res) {返回XST失败;}TimerA_重置(TimerA0);TimerA0_开始();Res = f_read(&fil, (void*)目的地地址, PACK_LEN,&NumBytesRead) 的 NumBytesRead)TimerA0_停止();take_time = TimerA_Read_Counter_Register(TimerA0);r_t+=需要时间;xil_printf("--------------------------------\n");xil_printf("花时间:%d 我们\n",抽时间);speed = PACK_LEN*1000000/(浮动)(占用时间)));sprintf(txt,"读取速度:%2f MB/s\n",(浮动)(速度)/1024/1024);rsum = rsum + speed;xil_printf(txt);xil_printf("--------------------------------\n");如果(Res) {返回XST失败;}for(BuffCnt=0;BuffCnt PACK_LEN;BuffCNT++{如果(test_buffer[BuffCnt]= DestinationAddress[BuffCnt]{xil_printf("%dna",BuffCnt);返回XST失败;}}xil_printf("测试编号:%d数据检查正确!\n",测试时间+1);测试时间++;如果(测试时间==100{sprintf(txt,"总写入量:%2f KB,占用时间:%2f毫秒,写入速度:%2f MB/s\n",PACK_LEN*100/1024.0,w_t/100.0/1000.0,wsum/100/1024/1024);xil_printf(txt);sprintf(txt,"总读取量:%2f KB,占用时间:%2f毫秒,读取速度:%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);如果(Res) {返回XST失败;}返回0}}}int main(空){TimerA0_init();SDCard_test();xil_printf("完成");返回0}

测试结果

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

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

对比两种型号SD NAND芯片,发现CSNP32GCR01-AOW型号具有更高的读写速度;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结

本来打算拿这些样片去试试信息安全领域是否有所应用,但发现其似乎内置了复位或初始化,导致无法提取上电时的不确定值,故无法提取该SD NAND的物理不可克隆特性,所以这方面的测试无法进行;

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

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

官网链接:http://www.longsto.com/

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

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

相关文章

在Linux上部署(MySQL Redis Elasticsearch等)各类软件

实战章节&#xff1a;在Linux上部署各类软件 前言 为什么学习各类软件在Linux上的部署 在前面&#xff0c;我们学习了许多的Linux命令和高级技巧&#xff0c;这些知识点比较零散&#xff0c;同学们跟随着课程的内容进行练习虽然可以基础掌握这些命令和技巧的使用&#xff0c…

电脑不显示wifi列表怎么办?电脑不显示WiF列表的解决办法

有用户会遇到电脑总是不显示wifi列表的问题&#xff0c;但是不知道要怎么解决。随着无线网络的普及和使用&#xff0c;电脑无法显示WiFi列表的问题有时会让人感到困扰。电脑不显示WiFi列表是很常见的问题&#xff0c;但这并不意味着你无法连接到网络。不用担心&#xff0c;这个…

Android中Activity启动的模式

在 Android 开发中&#xff0c;Activity 的启动模式&#xff08;Launch Mode&#xff09;定义了当启动一个 Activity 时&#xff0c;系统会如何处理它的实例。不同的启动模式可以影响 Activity 在任务栈中的管理方式&#xff0c;对用户的使用体验产生直接影响。下面详细介绍四种…

Xshell 7 偏好设置

1 Xshell7 工具——更改用户数据文件夹 就是此电脑目录下的文档 该目录下的7 Xshell下的 applog ColorScheme Files 配色方案文件目录 HighlightSet Files 突出显示集目录 Logs 日志 QuickButton Files 快速命令集 Scripts 脚本文件 Sessions 会话文件 会话文件目录就…

丹摩征文活动 | 丹摩智算:大数据治理的智慧引擎与实践探索

丹摩DAMODEL&#xff5c;让AI开发更简单&#xff01;算力租赁上丹摩&#xff01; 目录 一、引言 二、大数据治理的挑战与重要性 &#xff08;一&#xff09;数据质量问题 &#xff08;二&#xff09;数据安全威胁 &#xff08;三&#xff09;数据管理复杂性 三、丹摩智算…

企业级容器技术docker之一键生成 Docker Compose

案例: 一键生成 Docker Compose 利用网站将docker 命令自动生成 Docker Compse Composerizehttps://www.composerize.com/ 基于docker-compose编译多服务镜像并启动容器案例 输入docker命令就可以自动转换为 docker-compose的格式

C++《stack与queue》

在之前的章节我们学习了C当中string、vector和list三种容器并且试着模拟实现这三种容器&#xff0c;那么接下来在本篇当中我们将STL当中的stack和queue&#xff0c;并且在学习stack和queue的使用之后和之前一样还会试着模拟实现stck和queue。由于stck和queue的模拟实现较为简单…

【Linux】常用命令(2.6万字汇总)

文章目录 Linux常用命令汇总1. 基础知识1.1. Linux系统命令行的含义1.2. 命令的组成 2. 基础知识2.1. 关闭系统2.2. 关闭重启2.3. 帮助命令&#xff08;help&#xff09;2.4. 命令说明书&#xff08;man&#xff09;2.5. 切换用户&#xff08;su&#xff09;2.6.历史指令 3.目录…

Selenium+Pytest自动化测试框架 ------ 禅道实战

前言 有人问我登录携带登录的测试框架该怎么处理&#xff0c;今天就对框架做一点小升级吧&#xff0c;加入登录的测试功能。 选用的测试网址为我电脑本地搭建的禅道 更改了以下的一些文件,框架为原文章框架主体 conftest.py更改 conftest.py #!/usr/bin/env python3 # -*…

java---认识异常(详解)

还有大家来到权权的博客~欢迎大家对我的博客提出意见哦&#xff0c;有错误会及时改进的~点击进入我的博客主页 目录 一、异常的概念及体系结构1.1 异常的概念1.2 异常的体系结构1.3异常的分类 二、异常的处理2.1防御式编程2.2 异常的抛出2.3 异常的捕获2.3.1异常声明throws2.3.…

鸿蒙多线程开发——并发模型对比(Actor与内存共享)

1、概 述 并发是指在同一时间段内&#xff0c;能够处理多个任务的能力。为了提升应用的响应速度与帧率&#xff0c;以及防止耗时任务对主线程的干扰&#xff0c;HarmonyOS系统提供了异步并发和多线程并发两种处理策略。 异步并发&#xff1a;指异步代码在执行到一定程度后会被…

Axure是什么软件?全方位解读助力设计入门

在产品设计和开发领域&#xff0c;Axure是一款大名鼎鼎且功能强大的软件&#xff0c;它为专业人士和团队提供了卓越的设计支持&#xff0c;帮助他们将创意转化为实际可操作的产品原型。 一、Axure 的基本介绍 Axure是一款专业的原型设计工具&#xff0c;主要用于创建交互式的…

客户手机号收集小程序有什么用

客户手机号收集小程序具有多方面的重要作用&#xff0c;主要体现在以下几个领域&#xff1a; 商业营销与客户关系管理 精准营销&#xff1a;通过收集客户手机号&#xff0c;企业能够依据客户的消费行为、偏好等信息&#xff0c;进行精准的个性化营销。例如&#xff0c;电商企业…

Spring Boot集成SQL Server快速入门Demo

1.什么是SQL Server&#xff1f; SQL Server是由Microsoft开发和推广的以客户/服务器&#xff08;c/s&#xff09;模式访问、使用Transact-SQL语言的关系数据库管理系统&#xff08;DBMS&#xff09;&#xff0c;它最初是由Microsoft、Sybase和Ashton-Tate三家公司共同开发的&…

[CKS] Create/Read/Mount a Secret in K8S

最近准备花一周的时间准备CKS考试&#xff0c;在准备考试中发现有一个题目关于读取、创建以及挂载secret的题目。 ​ 专栏其他文章: [CKS] Create/Read/Mount a Secret in K8S-CSDN博客[CKS] Audit Log Policy-CSDN博客 -[CKS] 利用falco进行容器日志捕捉和安全监控-CSDN博客[C…

深入理解Java虚拟机:你真的了解JVM吗?

Java虚拟机(JVM) 是 Java 技术的核心,它帮助 Java 实现了一次编译,到处运行的梦想。然而,你真的理解 JVM 的工作原理吗?今天,我们就从 JVM 的内部架构、垃圾回收机制、性能调优等角度,深入探讨这个“神秘黑盒”。 1. JVM 的基本架构:探索虚拟机内部 JVM 是运行 Java …

大模型就业收入高吗?大模型入门到精通,收藏这篇就够了

目前&#xff0c;已经可以说人工智能&#xff08;AI&#xff09;是推动社会进步和产业升级的重要力量。 其中&#xff0c;AI大模型作为人工智能领域的核心技术之一&#xff0c;正引领着新一轮的技术革命。 2024年&#xff0c;AI大模型开发工程师无疑成为了IT行业中最炙手可热…

el-table 纵向垂直表头处理

项目中表格展示会遇到需要纵向垂直表头情况&#xff0c;下面&#xff0c;我们基于el-table组件来实现这种表格。 以下是这次需要用到的数据表格&#xff0c;已知左侧违章名称是固定的&#xff0c;而月份是不固定的&#xff0c;在后端返回数据格式已确定的情况下&#xff0c;需…

leetcode day10 动态规划篇 64+139

64 最小路径和 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 m grid.lengthn grid[i].length1 < m, n < 2000 < grid[i][j]…

Flutter 小技巧之 Shader 实现酷炫的粒子动画

在之前的《不一样的思路实现炫酷 3D 翻页折叠动画》我们其实介绍过&#xff1a;如何使用 Shader 去实现一个 3D 的翻页效果&#xff0c;具体就是使用 Flutter 在 3.7 开始提供 Fragment Shader API &#xff0c;因为每个像素都会过 Fragment Shader &#xff0c;所以我们可以通…