FPGA应用程序加载_第1页
FPGA应用程序加载_第2页
FPGA应用程序加载_第3页
FPGA应用程序加载_第4页
FPGA应用程序加载_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/基于XilinxFPGA的嵌入式Linux设计流程FPGA是通过逻辑组合电路来实现各种功能的器件。由于FPGA内部集成了大量的逻辑资源和可配置的I/O引脚,加上独特的并行处理架构,可以轻松实现同时对多个外部设备的配置和管理,以与内外各种接口数据的传输。现在开发厂商又在FPGA内部加入了大量的DSP和BlockRAM资源,非常适合图像处理、数字信号处理等运算密集的应用,因此在这些领域取得了广泛的应用。但是由于FPGA程序编写的灵活性和功能的多样性,使得它在一个复杂工程中对各个程序的使用调度、统筹管理上有很大的局限性,这样就必须引入操作系统进行统一的管理。Linux系统则因为其良好的可裁减、可配置等特点在嵌入式领域应用广泛。Linux操作系统提供了许多系统级的应用,例如网络协议的实现、进程调度、内存管理等,同时Linux是一个成熟的开源操作系统,有丰富的应用资源,利用这些资源和强大的系统功能,用户可以快速地开发基于嵌入式环境复杂系统。因此,结合FPGA和Linux双方优势,可以很好地满足嵌入式系统设计需求,量体裁衣,去除冗余。本文给出了一种基于XilinxFPGA的嵌入式Linux操作系统解决方案。基于FPGA的嵌入式系统的硬件设计本设计是基于XilinxXC4VFX40系列FPGA,它内部集成了两个PowerPC405处理器,4个10/100/1000M以太网MAC模块,运行频率300MHz时,具有420D-MIPS性能,能解决高速网络数据传输问题,并且能解决通过网络加载操作系统和交叉编译等问题。它内部有448个可配置I/O口,2592kbBlockRAM,能实现对各种外部设备的并行控制以与较多数据的存储与处理。加载一个操作系统,一般需要几十兆的内存空间,FPGA内部自带的RAM空间是远远不够的,本设计在板上扩展了两片MICRON公司的256MbDDR内存,作为上电时操作系统的加载和运行空间。现在主流的嵌入式操作系统,都需要搭建交叉编译环境,把在主机上编写好的可执行文件下载到目标板上,这就需要实现网络数据的传输。由于XC4VFX40自带了以太网MAC模块,只需要在外面添加个PHY芯片和带隔离器的RJ45接口就能实现这个功能。本设计由于对网络数据实时性要求很高,因此采用Marvell公司的千兆以太网PHY芯片88E1111-RCJ。它能根据自身配置和主机设计,实现10/100/1000M自适应传输,并且Linux本身对这个芯片提供了驱动支持,实现无缝链接。操作系统加载到DDR中能快速有效的运行,但是掉电就会丢失,因此必须加入FLASH芯片,把系统文件存储到外部FLASH中。加电时,FPGA把操作系统文件从FLASH读入到DDR中运行。FPGA设计当然会扩展很多接口出来,利用自身并行处理的优势,控制很多外围设备,本设计也不例外,扩展了8个通用的GPIO,2个PS/2接口,1个USB接口,1个AC97声卡接口,1个HotLink接口,以与4个RS422接口,同时扩展了两个CPCI接口,引出了16位数据地址线和Ethernet控制线,整个系统的硬件框图如图1所示。在进行电路设计时,是以FPGA为核心,向外扩展各种设备,因此特别注意了FPGA各个引脚的连接。由于DDR和PHY芯片都需要提供+2.5V电压,因此和DDR、PHY芯片连接引脚所在的BANK需要提供+2.5V电压参考,并且不能接以LVTTL或LVCMOS为电压参考的引脚。重要快速的时钟信号必须接到全局时钟引脚上。由于FPGA需要通过外部FLASH启动操作系统,需要并行配置,以减少加载时间,配置电路如图2所示。在DDR布线时,数据和地址线需要走等长线,数据线之间不能相差10Mil,地址线要控制在20Mil以内,时钟也需要走差分等长线,长度应大于地址线,DDR各个信号还需要47Ω的并行端接,改善信号质量。千兆PHY输出MDI信号也需要在顶层做差分等长,不然在进行1000M数据传输时很可能不稳定。DDR和PHY需要完整的电源回路做参考,电源层划分时也要特别注意,其他电路做常规处理就可以了。EDK和ISE软件设计首先需要调用Xilinx提供的EDK软件,对各个模块加入必要的IPCORE,以便操作系统能正常调用这些器件的驱动操作他们。本设计采用的是EDK10.1.2版本,PPC方面选用ppc405内核,频率设定在300MHz,同时需要添加中断输入引脚,以便响应以太网、串口等外部中断,其他使用默认设置。DDR控制器采用EDK提供的Multi-Port-MemoryController模块,需要设置DDR芯片厂商、大小和数据位数等,特别指出的是,要设置独立的两条PLB总线和PPC连接,作为PPC的指令和数据总线。MAC单元需要加入XPS_LL_TEMAC模块来控制,本设计需要设置PHY类型为GMII(千兆以太网),同时要指定物理地址和收发FIFO大小。FLASH单元需要加入xps_mch_emc模块,同时设置FLASH类型和读写时间。为了方便调试,还需要加入串口控制台模块,本设计使用的是UartLite模块,设置需要的波特率和校验类型。特别注意的是,系统还需要时钟管理模块(DCM),提供各个模块需要的不同时钟,还要设置一段FPGA内部RAM区域,放置PPC的.boot文件。外部这些模块都通过PLB总线和PPC通信,需要统一编址,一般把DDR内存空间地址分配到0x0开始,整个系统的构建如图3所示。本设计,除了在EDK中搭建了操作系统必须的各种模块后,还需要在ISE中编写各个时序电路程序,因此把EDK中编写好的工程作为一个模块,加入到ISE中,然后统一编译,这样生成了我们需要的完整功能的程序。特别指出的是,PPC405数据地址采用的是大端模式,接入到ISE中时,需要把数据颠倒位置,如DATA[0:31]变为DATA[31:0],才能正常读写。Linux操作系统的加载与烧写加载Linux操作系统需要利用EDK软件提供的板级升级包(BSP)配置内核。BSP包含了所选定处理器架构的属性文件以与相关硬件的驱动源文件。首先要在EDKProjectOption中ProjectPeripheralRespository选项下设置Xilinx提供的gen-mhs-devtree/edk_lib库路径,然后在软件平台设置中选择Dts模式,编译更新升级包,生成.dts配置文件。Dts文件包含了所有模块地址分配,中断以与驱动信息,把他加入到Linux内核中,然后配置内核选项选择对应的处理器架构、所选硬件的驱动模块以与需要的其他内核模块,之后再对完成配置的内核进行编译,生成Linux的内核image文件。生成内核image文件之后,还需要生成系统运行所需要的根文件系统。根文件系统中包含了嵌入式Linux系统的所有应用程序、库以与系统配置等相关文件。根文件系统中常用的程序和命令可利用开源软件Busybox构造。构造完成之后,在Busybox生成的目录和文件的基础上再构造根文件系统的目录树,并添加相关设备文件和配置文件以与系统运行时需要的脚本文件,从而形成最终的根文件系统,ramdisk.image。把他拷贝到内核中的../arch/powerpc/boot目录下,在linux2.6.x根目录下运行makezlmage.initrt,生成最终的系统文件。需要指出的是,在编译linux内核时,需要设置好交叉编译环境:首先安装ELDK编译软件,然后在编辑自己的帐户目录下的.bashrc(例如:/home/ppc/)中加入下面内容:CROSS_COMPILE=ppc_4xx$PATH=$PATH:/home/ppc/PowerPc/ELDK/usr/bin:/home/ppc/PowerPc/ELDK/binexportCROSS_COMPILEPATH保存,然后执行$source.bashrc把生成的zlmage.initrd文件通过EDK软件下的XMD调试窗口,使用dowzlmage.initrd命令下载到DDR中,然后运行run命令,就正常启动Linux了。程序下载到DDR中,掉电后,数据就丢失了,不能保存和连续使用,因此要把操作系统烧写到FLASH,上电后让它能自动运行,掉电后也不会丢失。EDK提供了专门的FLASH烧写工具ProgramFlashMemory,首先要把zlmage.initrd文件转换为FLASH能识别的.SREC文件,需要在EDKShell下运行下面命令:$powerpc-eabi-objcopy–Ielf32-powerpc–OsreczImage.initrd.srec第一次烧写FLASH时需要把ProgramFlashMemory中CreateFlashBootlooderApplication勾上,让系统自动生成Bootlooder程序。操作系统烧写到Flash中后,需要FPGA在上电后自动从FLASH读取操作系统数据,然后自动运行,这几需要把刚刚生成的bootloadr_0工程中的.elf加入到.bit生成新的配置文件,使用EDK下的UpdataBitstream命令就能实现。最后把生成的.mcs文件烧写到FPGAPROM中,上电后,系统就能自动运行了。设计结果与分析在Linux系统正常加载后,我们设计一个程序,它通过以太网,从上位机获得数据,存入FPGA内部BlockRam中,再在ISE中编写程序,把获得的数据取出,产生频率可变的波形发生器,并回传发送的参数给上位机。通过实验证明,在FPGA加入操作系统后,能轻松实现网络数据的收发,并通过FPGA自身的逻辑,产生我们需要的各种控制信号,做到了系统的统一调度和各个功能的并行处理,发挥了操作系统和FPGA各自的优势。但是也发现,FPGA下操作系统运行的频率不高,最多600MHz,中断响应间隔较长,大约3ms左右,系统上电启动时间较长,大约40s左右,这些都需要在今后设计中进一步完善和提升。结语本文介绍了基于FPGA的嵌入式Linux设计流程,从硬件设计到Linux系统加载,再到应用程序运行整个过程,从中可以看出,该设计既发挥了FPGA并行处理和多时序控制上的优势,也发挥了嵌入式Linux系统调度和可裁剪性方面的优势,还提高了这个系统的稳定行,也减少了FPGA与外部高速总线连接的资源开销,二者的结合,既满足了嵌入式应用按需定制、量体裁衣的需求,又能开发出稳定而功能强大的嵌入式系统,在现在嵌入式系统开发中有很好的运用。MicroBlaze处理器的PetaLinux操作系统移植引言随着FPGA(FieldPrograromableGateArray,现场可编程门阵列)技术的迅速发展,SOPC(SystamOnaPrograromableChip,可编程片上系统)作为一种特殊的嵌入式微处理器系统,已逐渐成为一个新兴的技术方向。SOPC融合了SoC和FPGA各自的优点,并具备软硬件在系统可编程、可裁减、可扩充、可升级的功能。其核心是在FPGA上实现的嵌入式微处理器核,而如何针对特定的微处理器选择合适的嵌入式操作系统是SOPC开发的难点之一。本文针对Xilinx公司的MicroBlaze软核,介绍了PetaLinux嵌入式操作系统与其移植方法,研究了PetaLinux的相关配置和启动方案。1基于MicroBlaze处理器的系统设计1.1MicroBlaze处理器简介MicroBlaze软核处理器是一种针对XilinxFPGA器件而优化的功能强大的微处理器。它内部采用RISC架构的32位指令和数据总线,支持CoreConnect片上总线的标准外设计集合,具有兼容性和重复利用性,且可根据性能需求和逻辑区域成本任意裁减,极大地扩展了应用范围,其最精简的核只需要将近400个Slice。MicroBlaze的CoreConnect总线、它能够将FPGA内各种不同的IP核连接到一起构成一个完整的系统。CoreConnect总线是一个总线标准的集合,它包括PLB总线(ProcessorLocalBus,处理器本地总线),LMB总线(LocalMemoryBus,高速本地存储器总线),FSL(FastSimplexLink,快速单连接)总线,以与XCL(XilinxCacheLink)总线等。1.2系统结构和外部设备概述本系统主要是在Virtex-4开发板上构建一个以MicroBlaze处理器为中心的嵌入式信号处理系统,在FPGA内部实现系统的总线架构、数据存储、地址译码、外设接口等系统部件和功能。各功能部件在FPGA内部都以IP核的形式构建并连接,整个系统的结构框图如图1所示。其中,SysACE用于存放文件系统和应用程序配置文件,INTC用来实现中断控制;GPIO和UART16550用于系统调试,自定义IP核DDC用来实现数字接收机下变频功能,这些外设通过PLB总线与MicroBlaze处理器和DDR相连;用于快速傅里叶变换的自定义IP核FFT通过FSL总线与Micr-oBlaze内部通用寄存器直接相连,实现了数据的快速传输;DDR通过XCL总线与MicroBlaze处理器相连,实现了MicroBlaze处理器对片外存储器的高速访问。1.3嵌入式操作系统的选择选用PetaLinux嵌入式操作系统。它是PetaLogix公司专门针对FPGA的片上系统设计的嵌入式Linux开发套件,在满足应用工程的逻辑编程能力和对嵌入式Linux要求的同时,可极大地缩短产品开发周期。PetaLinux作为专门针对于XilinxFPGA的嵌入式Linux解决方案,不但提供了专门的BSP生成器,而且提供了众多的参考设计,可以帮助设计者快速掌握PetaLinux的配置方法。PelaLinux内核正在不断的完善之中,且不断地加入基于XilinxFPGA嵌入式系统IP核的设备驱动,比如XilinxUSB、SysACE、FSL总线设备驱动、10/100/1000M三态以太网MAC等。这些设备驱动极大地减轻了嵌入式系统开发者的工作量,缩短了产品开发的周期。2PetaLinux系统移植在SOPC硬件系统构建完成后,就要针对此结构配置操作系统内核,下面介绍具体步骤。2.1建立交叉编译环境嵌入式系统开发一般采用交叉编译的方法,即在宿主机上对内核和应用程序进行编译,生成目标机处理器可执行的二进制位流文件,将此文件下载到目标机运行。PetaLinux针对MicroBlaze处理器建立了交叉编译器,运行source./settings.sh脚本,系统会自动建立交叉环境。2.2建立硬件平台PetaLinux为每个应用工程建立一个文件夹,里面保存该工程的硬件配置。在移植PetaLinux时,只需选择相应的硬件平台,内核就会读取该工程文件夹下的配置文件。使用PetaLinux-new-platform命令建立硬件平台,如果使用MMU(虚拟内存管理单元),则在此命令后添加-m选项。硬件平台建立起来后,运行makemenuconfig命令,在Vendor/ProductSeletion选项中,选择该硬件平台。另外,还需将在EDK下生成的配置文件转换成Linux操作系统可以识别的格式。在工程文件夹下运行PetaLinux-copy-autoconfig命令,自动完成格式转换,并拷贝配置文件到已选择的工程文件夹下。2.3添加自定义设备驱动本系统自定义了IP核,因此必须开发驱动程序并将其添加到PetaLinux配置中。添加自定义设备驱动主要步骤如下:①在平台配置目录下Makefile文件中添加语句platobj-$(CONFIG_PETALOGIX_DDC)+=ddc.o和$(obj)/ddc.o:.config使设备初始化函数ddc.C与内核配置相关联;②在驱动程序所在目录下的Makefile文件中添加obj-$(CONFIG_PETALOGIX_DDC)+=ddc_adapter.o使设备驱动程序ddc_adapter.c与内核配置相关联;③修改设备驱动程序所在目录下的Kconfig文件,使配置内核时可以选择该设备驱动,并添加以下语句:通过以上文件的修改,就可以在配置PetaLinux内核时选择自定义的设备驱动。2.4配置PetaLinux内核由于Linux内核的可裁减性,能够方便地对内核进行修改、裁减、编译,最终移植到一个嵌入式系统中。运行图形编辑工具makemenuc-onfig命令,对内核和系统环境进行配置。在内核配置的设备驱动选项中,一定要选择与系统硬件配置一致的硬件设备驱动,否则内核编译时就会出错。针对本系统的硬件配置,主要配置以下几项驱动:①[Blockdevices]块设备。选择XilinxSystemACEsupport。②[Miscdevice]混杂设备。选择FSLFIFOdriver,然后进入FSLChannelSelection,选择FIFOonFSLO,并选择自添加设备驱动Pet-aLogixDDC101Driver。③[Networkdevicesupport]网络设备。选择Ethernet(1000Mbit)子菜单中的Xilinx10/100/1000LLTEMACsupport。④[Characterdevices]字符设备。选择Serialdrivers子菜单中的8250/16550andcompatibleserialsupport和Consoleon8250/16550andcompatibleserialport。文件系统选项中,默认选择了ext2、romfs和cramfs文件系统,其他文件系统可以根据需要自行选择。本系统需要挂载DOS文件系统的CF卡,因此进行以下配置:①[DOS/FAT/NT]。选择MSDOSfssupport。②[NativeLanguageSupport]。选择Codepage437(UnitedStates,Canada)。内核配置中的其他配置可以根据目标系统的不同灵活配置,配置完成后保存退出,自动进入系统环境配置菜单。系统环境配置是对Peta-Linux的属性、命令进行配置,主要有以下几个选项:①[SystemSettings]系统设置。配置系统的网络地址、默认用户名、默认登陆密码和所用根文件系统等内容。②CoreApplications]内核应用。主要配置内核的常用特性。③[NetworkApplications]网络应用。配置网络应用时的相关命令。④[MiscellaneousApplications]混杂应用。配置系统内核中的命令。⑤[BusyBox]。配置系统内核中的命令。PetaLinux已经设置好了编译规则,因此配置完成后,依次执行命令makedep、makeclean、makeall,建立文件依赖关系,清除旧的文件,编译内核,生成内核image。3PetaLinux启动方案经过编译的PetaLinux内核image文件主要有image.bin、image.elf、image.ub。根据选择image文件的不同,PetaLinux有4种启动方案:XMD下载启动、TFTP网络下载启动、Flash启动和SysACECF卡启动。其中,XMD和TFTP网络下载启动方案,在每次系统上电后都必须重新下载,适用于系统调试;Flash启动方案在系统上电后自动从Flash中读取配置文件,但Flash烧写速度较慢,更改系统配置较为不便。因此,本系统选用SysACECF卡启动方案。使用SysACECF卡启动PetaLinux,先将硬件比特流文件和image.elf制作成ACE文件,再复制到CF卡中,配置CF卡启动PetaLinux。制作ACE文件,可在EDKShell窗口运行命令:xmd-tclgenace.tcl(命令工具)-jprog-boardm1402(所需的开发板)-hwimplementation/download.bit(生成的比特流文件)-elfimage.elf(编译Linux内核生成的可执行网表文件)-acesystem.ace(需生成的ACE文件)成功后,适合于ML-402开发板的ACE文件就生成了。Linux运行需要根文件系统的支持,启动时必须加载文件系统以支持系统的运行,而image.elf中不包含文件系统。因此,使用SysACECF卡启动时必须手动加载文件系统。在编译PetaLinux内核时,已经生成了以romfs文件夹为名称的文件系统,所以只需将CF卡分区和格式化,然后挂载此文件系统。具体步骤如下:①将CF卡挂载到Linux系统中,运行命令fdisk/dev/sda把CF卡分成3个区。第1分区存放system.ace文件,第2分区为LinuxSwap交换分区,第3分区存放根文件系统。②Linux下格式化第3分区为ext2文件系统,运行命令mke2fs/dev/sda3。在/ete/fstab下输入命令/dev/sda3/mnt/rootfsautodefaults,user,noauto00。把设备sda3挂在/mnt/rootfs文件下,文件系统为默认的ext2,普通用户,能挂载,不转储,启动时不扫描文件系统。通过命令mount/mnt/rootfs挂载该目录,这样就可以把根文件系统rootfs拷贝到CF卡的该分区上。③Windows下格式化第1分区为FAT32文件系统,把system.ace复制到这个分区。④Linux下格式化第2分区为交换分区,运行命令mks/sda2。一切准备就绪后,插入CF卡,开启电源,就可以从CF卡启动PetaLinux。结语本文介绍了一种可用于MicroBlaze处理器的嵌入式Linux操作系统——PetaLinux,并详细讨论了其内核配置和启动方案。通过移植Peta-Linux,本文开发的SOPC可以直接用于实际工程。该嵌入式操作系统移植快速、简单,由于其基于Linux2.6内核,可以保证较高的稳定性。因此,在SOPC应用日益复杂的背景下具有较高的实用价值。本文创新点:实现了PetaLinux在MicroBlaze处理器的移植,并成功实现PetaLinux中自定义硬件设备驱动的添加和SysACECF卡的启动方案。MPMC的使用双击Bus_Interface标签栏下的DDR_SDRAM,进入编辑MPMC的界面。如图3.2.1所示:

