首页 > 其他分享 >基于Zynq FPGA对雷龙SD NAND的测试

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

时间:2023-12-22 19:05:58浏览次数:33  
标签:FPGA Res 读写 time xil NAND TimerA0 雷龙 SD

文章目录

一、SD NAND特征

1.1 SD卡简介

1.2 SD卡Block图

二、SD卡样片

三、Zynq测试平台搭建

3.1 测试流程

3.2 SOC搭建

四、软件搭建

五、测试结果

六、总结

一、SD NAND特征

1.1 SD卡简介

  雷龙的SD NAND有很多型号,在测试中使用的是CSNP4GCR01-AWM与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图

基于Zynq FPGA对雷龙SD NAND的测试_SD NAND软件搭建

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

基于Zynq FPGA对雷龙SD NAND的测试_SD卡Block图_02

二、SD卡样片

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

在这里插入图片描述:

基于Zynq FPGA对雷龙SD NAND的测试_Zynq测试平台搭建_03

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

基于Zynq FPGA对雷龙SD NAND的测试_SD NAND软件搭建_04

3.2 SOC搭建

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

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

基于Zynq FPGA对雷龙SD NAND的测试_SD NAND软件搭建_05

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

基于Zynq FPGA对雷龙SD NAND的测试_SD卡简介_06

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

基于Zynq FPGA对雷龙SD NAND的测试_Zynq测试平台搭建_07

 点击Create Block Design创建BD工程

基于Zynq FPGA对雷龙SD NAND的测试_SD卡Block图_08

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

基于Zynq FPGA对雷龙SD NAND的测试_SD卡简介_09

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

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

基于Zynq FPGA对雷龙SD NAND的测试_SD卡简介_10

 添加TimerA IP;

基于Zynq FPGA对雷龙SD NAND的测试_SOC搭建_11

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

基于Zynq FPGA对雷龙SD NAND的测试_SD卡Block图_12

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

基于Zynq FPGA对雷龙SD NAND的测试_SD卡Block图_13

生成比特流文件;

基于Zynq FPGA对雷龙SD NAND的测试_SD卡简介_14

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

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

基于Zynq FPGA对雷龙SD NAND的测试_SD卡Block图_15

基于Zynq FPGA对雷龙SD NAND的测试_SD卡简介_16

四、软件搭建

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

  点击file -> new -> Application project;

