当前位置: 首页 > news >正文

基于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

添加 TimerA IP;

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

点击 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

相关文章:

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

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

AOSP沙盒android 11

这里介绍一下aosp装系统 什么是aosp AOSP&#xff08;Android Open Source Project&#xff09;是Android操作系统的开源版本。 它由Google主导&#xff0c;提供了Android的源代码和相关工具&#xff0c;供开发者使用和修改。 AOSP包含了Android的核心组件和API&#xff0c;使…...

【JWT】Asp.Net Core中JWT刷新Token解决方案

Asp.Net Core中JWT刷新Token解决方案 前言方案一:当我们操作某个需要token作为请求头的接口时,返回的数据错误error.response.status === 401,说明我们的token已经过期了。方案二:实现用户无感知的刷新token值,我们希望当响应返回的数据是401身份过期时,响应阻拦器自动帮我…...

AJ-Report:一款开源且非常强大的数据可视化大屏和报表工具

嗨&#xff0c;大家好&#xff0c;我是小华同学&#xff0c;关注我们获得“最新、最全、最优质”开源项目和工作学习方法 AJ-Report是一个基于Java的开源报表工具&#xff0c;它集成了ECharts、Ant Design Vue等前端技术&#xff0c;致力于为企业提供一站式的数据可视化解决方案…...

stm32不小心把SWD和JTAG都给关了,程序下载不进去,怎么办?

因为想用STM32F103的PA15引脚&#xff0c;调试程序的时候不小心把SWD和JTAD接口都给关了&#xff0c;先看下罪魁祸首 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//关掉JTAG&#xff0c;不关SWGPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);//关掉SW&am…...

【UE5】在材质中实现球形法线技术,常用于改善植物等表面的渲染效果

在材质中实现球形法线&#xff0c;这种技术常用于植被渲染等场景。通过应用球形法线可以显著提升植物再低几何体情况下的光照效果。 三二一上截图&#xff01; 当然也可以用于任何你希望模型圆润的地方&#xff0c;下图中做了一个Cube倒角...

【MATLAB源码-第210期】基于matlab的OFDM电力线系统仿真,不同梳状导频间隔对比。三种信道估计,三种插值误码率对比

操作环境&#xff1a; MATLAB 2022a 1、算法描述 OFDM电力线通信系统&#xff08;PLC&#xff09;是一种通过电力线传输数据的通信技术&#xff0c;利用了OFDM&#xff08;Orthogonal Frequency Division Multiplexing&#xff0c;正交频分复用&#xff09;技术的优势来提高…...

基于SpringBoot的城镇保障性住房管理策略

3系统分析 3.1可行性分析 通过对本城镇保障性住房管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本城镇保障性住房管理系统采用SSM框架&#xff0c;JA…...

支持高性能结构化数据提取的 Embedding 模型——NuExtract-v1.5

NuExtract 是一个用户友好型模型&#xff0c;设计用于从长文档中提取信息。它可以处理长达 20,000 个标记的输入&#xff0c;是合同、报告和其他商业通信的理想选择。NuExtract 的与众不同之处在于它能够处理和理解文档的整个上下文。这意味着它可以捕捉到可能分散在长文本不同…...

【C#】设计一个选购计算机配置的应用程序

文章目录 1. 创建新的 Windows Forms 应用程序项目2. 设计界面2.1 添加控件和设置属性 3. 编写事件处理代码4. 运行和测试应用程序 1. 创建新的 Windows Forms 应用程序项目 打开 Visual Studio。选择“创建新项目”。在项目类型中选择“Windows Forms 应用程序”&#xff08;…...

solo博客源码使用idea编译运行

solo博客源码使用idea编译运行 solo博客开源地址本地运行IDEA 编译执行默认直接编译jar 包编译 solo博客开源地址 项目地址&#xff1a;GitHub - 88250/solo: &#x1f3b8; B3log 分布式社区的 Java 博客端节点系统&#xff0c;欢迎加入下一代社区网络。B3log distributed co…...

VBA07-方法

一、方法的定义 方法指对象所能执行的动作&#xff0c;它是一个动词。 二、方法的表达方式 三、关于工作簿的方法操作 3-1、新增一个工作簿 示例1&#xff1a; 此时&#xff0c;新增的工作簿的名字是系统默认的。 示例2&#xff1a; 【注意】&#xff1a; 当你尝试将工作簿…...

spring boot 统一异常处理

在 Spring Boot 应用中实现统一异常处理是非常重要的&#xff0c;它可以帮助我们更好地管理和响应应用程序中的错误。通过使用 ControllerAdvice 和 ExceptionHandler 注解&#xff0c;我们可以创建一个全局的异常处理器来捕获并处理不同类型的异常。 步骤 1: 创建一个异常处理…...

跟着小土堆学习pytorch(六)——神经网络的基本骨架(nn.model)

文章目录 一、model介绍二、Module三、张量3.1 定义3.2 用法 一、model介绍 容器 Containers 卷积层 Convolution Layers 池化层 Pooling layers 填…...

数字化落地过程中的研发效能治理如何开展?

数字化落地过程中&#xff0c;针对数字化识别到的问题和短板进行专项治理&#xff0c;是通过数字化手段持续提升研发效能非常重要的一环。组织级的数字化专项治理需要组织级团队和技术团队共同配合协同来完成。其中组织级团队负责制定整体的治理目标、流程和策略&#xff0c;根…...

Windows安装配置node.js

下载安装 下载 访问下载 | Node.js 中文网&#xff0c;下载 推荐使用长期支持版本&#xff0c;但是此次是学习用的&#xff0c;使用最新版本试一下 安装 其实一路next基本就可以了&#xff0c;注意调整下安装目录 查看版本 C:\Users\PC>node -v v22.11.0 C:\Users\PC>…...

Javaweb梳理9——JDBC

Javaweb梳理9——JDBC 1.JDBC概述1.1 JDBC概念1.2 JDBC本质1.3 JDBC好处 2.JDBC快速入门2.1 编写代码步骤2.2 具体操作 3 JDBC API详解3.1 DriverManager3.2 Connection3.2.1 获取执行对象3.2.2 事务管理 3.3 Statement3.3.1 概述3.3.2 代码实现 3.4 ResultSet3.4.1 概述3.4.2 …...

逆向CTF入门(如何找main)

Hello, world of reverse! start函数它在执行一些初始化操作,如获取命令行参数、获取环境变量值、初始化全局变量等&#xff0c;一切准备工作完成之后&#xff0c;再调用main函数 快速定位关键函数&#xff1a; 长驱直入法&#xff1a;当程序功能非常明确时&#xff0c;从程序…...

c语言归并排序

归并排序思想&#xff1a; 归并排序可以解释为是将放在数组里的一串数字进行拆分&#xff0c;拆分之后再判断大小合并的过程&#xff0c;每次都是从中间位置拆分&#xff0c;例如有七个数&#xff0c;第一次拆分就将它们分成前三个数为一个数组&#xff0c;后四个数为一个数组&…...

碳化硅陶瓷膜的特性

无机膜包括金属膜、陶瓷膜、玻璃膜等等&#xff0c;其中在水处理领域里出镜最多、应用最广的当属陶瓷膜。比起高分子有机膜&#xff0c;陶瓷膜硬度更高、通量更大、寿命更长&#xff0c;然其性能优越&#xff0c;成本也很“高昂”&#xff0c;故其生存空间自然是受到高分子有机…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...