点击看大图图3.2.1点击DDR_SDRAM3.2.1BaseConfiguration主标签栏:BaseConfiguration包含两个标签栏。其中,用户可以在PortTypeConfiguration中配置端口类型,MPMC最多可以有8个端口,每个端口有前述的4种接口类型XCL,PLBv46,SDMA,NPI以与不使用INACTIVE。

点击看大图图3.2.2MPMC端口的4种接口类型以与不使用INACTIVE分配完毕后可以通过LeftJustify将不工作的端口消除掉。在这个过程中所有与端口有关的参数和外部总线连接都被移到左边。图3.2.3点击LeftJustify之前图3.2.4点击之后在CommonAddress中可以观察和设置初始地址。想配置任一个独立的端口地址,需到Advanced标签栏下Address选项选择。

图3.2.5CommonAddress标签栏3.2.2MemoryInterface主标签栏MPMC可以与不同厂商的许多不同种内存一起工作。这个标签栏让你在MemoryPartSelector标签下选择与MPMC连接的内存。MemoryPartSelector它包含Type选项,Memorymanufacturer选项,Memorystyle选项,Memorydensity选项,Memorywidth选项和PartNo.选项。

图3.2.6MemoryPartSelector过滤的结果在PartNo.下拉列表中出现。如果内置的内存数据库正确部分不能使用时,MemoryPartSelector/PartNo.下拉列表也会包含一个用户选项。在你选择了CUSTOM选项之后,所有内存参数都可修改,你能够输入你想要的参数。在你选择了内存部分之后,参数将被自动载入到SelectedMemoryInfo区和Memory/DIMMSettings标签中去Memory/DIMMSettings在这个设置区内,选择下拉菜单,你可以调整DIMMs的数目,内存数据宽度,内存时钟周期,ODT设置和部分其他信息。

