FPGA 20个例程篇:8.SD卡任意地址的读写

2023-11-06

三、数据断电存储,工程必备

8.SD卡任意地址的读写

        SD卡作为最常见的外设之一,本身也是一种基于半导体快闪记忆器的新一代记忆设备。它具有体积小、传输速度快、支持热插拔等优点,在便携式装置领域得到了非常广泛的应用,例如数码相机、多媒体播放器、笔记本电脑、行车记录仪等等都能看到它的身影,相比EEPROM和FLASH而言,SD卡具有断电存储大型数据的优势,同时对于.bmp、.wav等很多格式的数据会按照扇区进行存储,如图1所示是豌豆开发板Artix7上SD卡电路,为了在这款开发板上集成更多的外设资源,电路设计上节约了引脚,FPGA直接通过SPI总线和SD卡进行数据读写,但需要说明的是实际上SD卡有两种通信方式:SPI和SDIO,前者更节约芯片引脚、后者更提升读写速度,一般性地对于读写速度要求不是很苛刻地场合使用SPI通信即可。

图1 豌豆开发板Artix7上SD卡电路

       市面上除标准的SD卡外,还有MicroSD卡(原名TF卡),是一种极细小的快闪存储器卡,是由SanDisk(闪迪)公司发明,主要用于移动手机,在豌豆开发板上配有标准的MicroSD卡插槽,MicroSD卡在插入适配器后即可转换成SD卡,其操作时序和SD卡是完全相同的。MicroSD卡接口定义如下图2所示,如表1 MicroSD卡各个引脚功能说明。

 图2 MicroSD卡引脚定义示意图

引脚编号

引脚名称

SDIO模式下功能

SPI模式下功能

1

DAT2

数据线2

保留

2

DAT3/CS

数据线3

片选信号

3

CMD/MOSI

命令线

主机输出,从机输入

4

VDD

电源

电源

5

CLK

时钟

时钟

6

VSS

7

DAT0/MISO

数据线0

主机输入,从机输出

8

DAT1

数据线1

保留

表1 MicroSD卡各个引脚功能说明

       不同协议规范的SD卡也有着不同速度等级的表示方法。在SD1.0协议规范中,会使用“X”用以表示不同的速度等级;在SD2.0协议规范中,使用了SpeedClass表示不同的速度等级;SD3.0协议规范则使用UHS(Ultra High Speed)表示不同的速度等级。SD2.0规范中对SD卡的速度等级划分为普通卡(Class2、Class4、Class6)和高速(Class10);SD3.0规范对SD卡的速度等级划分为UHS速度等级1和3,而在SD4.0中则是UHS-II,不仅速度等级大大加快,接口方面也有所改变,SD2.0、3.0、4.0协议下不同等级的读写速度和应用场景如下表2所示。

表2 SD2.0、3.0、4.0协议下不同等级的读写速度和应用场景

       目前SD卡中使用最多的是2.0协议,虽然SD卡没有统一的芯片手册,但是却有一份官方手册SD2.0_Final_bookmark,在这个例程中我们使用SPI协议去和SD卡进行通信,同样地我们也尝试着来提取官方手册中的有效信息,如图3所示在SD2.0协议下SD卡SPI通信连接示意图,这里也是用到了4根线,即MOSI、MISO、CS和CLK。

图3 在SD2.0协议下SD卡SPI通信连接示意图

       如图4所示是在SD2.0协议下指令格式,这里每条指令均有6字节组成,如图5和图6所示是在SD2.0协议下指令发送和指令应答示意图,注意到指令发送第1字节的高2位均为01,即格式固定为“0 1 x x x x x x”,比如CMD55,8'd55 = 8'b 0011_0111,而发送指令号则应该是8'b 0111_0111;指令发送第2-5字节是指令参数,有些指令参数是保留位,没有定义参数的内容,保留位应全部设置为0;指令发送第6字节中前7位为CRC(循环冗余校验)校验位,最后一位为停止位1,SD卡在SPI模式下默认不开启CRC校验,在SDIO模式下开启CRC校验。换句话说在SPI模式下,虽然SD卡不开启CRC校验,但是CRC校验位还是需要发的,只是SD卡会在读到CRC校验位时自动忽略它,所以校验位全部设置为1即可。

       这里需要注意的是,SD卡上电默认是SDIO模式,如图7所示是SD卡上电工作初始化示意图手册上给出至少应该在上电74个时钟周期后,SD卡达到正常工作电压才可以对其进行操作,在接收SD卡返回CMD0的响应指令时,拉低片选CS,进入SPI模式。所以在发送CMD0指令时,SD卡仍处于SDIO模式,需要开启CRC校验,另外CMD8的CRC校验是始终启用的,也需要启用CRC校验,除了这两条指令,其它指令的CRC可以不用做校验。

        此外在SD2.0协议下SD卡的指令又被分为:标准指令比如CMD0、CMD8等,应用相关指令比如ACMD41等。ACMD指令是特殊指令,发送方法和标准指令是一样的,但是在发送应用相关指令之前,必须先发送CMD55指令,告诉SD卡接下来的指令是应用相关指令,而非标准指令。

       发送完指令后,SD卡会返回响应指令的信息,不同的CMD指令会有不同类型的返回值,常用的返回值有R1类型、R3类型和R7类型,其中R7类型是返回CMD8指令专用。SD卡的常用指令说明如下表3所示,这里是从图8在官方手册对SD2.0协议下SD卡常用指令汇总而来的,感兴趣的同学可以再结合图8对比下。

