软件加解密(在50m的频率下使用软件来进行加解密)与硬件加解密时间做了对比:如表3所示。该方案充分有效的利用了spartan3e的资源,尤其为可编程逻辑和ram的利用。其中aes加解密中的乘法运算均由lut查找表来实现,用空间换取时间,获得了很高的算法速度。在aes算法测试时我们发现80%的aes加解密时间都用于密钥扩展算法中,如果能再进一步把算法优化,比如做成流水线的算法模式的话,加解密时间又能减少近20%,即由现在的6.74us减少到略大于5.39us,效率又可以增加很多。
fpga是通过逻辑组合电路来实现各种功能的器件。由于fpga内部集成了大量的逻辑资源和可配置的i/o引脚,加上独特的并行处理架构,可以轻松实现同时对多个外部设备的配置和管理,以及内外各种接口数据的传输。现在开发厂商又在fpga内部加入了大量的dsp和blockram资源,非常适合图像处理、数字信号处理等运算密集的应用,因此在这些领域取得了广泛的应用。但是由于fpga程序编写的灵活性和功能的多样性,使得它在一个复杂工程中对各个程序的使用调度、统筹管理上有很大的局限性,这样就引入操作系统进行统一的管理。linux系统则因为其良好的可裁减、可配置等特点在嵌入式领域应用广泛。linux操作系统提供了许多系统级的应用,例如网络协议的实现、进程调度、内存管理等,同时linux是一个成熟的开源操作系统,有丰富的应用资源,利用这些资源和强大的系统功能,用户可以快速地开发基于嵌入式环境复杂系统。因此,结合fpga和linux双方优势,可以很好地满足嵌入式系统设计需求,量体裁衣,去除冗余。本文给出了一种基于xilinxfpga的嵌入式linux操作系统解决方案。
本设计是基于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需要完整的电源回路做参考,电源层划分时也要特别注意,其他电路做常规处理就可以了。
首先需要调用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操作系统需要利用edk软件提供的板级包(bsp)配置内核。bsp包含了所选定处理器架构的属性文件以及相关硬件的驱动源文件。首先要在edkprojectoption中projectperipheralresitory选项下设置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/)中加入下面内容:
$path=$path:/home/ppc/powerpc/eldk/usr/bin:/home/ppc/powerpc/eldk/binexportcross_compilepath把生成的zlmage.initrd文件通过edk软件下的xmd调试窗口,使用dowzlmage.initrd命令下载到ddr中,然后运行run命令,就正常启动linux了。