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

基于Zynq FPGA对雷龙SD NAND的性能测试评估

文章目录

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

一、SD NAND特征

1.1 SD卡简介

雷龙的SD NAND系列有多种型号,本次测试使用的是CSNP4GCR01-AMW和CSNP32GCR01-AOW。这些芯片基于NAND FLASH和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 NAND密码保护(CMD42 - LOCK_UNLOCK);
  • 内置写保护功能(永久和临时);
  • 提供机械开关的写保护功能;
  • 提供应用程序特定命令;
  • 支持舒适擦除机制。

该SD卡支持SDIO和SPI协议读写,最高读写速度可达25MB/s。实际的读写速度会根据MCU和接口情况进行调整。通常在简单的嵌入式系统中,若对读写速度要求不高,会选择使用SPI协议。但无论使用SDIO还是SPI,都需要符合相关协议规范,才能成功搭建文件系统。

1.2 SD卡Block图

(此处插入图片:SD卡封装为LGA-8的引脚分配与定义)

该SD卡采用LGA-8封装,具体的引脚分配与定义见下图:

在这里插入图片描述


二、SD卡样片

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

(此处插入图片:CS创世SD NAND转接板)


三、Zynq测试平台搭建

测试平台使用的是Xilinx的Zynq 7020 FPGA芯片,搭配Digilent Zybo Z7板卡。以下为相关配置:

  • Vivado版本:2018.3
  • 文件系统:FATFS
  • SD卡接口:SD2.0
3.1 测试流程

本次测试针对4GB和32GB两种容量的SD卡,在Zynq FPGA上搭建了SD卡读写回路,旨在测试SD卡的读写速度并验证读写一致性。

测试步骤如下:

  1. 初始化SD卡并建立FATFS文件系统;
  2. 进入测试程序,首先写入一定大小的文件,然后测量写入时间;
  3. 读取文件并测量读取时间;
  4. 比较读取数据和写入数据,确保数据一致;
  5. 通过写入时间和读取时间计算写入速度和读取速度。

测试过程将重复进行100次,最终输出测试报告。

(此处插入图片:Zynq FPGA上搭建的SD卡读写回路)

3.2 SOC搭建

硬件搭建框图如下,在本系统中我们使用了PS端的SDIO接口来驱动SD NAND芯片,并通过UART与PC进行数据交互。

PL端硬件搭建非常简单,仅使用了一个Timer定时器来测量时间。

(此处插入图片:SD NAND(SD卡)PL端的硬件搭建)

使用Zybo板卡文件创建工程,该文件会自动配置板卡中的硬件资源,若使用其他板卡,则需要手动配置DDR等硬件资源。

在这里插入图片描述

创建工程的步骤如下:

  1. 点击Setting -> IP -> Repository -> +,添加Timer IP核的路径;

在这里插入图片描述

  1. 创建Block Design(BD)工程;

在这里插入图片描述

  1. 配置Zynq内核,修改时钟配置为100MHz;

在这里插入图片描述

在这里插入图片描述

  1. 添加TimerA IP;

在这里插入图片描述

  1. 自动生成设计并完成SOC搭建。

在这里插入图片描述

完成硬件搭建后,生成比特流文件,并将其导入到SDK中。
在这里插入图片描述
在这里插入图片描述


四、软件搭建

在SDK中创建一个空白工程,并在其中编写测试程序。在每次读写操作开始之前,通过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;
}

测试过程中,我们通过写入和读取文件测得读写时间,计算出实际的读写速度,并将结果与预期值进行对比。


五、测试结果

经过测试,4GB和32GB两种型号的SD NAND芯片的读写速度如下:

  • 写入速度:随着数据量的增加,写入速度也会增加;
  • 读取速度:读取速度通常会高于写入速度,这符合SD卡的常规特性。

CSNP32GCR01-AOW型号的SD NAND芯片相较于CSNP4GCR01-AMW,具有更高的读写速度。

(此处插入图表:SD NAND的读写速度数据)

在这里插入图片描述


六、总结

虽然原计划尝试将这些样片用于信息安全领域,但由于芯片内部似乎内置了复位或初始化功能,导致无法提取上电时的不确定值,因此未能进行SD NAND的物理不可克隆特性测试。

然而,关于芯片正常读写功能的测试结果令人满意,且芯片的价格具有竞争力。LGA-8封装形式特别适合用于没有卡槽的嵌入式开发板设计,能够有效简化硬件设计和减小硬件面积。