图4 SD2.0协议下指令格式

指令

索引

指令号

参数设置

返回类型

细节描述

CMD0

0x40

保留位

R1

复位SD卡进入默认状态,如果返回值为0x01,则表示SD卡复位成功

CMD8

0x48

Bit[31:12]:保留位

Bit[11:8]:主机电压范围(VHS)

0:未定义 

1:2.7V~3.6V

2:低电压 

4:保留位 

8:保留位 

Bit[7:0]:校验字节,该校验字节不是CRC校验位,而是此字节和返回的校验字节相同。如果该字节发送0xaa,那么当接收CMD8指令回复的数据时接收到的校验字节也应该是0xaa。

R7

发送主机的电压范围以及查询SD卡支持的电压范围,而V1.0版本的卡并不支持该指令,只有V2.0版本的卡才支持该指令。如果SD卡返回的值是0x01,则表示SD卡为V2.0,否则该卡为MMC卡或者为V1.0卡 

CMD17

0x51

Bit[31:0]:SD卡读扇区地址

R1

SD卡的读指令

CMD24

0x58

Bit[31:0]:SD卡写扇区地址

R1

SD卡的写指令

CMD55

0x77

Bit[31:16]:RCA(SD卡相对地址),在SPI模式下没有用到

Bit[15:0]:保留位

R1

告诉SD卡下一条指令是应用相关指令,而非标准指令

ACMD41

0x69

Bit[31]:保留位 

Bit[30]:HCS(OCR[30]),如果主机支持SDHC或SDXC的卡,此位设置为1

Bit[29:0]:保留位

R3

要求访问的SD卡发送它的操作条件寄存器(OCR)内容

表3 SD2.0协议下SD卡常用指令汇总