图3.2.7MemoryInterface标签MemoryPartSettingsTabMemoryPartSettings标签栏有两个区间:PartSettings和MemoryTimingSettings。PartSettings包含DataDepth,DataWidth,Bank,Row,和ColumnBits。MemoryTimingSettings包含内存部分选项。

图3.2.8MemoryPartSettings标签3.2.3PortConfiguration主标签栏在PortConfiguration标签栏可以设置每个独立端口的参数。端口0-3和端口4-7可以在标签栏中显示。端口标签栏分成如图3.2.9所示的表明端口号的四个象限。只有与现有端口类型相关的参数(在BaseConfiguration主标签栏中选择)可以查看并修改。

图3.2.9PortConfiguration3.2.4Advanced主标签栏Advanced的标签栏提供了更多高级MPMC的用户资源。DataPath在DataPath这个标签栏中,你既能够配置常规传递途径的设置,也能单独设置每个端口。GeneralPipelineSettings允许你设置常规传递途径的参数,而Port-specificSettings允许你按照如下方式为独立的端口改变传递途径的设置:NPIWidth:NPI的宽度。ReadFIFOConfig:用BRAM,SRL,或者Wr-Only(只能写,不能读缓存)执行FIFO。WriteFIFOConfig:用BRAM,SRL,或者Rd-Only(只能读,不能写缓存)执行FIFO。ReadMemoryPipeline:允许传递途径读内存。ReadPortPipeline:允许传递途径读潜在端口。WriteMemoryPipeline:允许传递途径写内存。