基于Zynq FPGA对雷龙SD NAND的测试_SOC搭建_17

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

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

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

  1. #include "xparameters.h" /* SDK generated parameters */
  2. #include "xsdps.h" /* SD device driver */
  3. #include "xil_printf.h"
  4. #include "ff.h"
  5. #include "xil_cache.h"
  6. #include "xplatform_info.h"
  7. #include "time.h"
  8. #include "../user/headfile.h"

  9. #define PACK_LEN 32764

  10. static FIL fil; /* File object */
  11. static FATFS fatfs;

  12. static char FileName[32] = "Test.txt";
  13. static char *SD_File;

  14. char DestinationAddress[PACK_LEN] ;

  15. char txt[1024];
  16. char test_buffer[PACK_LEN];

  17. void TimerA0_init()
  18. {
  19. TimerA_reset(TimerA0);//reset timerA device
  20. TimerA_Set_Clock_Division(TimerA0,100);//divide clock as 100000000/100 = 1Mhz
  21. TimerA_Stop_Counter(TimerA0);//stop timerA
  22. }

  23. void TimerA0_start()
  24. {
  25. TimerA_SetAs_CONTINUS_Mode(TimerA0);
  26. }

  27. void TimerA0_stop()
  28. {
  29. TimerA_Stop_Counter(TimerA0);
  30. }




  31. uint32 SDCard_test()
  32. {
  33. uint8 Res;
  34. uint32 NumBytesRead;
  35. uint32 NumBytesWritten;
  36. uint32 BuffCnt;
  37. uint8 work[FF_MAX_SS];
  38. uint32 take_time=0;
  39. uint32 speed = 0;
  40. uint32 test_time = 0;
  41. uint32 w_t=0;
  42. uint32 r_t=0;
  43. float wsum = 0;
  44. float rsum = 0;


  45. TCHAR *Path = "0:/";

  46. for(int i=0;i
  47. {
  48. test_buffer[i] = 'a';
  49. }

  50. Res = f_mount(&fatfs, Path, 0);

  51. if (Res != FR_OK) {
  52. return XST_FAILURE;
  53. }

  54. Res = f_mkfs(Path, FM_FAT32, 0, work, sizeof work);
  55. if (Res != FR_OK) {
  56. return XST_FAILURE;
  57. }

  58. SD_File = (char *)FileName;

  59. Res = f_open(&fil, SD_File, FA_CREATE_ALWAYS | FA_WRITE | FA_READ);
  60. if (Res) {
  61. return XST_FAILURE;
  62. }

  63. Res = f_lseek(&fil, 0);
  64. if (Res) {
  65. return XST_FAILURE;
  66. }

  67. while(1)
  68. {
  69. TimerA_reset(TimerA0);
  70. TimerA0_start();
  71. Res = f_write(&fil, (const void*)test_buffer, PACK_LEN,
  72. &NumBytesWritten);
  73. TimerA0_stop();
  74. take_time = TimerA_Read_Counter_Register(TimerA0);
  75. w_t+=take_time;
  76. xil_printf("--------------------------------\n");
  77. xil_printf("take time:%d us\n",take_time);
  78. speed = PACK_LEN*(1000000/((float)(take_time)));
  79. sprintf(txt,"write speed:%.2f MB/s\n",(float)(speed)/1024/1024);
  80. wsum = wsum+speed;
  81. xil_printf(txt);
  82. xil_printf("--------------------------------\n");
  83. if (Res) {
  84. return XST_FAILURE;
  85. }

  86. Res = f_lseek(&fil, 0);
  87. if (Res) {
  88. return XST_FAILURE;
  89. }

  90. TimerA_reset(TimerA0);
  91. TimerA0_start();
  92. Res = f_read(&fil, (void*)DestinationAddress, PACK_LEN,
  93. &NumBytesRead);
  94. TimerA0_stop();
  95. take_time = TimerA_Read_Counter_Register(TimerA0);
  96. r_t+=take_time;
  97. xil_printf("--------------------------------\n");
  98. xil_printf("take time:%d us\n",take_time);
  99. speed = PACK_LEN*(1000000/((float)(take_time)));
  100. sprintf(txt,"read speed:%.2f MB/s\n",(float)(speed)/1024/1024);
  101. rsum = rsum+speed;
  102. xil_printf(txt);
  103. xil_printf("--------------------------------\n");
  104. if (Res) {
  105. return XST_FAILURE;
  106. }


  107. for(BuffCnt = 0; BuffCnt < PACK_LEN; BuffCnt++){
  108. if(test_buffer[BuffCnt] != DestinationAddress[BuffCnt]){
  109. xil_printf("%dno",BuffCnt);
  110. return XST_FAILURE;
  111. }
  112. }
  113. xil_printf("test num:%d data check right!\n",test_time+1);
  114. test_time++;
  115. if(test_time==100)
  116. {
  117. 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);
  118. xil_printf(txt);
  119. 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);
  120. xil_printf(txt);
  121. Res = f_close(&fil);
  122. if (Res) {
  123. return XST_FAILURE;
  124. }
  125. return 0;
  126. }
  127. }

  128. }

  129. int main(void)
  130. {
  131. TimerA0_init();

  132. SDCard_test();
  133. xil_printf("finish");
  134. return 0;
  135. }

五、测试结果

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

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

  对比两种型号SD NAND芯片,发现CSNP32GCR01-AOW型号具有更高的读写速度;

基于Zynq FPGA对雷龙SD NAND的测试_SD NAND软件搭建_18

基于Zynq FPGA对雷龙SD NAND的测试_SD卡简介_19

基于Zynq FPGA对雷龙SD NAND的测试_SD卡Block图_20

六、总结

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

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

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

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

【本文转载自CSDN,作者:PPRAM】

标签:FPGA,Res,读写,time,xil,NAND,TimerA0,雷龙,SD
From: https://blog.51cto.com/u_16359561/8937500

