你的位置:EETOP 赛灵思(Xilinx) 社区 >> >> 全部 >> 详细内容

基于FPGA的嵌入式Linux软硬件设计

发布者:jackzhang 时间:2011-04-15 21:17:50

本设计,除了在 EDK中搭建了操作系统必须的各种模块后,还需要在ISE中编写各个时序电路程序,因此把 EDK中编写好的工程作为一个模块,加入到ISE中,然后统一编译,这样生成了我们需要的完整功能的程序。特别指出的是,PPC405数据地址采用的是大端模式,接入到ISE中时,需要把数据颠倒位置,如DATA[0:31]变为DATA[31:0],才能正常读写。

Linux操作系统的加载与烧写

加载Linux操作系统需要利用EDK软件提供的板级升级包(BSP)配置内核。BSP 包含了所选定处理器架构的属性文件以及相关硬件的驱动源文件。首先要在EDK Project Option 中Project Peripheral Respository选项下设置Xilinx提供的 gen-mhs-devtree/edk_lib 库路径,然后在软件平台设置中选择Dts模式,编译更新升级包,生成.dts配置文件。Dts文件包含了所有模块地址分配,中断以及驱动信息,把他加入到Linux 内核中,然后配置内核选项选择对应的处理器架构、所选硬件的驱动模块以及需要的其他内核模块,之后再对完成配置的内核进行编译,生成Linux 的内核image 文件。生成内核image 文件之后,还需要生成系统运行所需要的根文件系统。根文件系统中包含了嵌入式Linux系统的所有应用程序、库以及系统配置等相关文件。根文件系统中常用的程序和命令可利用开源软件Busybox构造。构造完成之后,在Busybox 生成的目录和文件的基础上再构造根文件系统的目录树,并添加相关设备文件和配置文件以及系统运行时需要的脚本文件, 从而形成最终的根文件系统,ramdisk.image。把他拷贝到内核中的../arch/powerpc/boot目录下,在linux2.6.x根目录下运行make zlmage. initrt,生成最终的系统文件。需要指出的是,在编译linux内核时,需要设置好交叉编译环境:首先安装ELDK编译软件,然后在编辑自己的帐户目录下的 .bashrc (例如:/home/ppc/) 中加入下面内容:

CROSS_COMPILE=ppc_4xx
$PATH=$PATH:/home/ ppc /PowerPc/ELDK/usr/bin:/home/ ppc /PowerPc/ELDK/binexport CROSS_COMPILE PATH

保存,然后执行$source .bashrc

把生成的zlmage.initrd 文件通过 EDK 软件下的XMD调试窗口,使用dow zlmage.initrd命令下载到DDR中,然后运行 run命令,就正常启动Linux了。

程序下载到 DDR中,掉电后,数据就丢失了,不能保存和连续使用,因此要把操作系统烧写到FLASH,上电后让它能自动运行,掉电后也不会丢失。EDK提供了专门的FLASH 烧写工具Program Flash Memory,首先要把zlmage.initrd文件转换为FLASH能识别的.SREC文件,需要在EDK Shell下运行下面命令:

$powerpc-eabi-objcopy –I elf32-powerpc –O srec zImage.initrd.srec

第一次烧写FLASH时需要把Program Flash Memory中Create Flash Bootlooder Application 勾上,让系统自动生成Bootlooder程序。操作系统烧写到Flash中后,需要FPGA在上电后自动从FLASH读取操作系统数据,然后自动运行,这几需要把刚刚生成的bootloadr_0工程中的.elf加入到.bit生成新的配置文件,使用EDK下的Updata Bitstream命令就能实现。最后把生成的.mcs文件烧写到FPGA PROM中,上电后,系统就能自动运行了。

设计结果与分析

在Linux系统正常加载后,我们设计一个程序,它通过以太网,从上位机获得数据,存入FPGA内部BlockRam中,再在ISE中编写程序,把获得的数据取出,产生频率可变的波形发生器,并回传发送的参数给上位机。