测试工程的链接可见:测试工程链接。


官网参考:雷龙官网

相关文章:

基于Zynq FPGA对雷龙SD NAND的性能测试评估

文章目录 一、SD NAND特征1.1 SD卡简介1.2 SD卡Block图 二、SD卡样片三、Zynq测试平台搭建3.1 测试流程3.2 SOC搭建 四、软件搭建五、测试结果六、总结 一、SD NAND特征 1.1 SD卡简介 雷龙的SD NAND系列有多种型号&#xff0c;本次测试使用的是CSNP4GCR01-AMW和CSNP32GCR01-A…...

4.WebSocket 配置与Nginx 的完美结合

序言 在现代 web 应用中&#xff0c;WebSocket 作为一种全双工通信协议&#xff0c;为实时数据传输提供了强大的支持。若要确保 WebSocket 在生产环境中的稳定性和性能&#xff0c;使用 Nginx 作为反向代理服务器是一个明智的选择。本篇文章将带你了解如何在 Nginx 中配置 Web…...

Docker:镜像构建 DockerFile

Docker&#xff1a;镜像构建 DockerFile 镜像构建docker build DockerfileFROMCOPYENVWORKDIRADDRUNCMDENTRYPOINTUSERARGVOLUME 镜像构建 在Docker官方提供的镜像中&#xff0c;大部分都是基础镜像&#xff0c;他们只提供某个简单的功能&#xff0c;如果想要一个功能更加丰富…...

浮动路由:实现出口线路的负载均衡冗余备份。

浮动路由 Tip&#xff1a;浮动路由指在多条默认路由基础上加入优先级参数&#xff0c;实现出口线路冗余备份。 ip routing-table //查看路由表命令 路由优先级参数&#xff1a;越小越优 本次实验测试两条默认路由&#xff0c;其中一条默认路由添加优先级参数&#xff0c;设置…...

二叉树的遍历和线索二叉树

二叉树遍历 二叉树结点的定义 typedef struct BiNode{Elemtype data;struct BiNode* lchild, *rchild; }BiNode, *BiTree; 先序 递归算法 void PreOrder1(BiTree T){if(T!NULL){visit(T);PreOrder(T->lchild);PreOrder(T->rchild);} } 非递归算法&#xff08;栈实现…...

SpringBoot3 集成Junit4

目录 1. 确保项目中包含JUnit 4依赖添加JUnit 4依赖 2. 配置Spring Boot使用JUnit 4在测试类中使用RunWith注解 3. 编写测试代码4、总结 【扩展】RunWith(SpringRunner.class) 中SpringRunner的作用1. **加载 Spring 应用上下文&#xff08;ApplicationContext&#xff09;**2.…...

Scala的set的添加删减和查询

添加&#xff1a;最好用于不可变数组&#xff0c;因为它会产生新数组&#xff0c;而不是在原数组上进行修改。 在尾部添加元素 可变数组 删减&#xff1a;按元素值删除元素 - 查询&#xff1a;查询元素是否存在.contains package Test //Set //特点&#xff1a;元素是唯…...

基于微信小程序的移动学习平台的设计与实现+ssm(lw+演示+源码+运行)

摘 要 由于APP软件在开发以及运营上面所需成本较高&#xff0c;而用户手机需要安装各种APP软件&#xff0c;因此占用用户过多的手机存储空间&#xff0c;导致用户手机运行缓慢&#xff0c;体验度比较差&#xff0c;进而导致用户会卸载非必要的APP&#xff0c;倒逼管理者必须改…...

【spark面试题】RDD和DataFrame以及DataSet有什么异同

RDD&#xff08;Resilient Distributed Dataset&#xff09;&#xff1a; 概念&#xff1a;可理解为分布式的列表。它的每个元素代表数据的一行&#xff0c;具有支持泛型这一显著特点。这种泛型支持让开发人员能够处理各种类型的数据&#xff0c;具有很强的灵活性。例如&#…...

[Python]关于Tensorflow+Keras+h5py+numpy一些骚操作备忘

起因&#xff1a;要在Anaconda使用Tensorflow和Keras框架 这里提前小结一下&#xff1a; 1&#xff0c;一定要注意Python、Tensorflow、Keras不同版本的对应关系。 2&#xff0c;交叉用conda install 和pip install安装依赖库可能容易出现问题&#xff0c;在Anaconda虚拟环境…...

深度学习:Transformer 详解