WritePortPipeline:允许传递途径写端口。AddressAckPipeline:允许传递途径确认抵制要求。

图3.2.10DataPathPort-specificSettings中ReadFIFOConfig有三个选项:BRAM,SRL,Wr-Only。

图3.2.11ReadFIFOConfig同样,WriteFIFOConfig有三个选项:BRAM,SRL,Rd-Only。

图3.2.12WriteFIFOConfigArbitrationMPMC最多有8个端口,它们能同时访问内存。因此,在任何必要时候都能有一个仲裁机制来断定哪个端口有优先权,就显得十分重要了。在Arbitration标签栏中,你可以选择用哪种仲裁机制。

从下拉菜单中选取一种仲裁机制:RoundRobin:采取循环仲裁模式。

图3.2.13RoundRobitFixed:采取确定的优先级模式。Custom:在这种模式中,可以定制时间档的数值和每个时间档的仲裁优先级。在每个时间档中仲裁优先级被编译成描述端口间优先级下降的字符串。

图3.2.14Custom例如,字符串“01234567”给端口0最高的优先级,然后从端口1到7优先级下降。MiscMisc这个从标签栏包含了需要你注意,但不在先前类别内的参数。

图3.2.15Misc上面大概地介绍了MPMC的结构和功能,具体如何在设计中加入使用NPI接口将在第七章中给出一个实际的例子。BootloaderBootLoader的基本概念板级支持包(BSP)BSP是板级支持包(BoardSupportPackage)的缩写,是通常用在嵌入行业中的一个术语,用来代表在一个特殊硬件平台上快速构建一个嵌入操作系统所需的原始资料或者二进制软件包。BSP的作用是支持操作系统,使之能够更好的运行于硬件平台。BSP是相对于操作系统而言的,不同的操作系统对应于不同定义形式的BSP,包括WindowsCE、Linux、Vxworks等。SoC/CPU厂商应向其芯片的用户提供一个基本的BSP包,以支持主板厂商或整机制造厂商在此基础上定制和开发各种商用终端产品。