相关文章

  • 【FPGA基础】状态机
    状态机由状态寄存器和组合逻辑电路组成;在不同的当前状态下,能够控制信号的变化进行状态的转移,从而实现相关信号的赋值,完成特定控制时序的设计。状态机的三个基本要素:      状态变迁(当前状态current_state和下一状态next_state      输入条件(状态变化的触发事件 ......
  • 高云FPGA的LVDS应用
    本板卡提供如下例程,主要基于具体案例,聚焦于摄像头采集,LCD屏驱动显示等图像处理相关。像GPIO,CLK,LED等这种简单的操作都放到具体实例中了,不再一一介绍,常用的IP也是非常简单的操作,高云文档有些写得不太仔细,如遇到不清楚的地方可以联系官方FAE或者我这边。3.1LVDS的应用LVDS使用......
  • ubuntu 18.04.6 编译Preloader提示 没有规则可制作目标 /host_tools/altera/preloader
     生成spl_bsp后,在spl_bsp路径下输入make 提示:没有规则可制作目标/host_tools/altera/preloader/uboot-socfpga.tar.gz 原来要先运行 ./embeddedcommandshell.sh,并在该终端窗口下输入make   ......
  • Gowin FPGA Designer 简介
    高云FPGADesigner是高云FPGA开发的IDE软件,软件包不大,安装包241M,解压Gowin_V1.9.8.07_vin压缩包,后点击文件夹的exe安装包,直接一直按下一步,完成软件的安装,安装后在桌面会有如下图标  双击打开软件,进入主界面,如下  软件的使用,请参考软件使用视频或者在高云官......
  • 基于FPGA的超声波测距
    基于FPGA的超声波测距系统通常涉及超声波传感器、FPGA芯片、时钟模块、距离测量算法等组件。以下是一个基本的系统设计框架:原理详细解释:超声波传感器:用于发送超声波脉冲并接收回波。一般使用的是超声波传感器,其工作原理是发送超声波脉冲,当脉冲遇到障碍物时,部分能量被反射回来,通过......
  • 基于RT-Thread快速上手SD NAND 虚拟文件系统
    SDNAND也称之为贴片式TF卡,贴片式SD卡,采用标准的SDIO接口,兼容SPI接口。下图所示为CS新一代CSSDNANDNP1GCR01-AOW大小为128M,对比128M的SD卡,可以看到贴片SD卡尺寸更小,不要SD卡座,占用更小的PCB面积;也可以节省PCB板层数,2层板即可使用。而且兼容可替代普通TF卡/SD卡,硬件电路软......
  • 基于FPGA的图像形态学腐蚀算法实现,包括tb测试文件和MATLAB辅助验证
    1.算法运行效果图预览 将FPGA的仿真结果导入到MATLAB,结果如下所示:   2.算法运行软件版本vivado2019.2 matlab2022a 3.算法理论概述      基于FPGA的图像形态学腐蚀算法实现主要依赖于图像处理的基本原理和数学形态学的基础知识。在图像处理中,形态学操......
  • UBUNTU 18.04.6 在编译LINUX内核的时候执行MAKE ARCH=ARM SOCFPGA_DEFCONFIG提示Can't
     Intel针对SoCFPGA芯片提供的Linux源码中已经提供好了一个名为socfpga_defconfig的配置文件,我们对内核的配置和修改,建议基于此配置文件进行,因此在进行配置前,需要先将该配置文件导入到默认配置文件.config中,操作方法很简单。 在终端输入makeARCH=armsocfpga_defconfig......
  • UBUNTU 18.04.6 在编译linux内核的时候执行make ARCH=arm socfpga_defconfig设置默认
    在编译linux内核的时候执行makeARCH=armsocfpga_defconfig设置默认配置时报错bisonflexnotfound缺少文件:/bin/sh:1:bison:notfound 输入命令sudoapt-getinstallbison进行安装: /bin/sh:1:flex:notfound 输入命令 sudoapt-getinstallflex进行安......
  • FPGA驱动RGB888屏幕——基于正点原子达芬奇FPGA开发板
    RGB888简介重要提示:由于我没有RGB888屏幕,所以代码未经验证,但是我将其在HDMI中使用了,证明代码还是有一定的正确性一个像素点由三种颜色控制,每个颜色8bit,共24bit,三个字节,这就是RGB888。同样的还有RGB565等。LCD屏幕介绍1、HSYNC(水平同步信号、行同步信号):产生此信号,说明开始显......