图5 SD2.0协议下指令发送示意图

 图6 SD2.0协议下指令应答示意图

 图7 SD卡上电工作初始化示意图

       如图8所示是在SD2.0协议下SD卡常用指令报文和功能详细描述,当然大家结合表3看起来则更为直观,注意到SD卡的每条发送指令后,都需要SD卡返回响应数据,其中用到了返回类型R1、R3、R7三种数据格式,笔者也把官方手册的相关说明做了截图以便于大家查阅。

       

 

 

 

 

 图8 SD2.0协议下SD卡常用指令报文和功能详细描述

       如图9所示是SD卡返回类型R1的数据格式,其中从高位到低位依次是起始位0、参数错误标志位、地址错误标志位、擦除序列错误标志位、CRC校验错误标志位、无效指令标志位、擦除复位标志位、空闲状态标志位。

       如图10所示是SD卡返回类型R3的数据格式共返回5个字节,返回的第1个字节为R1的内容,其余字节为OCR(操作条件寄存器)的内容。

       如图11所示是SD卡返回类型R7的数据格式,SD卡返回类型R7格式共返回5个字节,返回的第1个字节也为R1的内容,其余字节包含SD卡操作电压信息和校验字节等相关内容。

 图9 SD卡返回类型R1数据格式

 图10 SD卡返回类型R3数据格式

 图11 SD卡返回类型R7数据格式

         SD卡在正常读写操作之前,必须先对SD卡进行初始化,使其能够工作在预期的SPI模式下,但需要注意的是SD1.0协议和SD2.0协议在初始化的过程中仍然有所区别:只有SD2.0协议的SD卡才支持CMD8指令,所以能响应这条指令的SD卡可以判断为SD2.0协议的卡,否则为SD1.0协议的SD卡或者MMC卡;而对于CMD8无响应的情况,可以发送CMD55 + ACMD41指令,如果返回0,则表示SD1.0协议卡初始化成功,如果返回错误,则判定为MMC卡;在确定为MMC卡后,继续向卡发送CMD1指令,如果返回0,表示MMC卡初始化成功,否则判断为错误卡。

       下面为大家详细介绍SD2.0协议下SD卡复位、初始化、读写操作的时序逻辑,也是这个例程中程序设计的关键点。

        如图12所示是SD卡复位时序逻辑图,SD卡完成上电以后,主机FPGA需要先对从机SD卡发送至少74个周期以上的同步时钟,在上电同步期间,片选CS引脚和MOSI引脚必须是高电(MOSI引脚除发送指令或者数据之外,均默认为高电平),接着拉低片选CS引脚,发送指令CMD0用来复位SD卡,指令发送完成以后需要等SD卡返回响应数据,这时主机FPGA从MISO总线上逐个字节地接收SD卡返回的响应数据,判断如果返回的数据类型R1是复位完成信号0x01,则此时SD卡进入SPI模式,当然如果返回的值为其它值,则继续接收MISO总线上的下个字节数据再做判断,因为未必恰好刚发送完CMD0指令后即可接收到0x01信号,所以程序设计上最好做一个超时判断。

 图12 SD卡复位时序逻辑图

       如图13所示是SD卡初始化时序逻辑图,在主机FPGA成功复位从机SD卡后,这里以常用的SD2.0协议SD卡举例,拉低片选CS引脚,发送指令CMD8以查询SD卡的版本号,只有SD2.0协议SD卡才支持这条指令,指令发送完成以后需要等SD卡返回响应数据0x01信号,说明此SD卡为2.0协议,当然在程序设计的时候也完全可以省略这个步骤所以示意图中并没有画出来。

       在SD卡成功地响应CMD8指令判定其为SD2.0协议SD卡,主机FPGA等待至少8个时钟周期后,发送指令CMD55即告诉SD卡下一次发送的指令是应用相关指令,指令发送完成后等待SD卡返回响应数据0x01信号,等待至少8个时钟周期后,发送指令ACMD41查询SD卡是否初始化完成,指令发送完成后需要等待SD卡返回响应数据0x00,则此时SD卡初始化成功,到这里SD卡已经成功完成了上电复位和初始化配置操作,进入到SPI模式。

图13 SD卡初始化时序逻辑图

        如图14所示是SD卡写操作时序逻辑图,在主机FPGA成功复位和初始化从机SD卡后,拉低片选CS引脚,发送指令CMD24写入单个数据块,指令发送完成后等待SD卡返回响应数据,SD卡返回正确的响应数据0x00,主机FPGA等待至少8个时钟周期后,开始发送数据头0xfe,接下来开始发送512个字节的数据,因为SPI模式下不对数据进行CRC校验,所以直接发送2字节的0xff即可,SD卡响应后会进入写忙碌的状态,即MISO引脚为低电平,此时不允许其他的操作,当检测到MISO引脚为高电平时,SD卡就退出了写忙碌状态,同样地SD卡响应完成整条指令后等待8个时钟周期后允许进行其它操作。

 图14 SD卡写操作时序逻辑图

       如图15所示是SD卡读操作时序逻辑图,在主机FPGA成功复位和初始化从机SD卡后,拉低片选CS引脚,发送指令CMD17读取单个数据块,指令发送完成后等待SD卡返回响应数据,SD卡返回正确的响应数据0x00,主机FPGA等待至少8个时钟周期后,开始准备解析SD卡返回的数据头0xfe,解析到数据头0xfe后,接下来接收SD卡返回的512个字节的数据,数据解析完成后,接下来接收2个字节的CRC校验值,因为SPI模式下不对数据进行CRC校验,所以能直接忽略这2个字节,同样地SD卡响应完成整条指令后等待8个时钟周期后允许进行其它操作。

 图15 SD卡读操作时序逻辑图

       因为市面上大部分的MicroSD卡均为SD2.0协议的SD卡,所以在这个例程中默认去判断SD2.0协议的SD卡,下面仅去介绍SD2.0协议下的初始化流程,具体的初始化步骤如下: 

1. CMD0复位SD卡,返回值0x01;

2. CMD8检测是不是SD2.0卡,返回值0x01;

3. CMD55告诉SD卡下一条指令是应用相关指令而非标准指令,返回值0x01;

4. ACMD41查询SD卡是否初始化完成,返回值0x00;

5. CMD24写SD卡扇区指令,返回值0x00,再依次发送数据头0xfe、512个字节的扇区数据、2字节的0xffffCRC校验数据,返回值0xXXX00101,代表SD卡退出写忙碌状态;