在嵌入式系统学习过程中设计到了Bootloader,下面讲述了Bootloader的基本作用,在后续的文章中我将对如何编写自己的Bootloader进行介绍。1.Bootloader的基本概念:简单地说,bootloader就是在操作系统内核运行前运行地一段小程序。通过这段小程序,可以对硬件设备,如CPU、SDRAM、Flash、串口等进行初始化,也可以下载文件到系统板、对Flash进行擦除和编程,真正起到引导和加载内核镜像的作用,但是随着嵌入式系统的发展,bootloader已经逐渐在基本功能的基础上,进行了扩展,bootloader可以更多地增加对具体系统的板级支持,即增加一些硬件模块功能上的使用支持,以方便开发人员进行开发和调试。从这个层面上看,功能扩展后bootloader可以虚拟地看成是一个微小的系统级的代码包。bootloader是依赖于硬件而实现的,特别是在嵌入式系统中。不同的体系结构需求的bootloader是不同的;除了体系结构,bootloader还依赖于具体的嵌入式板级设备的配置。也就是说,对于两块不同的嵌入式板而言,即使它们基于相同的CPU构建,运行在其中一块电路板上的bootloader,未必能够运行在另一块电路开发板上。BootLoader最为系统复位或上电后首先运行的代码,一般应写在起始物理地址0x0开始。Bootloader的启动过程可以是单阶段的,也可以是多阶段的。通常多阶段的bootloader能提供更为复杂的功能,以与更好的可移植性。从固态存储设备上启动的bootloader大多数是二阶段的启动过程,也即启动过程可以分为stage1和stage2两部分。2.ARMBootloader的一般作用对于一个ARM系统来说,本质上,bootloader作为引导与加载内核镜像的“工具”,在实现上,必须提供以下几个功能,更确切地说,必须做到以下几点:(1)初始化RAM(必需):bootloader必须能够初始化RAM,因为将来系统要通过它保存一些Volatile数据,但具体地实现要依赖与具体的CPU以与硬件系统。(2)初始化串口(可选,推荐):bootloader应该要初始化以与使能至少一个串口,通过它与控制台联系进行一些debug的工作;甚至与PC通信。(3

n启动内核镜像(必需):根据内核镜像保存的存储介质不同,可以有两种启动方式:FALSH启动以与RAM启动;但是无论是哪种启动方式,下面的系统状态必须得到满足:l

CPU寄存器的设置:

R0=0;

R1=机器类型;

R2=启动参数标记列表在RAM中的起始地址;

这三个寄存器的设置是在最后启动内核时通过启动参数来传递完成的。l

CPU模式:

关闭中断;属于SVC模式;Bootloader中没有必要支持中断的实现,这属于内核机制以与设备驱动管理的管理范畴;SVC模式是系统的一种保护模式,这样就可以进行一些只能在SVC模式下的操作,例如一些特定寄存器访问操作。l

Cache和MMU的设置:

MMU必须关闭;数据cache必须关闭;指令cache可以关闭也可以开启;Bootloader中所有对地址的操作都是使用物理地址,是实在的实地址,不存在虚拟地址,因此MMU必须关闭。Bootloader主要是装载内核镜像,镜像数据必须真实写回SDRAM中,所以数据cache必须关闭;而对于指令cache,不存在强制性的规定,但是一般情况下,推荐关闭指令cache。

Bootloader启动内核镜像的方法是通过跳转语句直接跳转至内核镜像的第一句指令语句。

Bootloader存在的必要性Bootloader的功能决定了在引导Linux系统时,必须使用bootloader,除非你对linux内核进行了修改。Bootloader有两个主要功能:1.在发布模式,自动引导linux系统,为系统初始化各种参数。2.在调试模式,要能够方便的下载内核,引导内核。Linux系统一定要bootloader支持吗?答:是的。通用的Linux内核,启动时需要很多参数,这些参数必须通过bootloader传递。而且内核一般是压缩存放到外存上的,从外存到内存的拷贝也是由bootloader完成。Bootloader为什么不和kernel放到一起呢?答:不可以这样做。从bootloader的第二个功能就知道,bootloader是不能和内核放到一起。当然,在发布模式时,是可以集成到一起的,通常没必要。从哪里可以得到bootloader?答:目前通用的bootloader很多,不论是嵌入式还是桌面系统,比如lilo,grub,blob等。桌面用的bootloader我们就不讨论了,重点说一下嵌入式领域用的bootloader。采用通用的bootloader功能强大,开发容易,而且由专人维护升级,不过多是针对特定的CPU或者特定开发板的。如果是学习,推荐自己开发bootloader。如何编写自己的bootloader?答:编写一个bootloader只要能够完成前面提到的两个功能就可以了。分别描述一下这两个功能的实现:1.该功能比较简单,就是从FLASH中拷贝数据到RAM。如果内核的存放不是基于文件系统的,直接采用汇编就可以完成块拷贝。然而如果内核存放在文件系统之上,比如内核存放到了基于ext2文件系统的CF卡上。首先我们的bootloader要能够访问CF卡,然后要能够识别文件系统,只有这样才能正确找到内核文件并拷贝到内存中。2.该功能一般通过串口实现。对于ARM来说,驱动串口比较容易,直接从主机的串口接收内核数据存放到RAM中,就可以启动内核了。如果需要发布,还要实现把内核从RAM烧写到外存的能力。为了提高速度,充分挖掘开发板和CPU的潜力,出现了许多用网口和USB接口下载内核的bootloader。使用网口,bootloader必须提供网卡驱动和TCP/IP协议的支持。使用USB接口,需要提高大容量存储类驱动。为了拓展思路,你也可以使用红外,存储卡接口进行数据下载。使用红外接口,和串口基本一样,无非就是没有了连线。使用存储卡,通常需要文件系统的支持。比如,我们使用SD卡存放内核,在主机交叉编译好内核后,把内核存放到SD卡上。然后将XD卡插到目标板的插槽中,bootloader必须有能力把SD卡上的内核拷贝的RAM中,过程参考功能1的实现。Background]