通过实验证明,在FPGA加入操作系统后,能轻松实现网络数据的收发,并通过FPGA自身的逻辑,产生我们需要的各种控制信号,做到了系统的统一调度和各个功能的并行处理,发挥了操作系统和FPGA各自的优势。但是也发现,FPGA下操作系统运行的频率不高,最多600MHz,中断响应间隔较长,大约3ms左右,系统上电启动时间较长,大约40s左右,这些都需要在今后设计中进一步完善和提升。

结语

本文介绍了基于FPGA的嵌入式Linux设计流程,从硬件设计到Linux系统加载,再到应用程序运行整个过程,从中可以看出,该设计既发挥了FPGA并行处理和多时序控制上的优势,也发挥了嵌入式Linux系统调度和可裁剪性方面的优势,还提高了这个系统的稳定行,也减少了FPGA 与外部高速总线连接的资源开销,二者的结合, 既满足了嵌入式应用按需定制、量体裁衣的需求, 又能开发出稳定而功能强大的嵌入式系统,在现在嵌入式系统开发中有很好的运用。

FPGA是通过逻辑组合电路来实现各种功能的器件。由于FPGA内部集成了大量的逻辑资源和可配置的I/O引脚,加上独特的并行处理架构,可以轻松实现同时对多个外部设备的配置和管理,以及内外各种接口数据的传输。现在开发厂商又在FPGA 内部加入了大量的DSP和Block RAM资源,非常适合图像处理、数字信号处理等运算密集的应用,因此在这些领域取得了广泛的应用。但是由于FPGA 程序编写的灵活性和功能的多样性,使得它在一个复杂工程中对各个程序的使用调度、统筹管理上有很大的局限性,这样就必须引入操作系统进行统一的管理。Linux 系统则因为其良好的可裁减、可配置等特点在嵌入式领域应用广泛。 Linux操作系统提供了许多系统级的应用,例如网络协议的实现、进程调度、内存管理等,同时Linux 是一个成熟的开源操作系统,有丰富的应用资源,利用这些资源和强大的系统功能,用户可以快速地开发基于嵌入式环境复杂系统。因此,结合FPGA和Linux双方优势,可以很好地满足嵌入式系统设计需求,量体裁衣,去除冗余。本文给出了一种基于Xilinx FPGA的嵌入式Linux操作系统解决方案。

基于FPGA的嵌入式系统的硬件设计

本设计是基于Xilinx XC4VFX40系列 FPGA,它内部集成了两个PowerPC405处理器, 4个10/100/1000M以太网MAC模块,运行频率300MHz时,具有420D-MIPS性能,能解决高速网络数据传输问题,并且能解决通过网络加载操作系统和交叉编译等问题。它内部有448个可配置I/O口,2592kb BlockRAM,能实现对各种外部设备的并行控制以及较多数据的存储与处理。加载一个操作系统,一般需要几十兆的内存空间,FPGA内部自带的RAM空间是远远不够的,本设计在板上扩展了两片MICRON公司的256Mb DDR内存,作为上电时操作系统的加载和运行空间。现在主流的嵌入式操作系统,都需要搭建交叉编译环境,把在主机上编写好的可执行文件下载到目标板上,这就需要实现网络数据的传输。由于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-Memory Controller模块,需要设置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 包含了所选定处理器架构的属性文件以及相关硬件的驱动源文件。首先要在EDK Project Option 中Project Peripheral Respository选项下设置Xilinx提供的 gen-mhs-devtree/edk_lib 库路径,然后在软件平台设置中选择Dts模式,编译更新升级包,生成.dts配置文件。Dts文件包含了所有模块地址分配,中断以及驱动信息,把他加入到Linux 内核中,然后配置内核选项选择对应的处理器架构、所选硬件的驱动模块以及需要的其他内核模块,之后再对完成配置的内核进行编译,生成Linux 的内核image 文件。生成内核image 文件之后,还需要生成系统运行所需要的根文件系统。根文件系统中包含了嵌入式Linux系统的所有应用程序、库以及系统配置等相关文件。根文件系统中常用的程序和命令可利用开源软件Busybox构造。构造完成之后,在Busybox 生成的目录和文件的基础上再构造根文件系统的目录树,并添加相关设备文件和配置文件以及系统运行时需要的脚本文件, 从而形成最终的根文件系统,ramdisk.image。把他拷贝到内核中的../arch/powerpc/boot目录下,在linux2.6.x根目录下运行make zlmage. initrt,生成最终的系统文件。需要指出的是,在编译linux内核时,需要设置好交叉编译环境:首先安装ELDK编译软件,然后在编辑自己的帐户目录下的 .bashrc (例如:/home/ppc/) 中加入下面内容:

CROSS_COMPILE=ppc_4xx
$PATH=$PATH:/home/ ppc /PowerPc/ELDK/usr/bin:/home/ ppc /PowerPc/ELDK/binexport CROSS_COMPILE PATH

保存,然后执行$source .bashrc

把生成的zlmage.initrd 文件通过 EDK 软件下的XMD调试窗口,使用dow zlmage.initrd命令下载到DDR中,然后运行 run命令,就正常启动Linux了。

程序下载到 DDR中,掉电后,数据就丢失了,不能保存和连续使用,因此要把操作系统烧写到FLASH,上电后让它能自动运行,掉电后也不会丢失。EDK提供了专门的FLASH 烧写工具Program Flash Memory,首先要把zlmage.initrd文件转换为FLASH能识别的.SREC文件,需要在EDK Shell下运行下面命令:

$powerpc-eabi-objcopy –I elf32-powerpc –O srec zImage.initrd.srec

第一次烧写FLASH时需要把Program Flash Memory中Create Flash Bootlooder Application 勾上,让系统自动生成Bootlooder程序。操作系统烧写到Flash中后,需要FPGA在上电后自动从FLASH读取操作系统数据,然后自动运行,这几需要把刚刚生成的bootloadr_0工程中的.elf加入到.bit生成新的配置文件,使用EDK下的Updata Bitstream命令就能实现。最后把生成的.mcs文件烧写到FPGA PROM中,上电后,系统就能自动运行了。

设计结果与分析

在Linux系统正常加载后,我们设计一个程序,它通过以太网,从上位机获得数据,存入FPGA内部BlockRam中,再在ISE中编写程序,把获得的数据取出,产生频率可变的波形发生器,并回传发送的参数给上位机。

通过实验证明,在FPGA加入操作系统后,能轻松实现网络数据的收发,并通过FPGA自身的逻辑,产生我们需要的各种控制信号,做到了系统的统一调度和各个功能的并行处理,发挥了操作系统和FPGA各自的优势。但是也发现,FPGA下操作系统运行的频率不高,最多600MHz,中断响应间隔较长,大约3ms左右,系统上电启动时间较长,大约40s左右,这些都需要在今后设计中进一步完善和提升。

结语

本文介绍了基于FPGA的嵌入式Linux设计流程,从硬件设计到Linux系统加载,再到应用程序运行整个过程,从中可以看出,该设计既发挥了FPGA并行处理和多时序控制上的优势,也发挥了嵌入式Linux系统调度和可裁剪性方面的优势,还提高了这个系统的稳定行,也减少了FPGA 与外部高速总线连接的资源开销,二者的结合, 既满足了嵌入式应用按需定制、量体裁衣的需求, 又能开发出稳定而功能强大的嵌入式系统,在现在嵌入式系统开发中有很好的运用。


最新课程

  • 深入浅出玩儿转FPGA

    本视频基于Xilinx公司的Artix-7FPGA器件以及各种丰富的入门和进阶外设,提供了一些典型的工程实例,帮助读者从FPGA基础知识、逻辑设计概念

  • 从零开始大战FPGA基础篇

    本课程为“从零开始大战FPGA”系列课程的基础篇。课程通俗易懂、逻辑性强、示例丰富,课程中尤其强调在设计过程中对“时序”和“逻辑”的把控,以及硬件描述语言与硬件电路相对应的“

  • Verilog基础及典型数字

    课程中首先会给大家讲解在企业中一般数字电路从算法到流片这整个过程中会涉及到哪些流程,都分别使用什么工具,以及其中每个流程都分别做了