6. CMD17读SD卡扇区指令,返回值0x00,再等待SD卡发送数据头0xfe后,依次接收512个字节的扇区数据、2字节的CRC校验数据。

       这里有几个地方需要特别注意,笔者实现这个例程的功能时,对照SD2.0协议官方手册和一些开源说明,代码很快写出来了,但调试花了好几天都没有成功,所以想把容易大意出错的地方总结给大家少走弯路:

1. SD卡在初始化的时候,时钟频率不能超过400Khz否则初始化不会通过,笔者刚开始在这里吃了很多亏,即读写SD卡和初始化SD卡的时钟都用了同一个时钟,手册给出对于SD2.0协议的SD卡初始化时钟不超过400Khz,正常工作时钟不超过50Mhz,大家可以在顶层信号例化时,给出两个模块不同的时钟频率;

2. 需要等待上电后,主机FPGA需要先对从机SD卡发送至少74个周期以上的同步时钟,再拉低片选CS后发送CMD0指令进行复位操作;

3. 每次主机FPGA发送完一条指令后,需要等待SD卡响应回复,程序上可以做一个超时等待计数器,如果等待超时可以重复发送该指令;

4. 对于SD卡的SPI通信,其CPOL时钟极性和CPHA时钟相位均为1;

5. 对于SD卡每次响应一个指令后,需要间隔至少8个时钟周期才能发送下一条指令;

6. 对于SD卡上电默认是SDIO模式,初始化配置成SPI模式后,才可以进行后续的扇区读写操作。 

      在这里还要补充FAT文件系统知识,如果对SD卡的读写测试就像EEPROM、FLASH一样是读写数据的话,则不需要FAT文件系统的支持,但SD卡却经常被用来在Windows操作系统上存取数据,所以必须使用Windows操作系统支持的FAT文件系统才能在电脑上正常使用。

       FAT是Windows操作系统所使用的一种文件系统,文件系统的作用则是:负责为用户建立文件、读出、修改,控制文件的读取,在这里为大家简单介绍FAT文件系统,一方面对于后期FPGA从SD卡读取.wav音乐播放,从SD卡读取.bmp图片显示等例程做好前期铺垫,另一方面对于一名嵌入式工程师而言,FAT是非常关键的知识点,典型地在STM32或者ARM端移植FAT32,使其可以支持U盘插拔读写数据,比如读取U盘bin文件以实现在线升级程序,写入U盘人机界面截图jpg文件等等,也是嵌入式开发当中常见的应用情景。

        FAT文件系统用“簇”作为数据单元,一个“簇”是由一组连续的扇区所组成,一个扇区由512个字节组成,“簇”中所包含的扇区数必须是2的整数次幂,所有的“簇”从2开始进行编号,每个“簇”都有一个自己的地址编号,用户文件和目录都应存储在“簇”中,FAT文件系统的基本结构分为:分区引导记录、文件分配表、根目录和数据区。 

        分区引导记录:分区引导记录区通常占用分区的第一个扇区,即包含512个字节。其中包括了四个部分内容:BIOS参数记录块、磁盘标志记录表、分区引导记录代码区和结束标志符0x55aa。 

        文件分配表:文件在磁盘上以“簇”为单位存储,但同一个文件的数据并不一定完整地存放在磁盘的一个连续的区域内,往往会分成若干“簇”,FAT表也就是记录文件存储中“簇”与“簇”之间连接的信息,即文件的链式存储。对于FAT32文件系统,使用32Bit来表示文件分配表。 

       根目录:根目录是文件或者目录的首“簇”号。在FAT32文件系统中,不针对根目录的位置做硬性规定,可以存储在分区内可寻址的任意“簇”内。 

       数据区:数据区紧跟在根目录后面,是文件等数据存放的地方,占用大部分的磁盘空间。 

       分析总结完SD2.0协议的SD卡初始化和读写时序逻辑,下面我们开始动手还原整个设计,其实在理清楚思路以后再进行编码,仅仅只是工作量问题,朋友们还记得在第四个例程中“串行DAC输出模拟电压控制LED亮度”对于SPI底层驱动的设计吗,当时为了模块化设计,我们把CPOL时钟极性和CPHA时钟相位均作为输入信号,不过例程中只实现了MOSI总线的数据输出,并未实现MISO总线的数据输入,而在这个例程,我们需要完善该模块,以应用在SD卡底层SPI通信协议的数据输出和输入上,模块里使用两个移位寄存器把MOSI总线的输出数据逐位移出出去,同时也把MISO总线的输入数据逐位移入进来,但在这里不过多赘述了,朋友们对照spi_driver模块的代码,很容易就可以看得很明白,其中模块里用spi_en输入信号作为触发SPI总线协议1字节数据读写的使能信号,用spi_done输出信号作为SPI总线协议读写完成1字节数据读写的结束信号。

       在这个例程中,主要详细介绍sdcard_init和sdcard_driver两个模块的设计,即SD卡初始化和扇区读写模块,如表4所示,是sdcard_init模块的信号列表。

        到这里可能有朋友会存在疑问,同样都是SPI总线通信,为什么不采用第七个例程中“FLASH读写断电存储“的设计思路,把驱动层、控制层和逻辑层,层层分割再用模块化设计?因为这里SD卡存在初始化的操作,初始化时钟又和扇区读写时钟不一致,且两者 有着先后顺序,即初始化完成后才能扇区读写,所以如果再按照上一个例程的设计思路,原理上可以实现,但代码设计上显然会增加麻烦,而把spi_driver模块单独模块化出来,再在sdcard_init和sdcard_driver两个模块中调用,则很好地规避了上面的问题。

       对于sdcard_init即SD卡初始化模块,按照前面所分析的依次发送CMD0、CMD8、CMD55、ACMD41,等待SD卡依次返回响应数据0x01、0x01、0x01、0x00即可,但这个模块的设计中需要注意三个地方:1. 主机至少74个时钟周期再发送CMD0(程序里笔者给出了80个时钟周期的等待);2. 主机发送每条指令都要SD卡做出响应回复,主机再收到回复后,需要至少等待8个时钟周期再发送下一条指令;3. spi_en是触发下游spi_driver模块在SPI总线协议读写1字节数据的使能信号,本模块需要在收到spi_driver模块传来的在SPI总线协议读写1字节数据的完成信号spi_done后,拉高一个时钟的spi_en信号继续触发下游模块在SPI总线上读写1字节数据,如图16是SD卡初始化模块的代码设计。