-几乎所有的嵌入式系统都需要用外部存储器

-最终的设计不可能用DemoBoard,肯定都要重新画PCB

-DDRMemoryController是一个挺复杂的系统,移植起来比较麻烦

[Question]

怎样移植现有设计的MemroyController到定制PCB板上?

[Solution]

-此文针对EDK10.1SP3MPMC4.03MIG2.3

-MPMC提供两种PHY-

MIG

PHY和STATICPHY。

MIG

PHY可以达到比较高的performance,移植也相对困难。STATICPHY使用DCMPHASESHIFT功能来调校时序,调校一次后可以把数值固定下来以后就不必调了,缺点是速度只能达到100-125MHz。

-Port的经验主要参考MPMCDatasheetP43MemoryInterfaceGenerator(MIG)BasedPHYInterface和

P47Converting

MIG

UCF

to

MPMCv.4

UCF,另外AR29221虽然AR是针对Spartan3的,但是Virtex系列也很有参考意义。

-使用MIG

PHY需要遵循特定的管脚分配规则。-参考UG086-SectionVI.MemoryImplementationGuidelines

-自己调整过的管脚分配需要在MIG中Verify。

-MPMC提供perl语言将MIG的UCF根据MHS中MPMC的引脚名字转换成相应的UCF,Virtex-5DDR2PHY需要设置C_MEM_DQS_IO_COL和C_MEM_DQ_IO_MS

-调整MPMC的Parameter,比如C_MEM_PARTNO等

-

MIG

PHY不需要任何软件设置,自动会做Calibration。如果过不了MemoryTest或读写不正常,那么首先把MPMC_InitDone引到LED上观察初始化有没有完成。

-如果MIG

PHY初始化不能自动完成,可以参考UG086SectionV.DDR2DebugGuide的debugflow来查找关键信号,比如calib_start,calib_done等。或者试用STATICPHY

-STATICPHY的用法在MPMCdatasheet中有详细介绍。主要步骤为:

0.在UCF中定义好管脚位置。

1.MPMCPARAMETERC_USE_STATIC_PHY=1

2.取消MPMC_Clk_200MHzPORT的连接

3.根据Datasheet中StaticPHYImplementation-->DCMPhaseAdjustPort的说明修改MHS文件,添加一个DCM,连接MPMC_DCM_PSINCDEC,MPMC_Clk0,MPMC_Clk_Mem等信号并调整LOCKED信号。

4.将MPMC_CTRLBus连接到系统的PLB46总线上。这个总线用于控制StaticPHY的控制寄存器。

5.根据Datasheet中StaticPHYImplementation-->TimingConstraints在UCF中添加时序约束。

6.添加一个SWApplication,内容为\sw\XilinxProcessorIPLib\drivers\mpmc_v2_00_a\examples\mpmc_calibration_example.c,放在BRAM中,所需空间大约为10K。

7.这个calibrationexample会自动找到所需设置的phaseshift值,记下来并填在DCM的C_PHASE_SHIFT参数中。

-如果还是有问题,仔细查看ngdbuild/map/parreport的warning,从中查找信息。通常staticphy都是可以用的。

-我犯过的一个错误:在UCF编辑管脚的时候,把CAS管脚写成了CS管脚,结果有一个CS管脚的定义被overwrite,怎么都不能完成calibrate,XMDmrd读取同一个地址的的数据永远都不一样。通过检查ngdbuildreport发现这个warning,于是通过staticphy,也通过了MIG

PHY。

-另一个错误:V5DDR2Place报错引用Place:292-Thecomponentsu_system/mpmc_0/mpmc_0/mpmc_core_0/gen_v5_ddr2_phy.mpmc_phy_if_0/u_phy_i

o_0/gen_dq[28].u_iob_dq/stg3b_out_falland

u_system/mpmc_0/mpmc_0/mpmc_core_0/gen_v5_ddr2_phy.mpmc_phy_if_0/u_phy_io_0/gen_dq[29].u_iob_dq/stg3b_out_fallseem

to

beplaced/locked

to

thesamesite

SLICE_X0Y138

是由于没有设置C_MEM_DQS_IO_COL和C_MEM_DQ_IO_MS引起的。

-

MIG太复杂,通常来讲不推荐自己改代码。因此感觉就算查了MIG

PHY的关键信号帮助也不太大。绝望时仔细查查AnswerRecord,试一试StaticPHY。

项目需要MicroBlaze1将采集到的大批数据缓存到SDRAM中,然后再通知MicroBlaze0将该数据读出再通过Ethernet接口送给PC。由于特殊原因,FPGA在一块现成的控制卡上,需要将该卡插到我们的母板上。但是该控制板最初的设计是用来控制电机的,所以根本就没考虑过什么端接电阻匹配和等长这些问题,给项目带来了意想不到的问题。所以以后做SDRAM控制的时候,硬件上一定要提前考虑好,这样的话后期逻辑的设计就会省事多了,特别是做DDR的设计。言归正传,还是看怎么倒腾这块控制卡吧,当然母板设计的时候考虑了等长和匹配,但只是母板上。

什么都不动的情况下用MPMC来访问SDRAM,最高只能跑到80MHz,与客户最低100MHz最好125MHz的时钟需求差距还很大。首先从硬件上考虑,做到阻抗匹配,将控制卡上与SDRAM连接的所有端口上已有的电阻去掉(有的没有,有的有,还不一样33,100)。结果并不是很理想,但是在现有的这样的硬件条件下,可改的就这些电阻了,除非重新做板。看来只好在MPMC控制器和约束上做文章了。

首先添加了DRIVE约束,试了4,8,12下发现8的时候示波器看到波形效果最好(太大会导致过冲较大,太小会导致上升时间变长)。至此SDRAM访问频率达到了90MHz,但是还是不能满足客户需求。

给MPMC时钟引脚添加SLEW=FAST约束发现时钟频率可以达到了100MHz,并进行了全容量测试没有问题。所以感觉还是时钟的问题,毕竟MPMC输出的时钟的原则上的上升沿是对准数据和控制数据的中间的,保证数据被正确采集。但是由于硬件设计的原因致使可用采集窗口变窄,致使无法正确采集到数据。

