軟件加解密(在50m的頻率下使用軟件來進行加解密)與硬件加解密時間做了對比:如表3所示。該方案充分有效的利用了spartan3e的資源,尤其為可編程邏輯和ram的利用。其中aes加解密中的乘法運算均由lut查找表來實現,用空間換取時間,獲得了很高的算法速度。在aes算法測試時我們發現80%的aes加解密時間都用于密鑰擴展算法中,如果能再進一步把算法優化,比如做成流水線的算法模式的話,加解密時間又能減少近20%,即由現在的6.74us減少到略大于5.39us,效率又可以增加很多。
fpga是通過邏輯組合電路來實現各種功能的器件。由于fpga內部集成了大量的邏輯資源和可配置的i/o引腳,加上獨特的并行處理架構,可以輕松實現同時對多個外部設備的配置和管理,以及內外各種接口數據的傳輸?,F在開發廠商又在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內存,作為上電時操作系統的加載和運行空間?,F在主流的嵌入式操作系統,都需要搭建交叉編譯環境,把在主機上編寫好的可執行文件下載到目標板上,這就需要實現網絡數據的傳輸。由于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了。