信号列表

信号名

I/O

位宽

clk

I

1

rst_n

I

1

sd_data_vld

I

1

sd_dout

I

8

sd_din

O

8

sd_cs

O

1

spi_en

O

1

sd_init_done

O

1

表4 sdcard_init模块信号列表

图16 SD卡初始化模块的代码设计

       在这个例程中我们去实现以下功能,通过串口助手向豌豆开发板发送简单的报文数据,控制SD卡读写第0扇区的512字节数据,和前面EERPOM报文同样的思路,报文的具体格式是:8'hAA(固定报头)、8'h00(写操作)/8'h01(读操作)、写入SD卡的初始值(此后扇区内512字节数据会按输入的初始值再做加一操作),如报文:8'hAA 8'h00 8'h1F,代表向SD卡的0扇区写入初始值为1F的数据,报文:8'hAA 8'h01,代表向SD卡的0扇区读取512字节数据,因为command_detect模块和前面例程中的设计大同小异,所以不在赘述,感兴趣的同学也可以把读写扇区的地址做到报文里实现控制不同扇区读写的效果。

       如表5所示是sdcard_driver模块信号列表,在SD卡扇区读写模块设计中,其实和前面读写FLASH例程相似,但也有几个地方需要注意:1. 主机发送CMD24写SD卡扇区指令,返回值0x00,再依次发送数据头0xfe、512个字节的扇区数据、2字节的0xffffCRC校验数据,返回值0xXXX00101,代表SD卡退出写忙碌状态;2. 主机发送CMD17读SD卡扇区指令,返回值0x00,再等待SD卡发送数据头0xfe后,依次接收512个字节的扇区数据、2字节的CRC校验数据;3. 本模块需要一个FIFO去存储从SD卡扇区内读出的512字节数据;4. 本模块需要上游command_detect模块的sec_wr_addr、sec_rd_addr、wr_start_byte、wrl_rdh_mode信号来进行读写扇区操作;5. 同样地spi_en是触发下游spi_driver模块在SPI总线协议读写1字节数据的使能信号,本模块需要在收到spi_driver模块传来的在SPI总线协议读写1字节数据的完成信号spi_done后,拉高一个时钟的spi_en信号继续触发下游模块在SPI总线上读写1字节数据,如图17所示是SD卡扇区读写模块的代码设计。

信号列表

信号名

I/O

位宽

clk

I

1

rst_n

I

1

uart_fifo_rdy

I

1

sd_data_vld

I

1

sdcard_en

I

1

sec_wr_addr

I

32

sec_rd_addr

I

32

wr_start_byte

I

8

wrl_rdh_mode

I

1

sd_dout

I

8

sd_din

O

8

sd_cs

O

1

spi_en