Transformer 详解 对于Transformer模型的详细解释&#xff0c;可以更深入地探讨其各个组成部分、工作原理、以及在自然语言处理任务中的应用方法。以下是对Transformer模型的一个更全面和详细的解释&#xff0c;包括其架构细节和关键技术&#xff1a; 1. 基本架构 Transform…...

jmeter 性能测试步骤是什么?

JMeter是一款流行的开源性能测试工具&#xff0c;用于测试各种服务器和网络应用的性能。在进行JMeter性能测试时&#xff0c;通常需要遵循以下步骤&#xff1a; 确定测试目标&#xff1a;首先&#xff0c;明确性能测试的目标。这可以是测试一个网站的负载能力、测试一个API的响…...

前端入门一之JS最基础、最基础语法

前言 JS是前端三件套之一&#xff0c;也是核心&#xff0c;本人将会更新JS基础、JS对象、DOM、BOM、ES6等知识点&#xff1b;这篇文章是本人大一学习前端的笔记&#xff1b;欢迎点赞 收藏 关注&#xff0c;本人将会持续更新。 文章目录 初体验输入输出语句变量和常量常量变量…...

解决Swp交换空间被占满问题

解决ubuntu交换空间被占满问题 step1: cat /proc/sys/vm/swappiness 60 step2: sudo sysctl vm.swappiness10 #临时修改 step3: sudo sh -c “echo “vm.swappiness10” >> /etc/sysctl.conf” step4: sysctl -p #生效...

草地景观中的土地覆被变化:将增强型大地遥感卫星数据组成、LandTrendr 和谷歌地球引擎中的机器学习分类与 MLP-ANN 场景预测相结合

目录 简介 方法 结论 代码1:影像集合 代码2: 随机森林和svm分类 结果 简介 了解草原生境在空间和时间上的动态对于评估保护措施的有效性和制定可持续管理方法至关重要,特别是在自然 2000 网络和欧洲生物多样性战略范围内。 根据遥感数据绘制的土地覆盖图对于了解植被…...

【c++语言程序设计】字符串与浅层复制(深拷贝与浅拷贝)

字符串常量是用一对双引号括起来的字符序列&#xff0c;例如&#xff0c;"abcd" " China"" This is a string." 都是字符串常量。它在内存中的存放形式是&#xff0c;按串中字符的排列次序顺序存放&#xff0c;每个字符占1字节&#xff0c;并在末…...

《TCP/IP网络编程》学习笔记 | Chapter 4:基于TCP的服务器端/客户端(1)

《TCP/IP网络编程》学习笔记 | Chapter 4&#xff1a;基于TCP的服务器端/客户端&#xff08;1&#xff09; 《TCP/IP网络编程》学习笔记 | Chapter 4&#xff1a;基于TCP的服务器端/客户端&#xff08;1&#xff09;理解TCP和UDPTCP/IP协议栈TCP/IP协议的诞生背景链路层网络层T…...

深入解析gdb -p 与gdb attach 的区别与使用场景

摘要&#xff1a;本文将详细对比gdb -p 与gdb attach 这两个命令的使用方法、场景及优缺点&#xff0c;帮助读者更好地理解并运用这两个调试工具。 一、引言 在Linux系统中&#xff0c;GDB&#xff08;GNU Debugger&#xff09;是一款功能强大的调试工具&#xff0c;广泛应用…...

C语言 | Leetcode C语言题解之第542题01矩阵

题目&#xff1a; 题解&#xff1a; /*** Return an array of arrays of size *returnSize.* The sizes of the arrays are returned as *returnColumnSizes array.* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().*/ type…...

论文阅读笔记:Image Processing GNN: Breaking Rigidity in Super-Resolution

论文阅读笔记&#xff1a;Image Processing GNN: Breaking Rigidity in Super-Resolution 1 背景2 创新点3 方法4 模块4.1 以往SR模型的刚性4.2 图构建4.2.1 度灵活性4.2.2 像素节点灵活性4.2.3 空间灵活性 4.3 图聚合4.4 多尺度图聚合模块MGB4.5 图聚合层GAL 5 效果5.1 和SOTA…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

Ubuntu系统多网卡多相机IP设置方法

目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机&#xff0c;交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息&#xff0c;系统版本&#xff1a;Ubuntu22.04.5 LTS&#xff1b;内核版本…...

上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式

简介 在我的 QT/C 开发工作中&#xff0c;合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式&#xff1a;工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...