上面的结果使得P1的母板能够工作在100MHz频率下,但是P2的板子回来以后发现可能是做工的原因导致P2的板子读写数据个别位不一致。真是头疼加郁闷。没办法,还得继续想办法。结合前面的调试,数据、地址和控制线无法再做调整,除非加IODELAY(这个工作量太大)。还是从时钟上想办法,10.0.3版本EDK上的MPMC控制器的时钟是不能够调整相位的,也就是说除了MPMC内部对时钟进行了180度相移外,用户无法再进行调整。所以只好不用MPMC提供的时钟,自己用DCM来产生时钟,并且利用DCM相位可调的功能调整输出的时钟相位(这种方法Xilinx网站上也有介绍,从11版本后的MPMC输出时钟据说可调相位了,没有用过还)。经过大量的测试终于找到了能够100MHz工作的窗口。至此彻底解决该问题。

经验总结:

1、对SDRAM访问关键是硬件设计时要考虑好;

2、适当的添加约束能使改善工作频率

3、通过调整时钟相位可以手动找到数据访问窗口,改善工作频率Spi配置SPI(SerialPeripheralInteRFace,串行外围设备接口)是一种高速、全双工、同步的通信总线,在芯片的引脚上只占用4根线,不仅节约了芯片的引脚,同时在PCB的布局上还节省空间。正是出于这种简单、易用的特性,现在越来越多的芯片集成了这种通信协议。1SPI配置介绍1.1Spantan-3ESPI配置流程SPI方式是通过符合SPI接口时序的第三方SPIFlash对FPGA进行加载。它适合作为FPGA硬件结构的bit文件保存介质,如果应用软件工程编译后的代码较小,保存在同一片SPIFLash中(即复用SPIFlash)无疑是可行的最廉价方案。由于本没计软件工程规模较小,所以利用此复用SPIFlash方式对FPGA进行配置,既保存FPGA配置的bit文件,也保存应用软件工程的bit文件。系统在上电或向PROG_B引脚发出低脉冲后,FPGA芯片经过一个初始化序列清空内部FPGA配置存储器。此序列开始时,DONE和INIT_B引脚均转为低。初始化完成后,INIT_B引脚转为高,并采样芯片的配置模式与变量选择引脚。SPI模式下,FPGA对变量选择(VS[2:0])引脚采样,以确定发出哪个SPI命令序列。当初始化之后发出INIT_B信号时,模式引脚和变量选择引脚都必须处在正确的逻辑级,以确保正确采样。在变量选择引脚选择SPI命令集之后,FPGA将CSO_B选择信号置为低,并且开始通过FPGA的CCLK引脚对SPIFlash存储器进行时钟控制。接着发出8位读命令后跟24位起始地址0x000000和目标命令集的适量虚拟字节。FPGA从地址0开始读取SPIFlash存储器阵列,直到读完所需的配置位数。如果从存储器件读取到有效比特流,则发DONE信号,以指示FPGA配置成功。图1为SPI配置方式的时序。图2是AT45DB161DSPIFlash的配置接口。这种配置方式只占用了FPGA芯片的4个引脚,而且配置成功之后,所有SPI引脚都成为可用的用户I/O引脚,这就节省了FPGA的引脚资源。1.2SPIFlash存储器的复用复用SPIFlash是指既用它来保存硬件配置文件、Bootloader引导程序还用来保存用户应用程序。在加载阶段,FPGA自动从SPIFlash中读取硬件配置bit文件与Bootloader程序进行配置到片内BRAM中运行。当完成加载后,FPGA内部逻辑启动,通过运行的Bootloader程序读取SPIFlash中的用户应用程序,并写到外部SDRAM的相应位置,最后Bootloader程序切换指令指针到SDRAM指定位置,在外部的SDRAM中开始执行应用程序。图3给出了本系统中复用SPIFlash嵌入式系统结构图,用EDK中的opb_sdram连接外部SDRAM,用opb_spi连接SPIFlash(AT45DB161D),通过Bootloader软件程序实现从SPIFlash中复制用户应用程序到SDRAM中,然后在SDRAM中运行。但是,Boot-loader在系统上电时会通过FP-GA芯片的配置引脚首先加载到BRAM中运行,这样就可以实现上电自动加载启动程序。2Bootloader引导程序的设计在工程代码编写之前要求对硬件器件有所了解,主要需要了解FPGA所需要的配置文件空间,还有Flash存储结构。例如:XC3S500E配置文件空间为2270208位,所以要根据它计算存储应用程序的基地址。AT45DB161D是串行接口的闪存芯片,它包含有17301504位,被组织为4096页,每页512/528字节。除了主存储器,AT45DB161D还包括2个SRAM数据缓冲区,每个缓冲区512/528字节。在主存储器正在编程时,缓冲区是允许接收数据的,并且支持数据流式写入。(此处为528字节/页)AT45DB161D的存储器阵列分为3个级别的粒度,分别为扇区、块与页。图4对各个级别进行了分析,详细说明了每个扇区与块的页数。所有的编程操作都是针对页的。擦除操作可以作用于芯片、扇区、块或页。最后利用定义的空函数int(*boot_app_jump)(void);”将地址指针指向内存的应用程序基地址,使其从此处开始运行程序。//将目的地址赋给跳转函数boot_app_jump=(int(*)(void))DESTINATION_AD-DR;//运行跳转函数,使其在该函数地址开始运行程序boot_app_jump();3SPIFlash软件引导过程与SPIFlash编程本实验使用简单的应用程序(打印hello_world),即工程“hello_world”。工程serial_Flash_bootloader就是上面设计的引导程序。