O

1

sd_rd_dout

O

8

sd_rd_dout_vld

O

1

表5 sdcard_driver模块信号列表

图17 SD卡扇区读写模块的代码设计

       如图18所示是SD卡任意地址的读写顶层文件的例化设计,这里只需要把串口发送uart_transfer模块、串口接收uart_receive模块、指令解析command_detect模块、SD卡初始化sdcard_init模块、SD卡扇区读写sdcard_driver模块、SPI总线底层驱动spi_driver模块的相关信号例化到一起即可,因为sdcard_driver模块需要在sdcard_init模块初始化后才能正常工作,且两个模块的SPI总线时钟不同,所以用sd_init_done来作为标志信号,作为判断两个模块SPI总线控制的标志,且SD卡完成初始化后用LED点灯方便观察。

图18 SD卡任意地址的读写顶层文件的例化

        如图19和20所示,通过串口助手先发送写SD卡扇区报文指令,即写入初始字节值为1F,再发送读SD卡扇区报文指令,可以看到512个字节从扇区0地址中读出。

图19 串口助手发送写SD卡扇区报文指令

 图20 串口助手发送读SD卡扇区报文指令

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FPGA 20个例程篇:8.SD卡任意地址的读写 的相关文章

  • FPGA设计篇之流水线思想

    FPGA设计篇之流水线思想 一 写在前面 二 正文开始 2 1举个栗子 2 2 1情况一 组合逻辑 2 1 2情况二 流水线设计 2 1 4 小总结 2 2举第二个栗子 写在最后 一 写在前面 流水线 大家好 我是富土康三号流水线的张全蛋
  • Quartus II 安装

    本次介绍使用的 Quartus 版本为 10 1 目前 Quartus II 官网已经没有 13 1 以下版本的安装包 大家可以安装 13 1 以上版本的软件 功能都是大同小异 下载地址 FPGA Software Download Cen
  • 在vivado中使用tcl脚本(UG894)

    本文源自UG894 主要介绍如何在vivado中使用tcl脚本 1 vivado中如何获取tcl help vivado中任何自带的命令都可以通过 help 获取帮助信息 也可以直接输入 help 取得vivado命令合集 并通过 help
  • 8x8LED点阵

    点量这个只需要把9高电平 13低电平就可以了 共阳极点阵 行线是led的正极 列线是led的列线 左上角点亮 显示多个灯是动态扫描的 一个一个显示的 然后间隔速度要快就可以造成显示 点阵由两篇74Hc595级联在一起驱动的 只需要三个io口
  • Vivido添加pynq-Z2开发板

    一 下载pynq z2开发板文件 下载地址 https www tulembedded com FPGA ProductsPYNQ Z2 html 二 将下载的文件解压到vivado安装的位置 如果boards目录下面没有boards fi
  • 紫光同创 FPGA 开发跳坑指南(三)—— 联合 Modelsim 仿真

    Modelsim 是 FPGA 开发中重要的 EDA 设计仿真工具 主要用于验证数字电路设计是否正确 紫光 Pango Design Suite 开发套件支持联合 Modelsim 仿真 这里作简要的介绍 添加仿真库 方法一 打开 Pang
  • Verilog HDL——分频 计数

    分频 计数 module traffic Clk 50M Rst Clk30 Clk 1Hz input Clk 50M Rst output Clk30 Clk 1Hz 分频器 reg Clk 1Hz 分频器 50M分频 reg 31 0
  • DEBUG:Generate Bitstream失败

    问题 约束失败 解决 确保IO初始化引脚正确 和选择合适的电平
  • SD卡读写实验(SPI模式)

    对于 SD 卡的 SPI 模式而言 采用的 SPI 的通信模式为模式 3 即 CPOL 1 CPHA 1 在 SD 卡 2 0 版 本协议中 SPI CLK 时钟频率可达 50Mhz SD 卡的 SPI 模式 只用到了 SDIO D3 SP
  • 手把手教你Modelsim仿真【2020.4版本】

    首先新建一个文件夹 test5 打开Modelsim 依次选择 File gt Change Directory 把目录选择到创建的 test5 文件夹 创建库 依次选择 File gt New gt Library 一般我们选择第三个 库
  • 最详细的Vivado安装教程

    V i v a d o 安 装
  • FIFO读写控制

    如果在两个模块之间传输数据 两个模块之间的处理速率不同 会导致采集数据的遗漏或错误 在他们之间加一个数据缓存器 所有数据先经过缓存器缓存 再输入数据接送模块 创建两个模块 一个 作为发送模块 一个作为接受模块 发送模块检测到 fifo为空开
  • FPGA提示产生latch的报错

    在fpga的设计中有时会遇到 latch 的报错 1 latch是什么 Latch 就是锁存器 是一种在异步电路系统中 对输入信号电平敏感的单元 用来存储信息 锁存器在数据锁存使能时 数据被锁存 输入信号不起作用 这违背了组合逻辑中输出随输
  • 吃透Chisel语言.18.Chisel模块详解(五)——Chisel中使用Verilog模块

    Chisel模块详解 五 Chisel中使用Verilog模块 上一篇文章讲述了用函数实现轻量级模块的方法 可以大幅度提升编码效率 Chisel中也提供了一些好用的函数 方便我们编写代码 也方便Chisel编译器优化生成的硬件电路 在Chi
  • FPG—VGA显示器字符显示(附代码)

    目录 1 实操 1 1 字符取模 1 2 顶层模块 1 3 图像数据生成模块 1 3 1 模块框图 1 3 2 波形图绘制 1 3 3 代码编写 1 3 4 仿真验证 2 总结 本例程大部分与VGA显示驱动内容相同 只是显示部分改变了 故此
  • 使用七牛云进行文件上传

    目录 一 七牛云入门测试 1 注册七牛云账号 完成后选择对象存储 2 在里面创建空间 一个空间相当于一个文件夹 就是将对象上传到的地方 3 查看个人秘钥 注册完成账号后 会有一个秘钥 上传文件的时候进行授权和认证 4 文件上传测试 二 封装
  • 【电子技术】什么是LFSR?

    目录 0 前言 1 数学基础 1 1 逻辑异或 1 2 模2乘法 和 模2除法 2 线性反馈移位寄存器LFSR 3 抽头和特征多项式 4 阶线性反馈移位寄存器实例 0 前言 线性反馈移位寄存器 Linear Feedback Shift R
  • 【FPGA多周期时序约束详解】- 解读FPGA多周期时序约束的全过程

    FPGA多周期时序约束详解 解读FPGA多周期时序约束的全过程 FPGA作为数字电路设计的常见工具 其设计中必然会遇到时序约束的问题 而多周期时序约束更是FPGA设计中不可避免的难点之一 本文将详细介绍FPGA多周期时序约束的全过程 并结合
  • 【FMC141】基于VITA57.4标准的4通道2.8GSPS 16位DA播放子卡(2片DAC39J84)

    FMC141是一款基于VITA57 4标准的4通道2 8GSPS 2 5GSPS 1 6GSPS采样率16位DA播放FMC子卡 该板卡为FMC 标准 符合VITA57 4与VITA57 1规范 16通道的JESD204B接口通过FMC 连接
  • TRICONEX MA2211-100 芯片上相互连接

    TRICONEX MA2211 100 芯片上相互连接 TRICONEX MA2211 100 所有相同的组件 io的电源 处理器 和内存将需要 但是 你可以看到所有这些带存储器和处理器的OO板 针不能嵌入到一个小的单片机上 现在是 普拉克

随机推荐

  • C++期末复习运算符混淆---打妖怪

    7 2 打妖怪 低级错误 运算符混淆问题 实验1 第二题 话说孙大圣保唐僧西天取经 路上遇到一妖怪 妖怪共有 v 滴血 大圣每打一棒就能使妖怪失去 h 滴血 妖怪一旦没血就会立即死去 大圣打 n 棒刚好将妖怪打死 请编写程序 输入 v 和
  • 代码题: 看代码说结果, 事件循环 + async 函数的

    1 基本的 async await 和事件循环 console log 1 async function asyncFunc console log 2 await Promise resolve console log 3 asyncFu
  • Simulated Binary Crossover(SBX)的学习

    最近在做作业遇到一个Dejong s fifth function的multi modal的问题 用传统的GA方法尝试了很多次 的确没办法搞定 随机很多次也不一定在global optimum的地方得到一次解 前几天去导师家里的路上谈到这个
  • 什么是 MATLAB(矩阵实验室)?工作、功能和应用

    MATLAB 被 MathWorks 定义为专有软件应用程序和编程语言 可促进复杂的数据分析任务 例如算法实施 与其他应用程序交互以及操作数据矩阵 本文介绍了 MATLAB 的用途 其关键概念以及 2022 年的用例 什么是 MATLAB
  • 【解决】TypeError: this.$refs.treeRefs.xxx is not a function

    问题 使用refs触发子组件内方法时报 TypeError this refs treeRefs xxx is not a function 解决 经查看 发现子组件被放在了v for循环体内 示例代码如下
  • 虚拟机上部署K8S集群

    虚拟机上部署K8S集群 安装VM Ware 安装Docker 安装K8S集群 安装kubeadm 使用kubeadm引导集群 安装VM Ware 参考 http www taodudu cc news show 2034573 html a
  • 推荐系统:Wide & Deep模型解析

    1 Wide Deep模型介绍 经典推荐深度模型 Wide Deep 对应的论文 Wide Deep Learning for Recommender Systems 链接 arxiv Wide Deep的模型架构如下图所示 可以看到Wid
  • 运维技能风向标

    运维介绍 运维是一个融合多学科 网络 系统 开发 安全 应用架构 存储等 的综合性技术岗位 从最初的网络管理 网管 发展到现在的系统运维工程师 网络运维工程师 安全运维工程师 运维开发工程师等 可以看出 运维的分工一直在细化 并且对综合技能
  • Element Plus for Vue 3 入门教程

    本文首发 Element Plus for Vue 3 入门教程 Element Plus 有那些升级 Element Plus 与 Element UI 是什么关系 老 Element 项目是否可以平滑升级到 Vue 3 Element
  • 如何快速实现Android平台前端设备接入能力

    技术背景 SIP 会话初始化协议 是在 IP网络上进行多媒体通信的应用层控制协议 以几种RFC的形式提供 其中最重要的是包含核心协议规范的RFC3261 该协议用于创建 修改和终止与一个或多个参与者的会话 通过会话 我们了解了一组进行通信的
  • linux inode满了后,怎么清理

    最近服务器的inode inode介绍 达到了90 当 Ised 节点使用率 达到100 时 即使文件系统有剩余空间也无法写入数据 这里记录下解决方法 清理文件系统下 细碎文件 施放节点数 因为该路径下的文件都是重要文件 不能够删除 所以这
  • 【数据库内核】物理执行器引擎Pull模型之火山模型

    目录 概述 算子介绍 火山模型 火山模型痛点 一 虚函数的开销 二 Cpu Cache的利用率 结论 参考资料 概述 当我们的逻辑计划引擎把SQL生成了逻辑计划后 后端的物理计算引擎接收到逻辑计划生成物理执行计划 便可以开始去真正执行计算作
  • 推荐Android15个常用的图表库,包含线性,条形柱状,饼状图,扇形,雷达,股票,折线,散点,仪表盘......

    1 https github com xcltapestry XCL Charts Android开源图表库 XCL Charts is a free charting library for Android platform XCL Ch
  • fatal error: ros/ros.h: 没有那个文件或目录

    程序包下面的cmakelist txt 加上 find package catkin REQUIRED COMPONENTS roscpp include directories include catkin INCLUDE DIRS
  • Kubernetes系列(一)基础概念

    从最基础开始了解k8s 首先需要清楚三个问题 k8s是怎么出现的 他解决了什么问题 整体架构是什么样的 有哪些优缺点 从以上三个问题出发 本文将分为三个章节 讲述K8S的一些基础概念 发展历程 接触K8S之前 就得先了解一下云计算这个概念
  • 数据结构实验--唯一的确定一棵二叉树

    一 问题描述 如果给出了遍历二叉树的前序序列和中序序列 则可以构造出唯一的一棵二叉树 试编写实现上述功能的程序 基本要求 已知一棵二叉树的前序和中序序列 试设计完成下列任务的一个算法 1 构造一棵二叉树 2 证明构造正确 即分别以前序和中序
  • jsp里面的input的值吗_jsp:如何获取input 输入框中的值?

    匿名用户 1级 2017 01 25 回答 如何用jquery获取中输入的值 test val input name test val input type text val input type text attr value 追问 只能
  • linux: 串口接收十六进制部分字节丢失(0x11,0x0d->0x0a等等)

    https blog csdn net gx19862005 article details 12944687 https blog csdn net chengde6896383 article details 77603302
  • 云备份客户端——客户端整体设计框架以及实用类工具实现

    一 客户端整体框架 客户端要实现的功能和服务端相比相对简单 客户端要实现的功能是自动对指定文件中的文件进行备份 也就是定时对指定文件进行扫描 根据文件信息判断文件 符合要求 新文件或者被修改过的文件 进行上传 因此我们客户端大概需要实现下面
  • FPGA 20个例程篇:8.SD卡任意地址的读写

    三 数据断电存储 工程必备 8 SD卡任意地址的读写 SD卡作为最常见的外设之一 本身也是一种基于半导体快闪记忆器的新一代记忆设备 它具有体积小 传输速度快 支持热插拔等优点 在便携式装置领域得到了非常广泛的应用 例如数码相机 多媒体播放器