3.1编译用户应用程序的二进制文件由于应用程序要在外部SDRAM中运行,所以不需要初始化BRAM存储器,如图5所示。为了指明程序的开始地址和应用程序的可执行文件的产生路径,需要在编译选项中设置。右键“应用程序工程”,SetCompilerOptions在OutputELFfile中选择可执行文件的产生路径,如XC3S500E\hello_world\hello_world.elf,在ProgramStartAddress中键入程序执行的起始地址(这里是SDRAM的基地址:0x90000000)。接下来编译应用程序工程,编译完成后就会在XC3S500E\hello_world文件夹中产生hello_world.elf。为了后面对SPIFlash编程的需要,应将elf转变成二进制形式的文件。这就需要利用cygwinshell窗口命令来完成,这个脚本提供了一个简单的命令实现这个目的。利用mb-objcopy-Obinary<options><ELF><bi-naryoutput>命令就可以将elf转变成二进制形式的文件(.b文件)。例如:mb-objcopy-Obinary./helloworld/helloworld.elf./hello_world/hello_world.b用来在工程目录下hello_world文件夹创建工程的一个hello_world.b的二进制文件。生成的文件hello_world.b大约2KB左右。3.2Bootloader引导程序与硬件配置文件的生成serial_Flash_bootloader要初始化到BRAM中(即在“工程”上右键→BRAMInitializationandunmarka11)。这样做的意义是在编译Bootloader程序时就将它编译后的执行文件(.elf文件)加入到硬件system.bit中生成一个download.bit。这个文件既包含了系统硬件配置信息,又包括了Bootloader程序执行文件。由于设置了初始化到BRAM中,所以在系统上电时才能使Bootloader程序自动加载到片内BRAM中运行,实现程序的引导功能。只要利用EDK用软件中downloadbitstram功能就可以实现上述功能。3.3编写SPIPROM文件本部分提供为SPIFlash存储器创建PROM文件的指导原则。在将生成bitstram.bit比特流转换成SPI格式PROM文件之前,设计人员必须确认该比特流是用bitg-en-gStartupClk:Cclk选项生成的。此选项使启动顺序与Spartan-3E内部时钟同步,从而确保FPGA功能正常。①将硬件配置和serial_Flash_bootloader引导程序的bitstrem.bit转换为MCS格式文件。②将前面得到的应用程序的二进制文件(hello_world.b)转换为MCS格式文件。③将以上得到了2个MCS文件合成1个MCS文件。④编程SPIFlash芯片。以上过程,除了③以外,Xilinx公司的iMPACT编程软件都可以实现。③要由DOS命令完成。所以下面都是以DOS命令来完成编程的全过程。再使用DOS命令完成格式化和编程之前,要对down-load.bit、应用程序、spiPartNam和spi_offset参数进行设置,以便XSPI软件程序能对用户要求加以识别。如下:setbitstream=../implementation/download.bitsetapplication="hello"_worldsetspiPartName="AT45DB161D"//SPIFlash器件的名称setspi_offset=0x63000//hello_world的应用程序就会从//Flash中0x63000地址向上存放,引导程序也是从这里开始加载//到SDRAM中的接下来就是执行转换的命令。第1步:REMStep1.Convertdownload.bittomcsimpactconvert_bits_to_mcs.cmd此命令将硬件配置和serial_Flash_bootloader引导程序的bitstrem.bit转换为MCS格式文件。第2步:REMStep2.Convertbinaryapplicationtomcs

xmcsutil-accept_notice-i%application%.b-o%appli-cation%.mcs-29完成了应用程序(hello_world)的二进制文件(hello_world.b)转换为MCS格式文件。第3步:REMStep3.combineapplicationmcswithbitstreammcsxmcsutil-accept_notice-ibitstream.mcs%applica-tion%.mcs-ocombined.mcs-16-segaddr0x00%spi_off-set%-usedataaddr-padff这个命令将以上得到了的MCS文件合成一个MCS文件。第4步:REMStep4.ProgramtheAT45DB161Dxip-accept_notice-skip_syncword_check-mcs-spi_epv-icombined.mcs-overify.txt-select_cable1完成对SPIFlash芯片编程。此命令使用轮询擦除SPI内容,然后对SPI器件的内容进行编程和验证。任何验证不匹配项都记录在result.out文件中。默认情况下,XSPI认定数据是HEX格式。如果输入文件是HEX格式,则去除-mcs选项。Xilinx软件工具iMPACT从Spartan-3E比特流生成SPI格式PROM文件。SPI存储器件首先串行输出数据的MSB字节,而XilinxPROM则首先输出数据的LSB。与标准XilinxPROM文件相比,SPI格式PROM文件在每字节内有位反转,因此,需要在PROMgen中使用-spi选项才能正确格式化。XSPI支持.hex和.mcs两种SPIPROM文件格式。以下所示为生成SPI格式.mcs文件的PROMGen命令行操作的示例。要生成SPI格式PROM文件.hex,请用-Phex替换-pmcs选项开关。结语本文介绍的是SPIFlash存储器的复用编程方法的实现。在应用程序不是很大时,可以使用此方法复用SPIFlash存储器,减少外围电路,但是配置时间较长。在不要求配置时间的基础上,可以考虑使用SPI配置模式。分页烧写Flash多页程序并行自举方法

发布时间:2009-6-610:40:13

TI公司的DSP芯片\o"IC库存:TMS320Vc5410"TMS320Vc5410(简称5410)是性能卓越的低功耗定点DSP,在嵌入式系统中有着广泛的应用。5410没有自带的片上非易失性存储器,因此需要外部的非易失性存储介质,如\o"IC库存:EPROM"EPROM或\o"IC库存:Flash"Flash,来存储程序和数据。5410片内有64K字RAM,由于在片内RAM运行程序比片外运行有高速度低功耗等显著优点,通常上电后都需要从片外\o"IC库存:EPROM"EPROM或\o"IC库存:Flash"Flash上加载程序到片内RAM,但是芯片自带的自举程序(简称BootLoader)只支持32K字以内的外部程序加载,因此程序设计往往局限于32K字空间内,限制了编程的灵活性,不能充分发挥5410的性能。当程序空问大于32K字时,就需要自己编写程序来实现自举。下面首先介绍使用5410对\o"IC库存:Am29LV200B"Am29LV200B\o"IC库存:Flash"Flash存储器进行程序分页烧写的方法,然后重点介绍利用Bootloader来编程实现多页并行自举引导的方法。

1

\o"IC库存:Am29LV200B"Am29LV200B

Flash存储器的分页烧写

1.1

\o"IC库存:FIash"FIash

存储器简介

\o"IC库存:Am29LV200B"Am29LV200B(简称Flash)是AMD公司生产的Flash存储器,主要特点有:3V单电源供电,可内部产生高电压进行编程和擦除操作;支持JEDEC单电源Flash存储器标准;只需向其命令寄存器写人标准的微处理器指令,具体编程、擦除操作由内部嵌入的算法实现,并且可以通过查询特定的引脚或数据线监控操作是否完成;可以对任一扇区进行读、写或擦除操作,而不影响\o"IC展台:其他"其他部分的数据。文中128K×16位A

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论