基于嵌入式SoPC的以太網(wǎng)接口設(shè)備
SoC(片上系統(tǒng))的概念已日益普及,而隨著FPGA技術(shù)的迅速發(fā)展,可編程系統(tǒng)芯片(SoPC)作為一種特殊的嵌入式微處理器系統(tǒng),融合了SoC和FPGA各自的優(yōu)點(diǎn),并具備軟硬件在系統(tǒng)可編程、可裁減、可擴(kuò)充、可升級(jí)的功能,已逐漸成為一個(gè)新興的技術(shù)方向。SoPC的核心是在FPGA上實(shí)現(xiàn)的嵌入式微處理器核,目前主要有Xilinx公司的32位軟核MicroBlaze、32位PowerPC系列處理器硬核PowerPC 405,以及Altera公司的Nios系列微處理器軟核等。
本文介紹的系統(tǒng)是一個(gè)以PowerPC 405為微處理器,基于VME總線的以太網(wǎng)接口設(shè)備,它通過以太網(wǎng)和VME總線接口,實(shí)現(xiàn)VME系統(tǒng)與外部局域網(wǎng)的實(shí)時(shí)數(shù)據(jù)交換。
硬件開發(fā)
開發(fā)采用Xilinx公司的EDK7.1(嵌入式開發(fā)套件)和ISE7.1工具軟件。EDK工具包中集成了硬件平臺(tái)生成器(Platgen)、軟件平臺(tái)生成器(Libgen)、仿真模型生成器(Simgen)、軟件編譯器(Mb-gcc/ppc-gcc)和軟件調(diào)試工具(Mb-gdb/ppc-gdb)等,通過提供的集成開發(fā)環(huán)境XPS,用戶可以調(diào)用上述所有工具,來完成嵌入式系統(tǒng)開發(fā)的整個(gè)流程。
首先在XPS界面環(huán)境下生成硬件系統(tǒng)框架并添加所需的IP核,也可以用文本編輯器直接編寫硬件描述文件 (.MHS文件),再調(diào)用Platgen將其生成嵌入式處理系統(tǒng)的網(wǎng)表文件(.NGC文件);然后通過系統(tǒng)生成或手工編輯的軟件描述文件(.MSS文件)來設(shè)置系統(tǒng)軟件配置,并調(diào)用Libgen生成驅(qū)動(dòng)層和庫(kù)。雖然EDK的IP庫(kù)中有一些很有用的功能模塊和外設(shè)接口的IP核,如DCM(數(shù)字時(shí)鐘管理器)、處理器復(fù)位、PLB/OPB總線接口、外部存儲(chǔ)控制器(EMC)、UART、GPIO、中斷控制器、定時(shí)器等,充分利用這些資源就可以構(gòu)建一個(gè)較為完善的嵌入式微處理器系統(tǒng),但是對(duì)于許多有特殊專用電路的嵌入式計(jì)算機(jī)系統(tǒng)的應(yīng)用還是不夠的。如何將用戶專用電路設(shè)計(jì)到EDK系統(tǒng)中,一般有兩種方法,第一種是將EDK工程作為一個(gè)子系統(tǒng)在XPS中用Export to PorjNav生成ISE工程,然后在ISE中將專用電路和處理器子系統(tǒng)(system.vhd)合成為頂層HDL文件(system_stub.vhd)后,在ISE中完成綜合布線,最后在XPS中用Import from PorjNav得到硬件的.bit文件,便可以回到XPS中完成和應(yīng)用軟件的合成、下載和調(diào)試了。第二種方法是將專用電路設(shè)計(jì)成為用戶自定義的IP Core,然后直接在系統(tǒng)中調(diào)用來實(shí)現(xiàn)。自定義的IP Core用HDL設(shè)計(jì)并要滿足EDK的規(guī)范,如有專門目錄結(jié)構(gòu)和處理器外設(shè)定義文件(.MPD)、外設(shè)分析定義文件(.PAO)等。如果自定義的IP Core要具有軟件驅(qū)動(dòng),那設(shè)計(jì)還要完全符合相應(yīng)的PLB或OPB總線接口規(guī)范。完成了硬件和驅(qū)動(dòng)的設(shè)計(jì)后,就可以在XPS工程中添加應(yīng)用軟件項(xiàng)目并編寫應(yīng)用軟件,然后調(diào)用處理器對(duì)應(yīng)的編譯器編譯并和硬件綜合后生成的.bit文件合成后下載到目標(biāo)板便可以進(jìn)行調(diào)試了。
本系統(tǒng)硬件組成框圖如圖1所示。本設(shè)計(jì)選用Virtex-II Pro系列FPGA芯片XC2VP40,將系統(tǒng)的程序存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器都放在片內(nèi)用Block RAM來實(shí)現(xiàn),在系統(tǒng)中添加DCM模塊,將外部參考時(shí)鐘4倍頻提供給PowerPC 405作處理器時(shí)鐘,并分頻后再送給OPB總線作總線時(shí)鐘,降低慢速外設(shè)的總線速度,使系統(tǒng)搭配更合理。
圖1 系統(tǒng)硬件組成框圖
PowerPC 405是此嵌入式系統(tǒng)的核心,它通過PLB總線實(shí)現(xiàn)和程序存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器的快速通道,并通過PLB-OPB橋?qū)崿F(xiàn)了片上的OPB總線,然后通過OPB總線進(jìn)行各種外設(shè)的擴(kuò)展,OPB外設(shè)包括一個(gè)RS232串口,一個(gè)OPB_EMC用于擴(kuò)展以太網(wǎng)控制器芯片,一個(gè)GPIO作以太網(wǎng)控制器輸出的中斷請(qǐng)求,一個(gè)中斷控制器OPB_INTC將GPIO輸入的外部中斷通知PowerPC 405并可以設(shè)置優(yōu)先級(jí),還有一個(gè)用戶自定義的IP Core用于實(shí)現(xiàn)和VME總線的接口電路。
PowerPC 405 是專門為嵌入式應(yīng)用而設(shè)計(jì)的高性能32位PowerPC系列處理器芯核,對(duì)于Virtex-II Pro系列FPGA,其實(shí)現(xiàn)型號(hào)為PowerPC 405D5。
PLB是處理器本機(jī)總線,它為指令和數(shù)據(jù)一側(cè)提供獨(dú)立的32位地址和64位數(shù)據(jù)總線。PLB總線架構(gòu)支持多主從設(shè)備,每一個(gè)PLB主控機(jī)通過獨(dú)立的地址總線、讀數(shù)據(jù)總線和寫數(shù)據(jù)總線與PLB連接,有一個(gè)中央判決機(jī)構(gòu)來授權(quán)對(duì)PLB的訪問以允許主控機(jī)通過競(jìng)爭(zhēng)來獲得總線的所有權(quán)。OPB是片上外設(shè)總線,提供分離的32位地址總線和32位數(shù)據(jù)總線,一般用來訪問低速和低性能的系統(tǒng)資源。它是一種完全同步總線,但不直接連接到處理器內(nèi)核,處理器內(nèi)核通過“PLB to OPB”橋和OPB總線來訪問OPB接口外設(shè)。
網(wǎng)絡(luò)控制器采用Cirrus Logic公司的通用單片10/100M以太網(wǎng)控制器CS8900A,該芯片完全遵從與IEEE 802.3以太網(wǎng)標(biāo)準(zhǔn),支持完全的全雙工操作。應(yīng)用EDK的OPB_EMC IP可以很方便地將CS8900A擴(kuò)展為系統(tǒng)OPB總線上的一個(gè)設(shè)備,只要將EMC端口的地址、數(shù)據(jù)總線以及控制信號(hào)分別接到CS8900A的地址、數(shù)據(jù)總線和控制端口上,并將EMC的時(shí)序參數(shù)設(shè)置成與CS8900A手冊(cè)上要求的一致就可以了。另外將CS8900A的中斷輸出INTRQ作為一個(gè)GPIO引入系統(tǒng)以實(shí)現(xiàn)以太網(wǎng)的中斷服務(wù)功能。
自定義的IP Core內(nèi)容如圖2所示,它用FPGA內(nèi)的Block RAM資源實(shí)現(xiàn)64KB的雙口RAM用來完成和VME總線上其他設(shè)備的通信和數(shù)據(jù)交換。我們用上述的第二種方法來實(shí)現(xiàn)將用戶專用電路嵌入微處理器系統(tǒng)中,自定義的IP主要包括OPB總線接口和用戶電路兩部分,我們用EDK提供的OPB總線的IPIF模板修改后,作為自定義IP的總線接口,64KB的雙口RAM和VME總線接口是真正的用戶電路。
圖2 自定義的IP Core結(jié)構(gòu)
軟件開發(fā)
嵌入式開發(fā)環(huán)境EDK(Embedded Development Kit)將軟件開發(fā)分為兩大部分,一是底層系統(tǒng)軟件的開發(fā),主要完成BSP(板級(jí)支持包)的功能;另一部分則是用戶應(yīng)用軟件的開發(fā)(包括用戶硬件驅(qū)動(dòng)及用戶上層應(yīng)用軟件)。由于EDK中帶有許多IP核以及相應(yīng)的驅(qū)動(dòng)軟件,因此底層系統(tǒng)軟件的開發(fā)大部分可以借助EDK集成開發(fā)環(huán)境來完成的,如操作系統(tǒng)的選擇、設(shè)備驅(qū)動(dòng)程序的選擇、中斷/異常處理例程的設(shè)置、操作系統(tǒng)參數(shù)設(shè)置等在內(nèi)的各種系統(tǒng)級(jí)軟件參數(shù)的設(shè)置。而用戶應(yīng)用軟件的開發(fā)由于有底層驅(qū)動(dòng)的隔離,可移植性好。整個(gè)用戶軟件的開發(fā)及調(diào)試工作都可以在EDK中完成。
● 底層系統(tǒng)軟件開發(fā)
在本設(shè)計(jì)中,沒有使用操作系統(tǒng),使用所謂的standalone模式,即EDK僅提供硬件初始化及引導(dǎo)代碼。此外還需要對(duì)GPIO、EMC、RS232、中斷控制器等一些外設(shè)生成底層驅(qū)動(dòng),這些都可以通過在EDK集成環(huán)境XPS中選擇菜單Project->Software Platform Settings的對(duì)話框進(jìn)行設(shè)置,如圖3所示。其實(shí)質(zhì)是自動(dòng)修改工程的.MSS文件。例如中斷函數(shù)的處理例程可在如圖4所示的界面中加以設(shè)置。也可以手工編輯.MSS文件如下設(shè)置:
PARAMETER int_handler = CS8900A_INT_HANDLER, int_port = IP2INTC_Irpt
圖3 在XPS中設(shè)置操作系統(tǒng)和驅(qū)動(dòng)程序
圖4 在XPS中設(shè)置中斷服務(wù)例程
設(shè)置完成后在XPS中運(yùn)行Tools->Generate Libraries and BSPs將調(diào)用LibGen自動(dòng)生成驅(qū)動(dòng)庫(kù)文件,這些CPU和外設(shè)驅(qū)動(dòng)庫(kù)的設(shè)置、操作函數(shù)實(shí)現(xiàn)或定義可在工程項(xiàng)目根目錄下的以處理器實(shí)例名為名字的目錄下的libsrc目錄下相應(yīng)的各模塊子目錄中找到,參考其實(shí)現(xiàn)有助于深刻理解事實(shí)上發(fā)生的操作。例如中斷向量表可在中段向量控制器模塊子目錄(本例中為intc_v1_00_csrc)下的xintc_g.c文件中找到。
● 用戶軟件開發(fā)
用戶軟件主要是對(duì)網(wǎng)絡(luò)控制器、GPIO、RS232串口等的操作,其中控制CS8900A的程序是重要部分,它要完成TCP/IP協(xié)議。CS8900A所有的控制寄存器和數(shù)據(jù)寄存器都映射在被稱為PacketPage的片上4K地址空間內(nèi),這4K空間可映射到主機(jī)地址空間中(存儲(chǔ)器模式),或通過8個(gè)16位I/O口進(jìn)行存取(I/O模式)。本設(shè)計(jì)中CS8900A工作于I/O模式,通過EDK的OPB_EMC IP作為OPB總線上的一個(gè)設(shè)備,并給EMC控制器和所映射的設(shè)備分配操作地址空間,在程序中用
Xuint32 XIo_In32(XIo_Address InAddress);
void XIo_Out32(XIo_Address OutAddress, Xuint32 Value);
讀寫映射的設(shè)備,這兩個(gè)I/O函數(shù)同*pDestMem = Value(直接讀寫存儲(chǔ)器操作)的差別在于前者做了讀寫同步(調(diào)用eieio匯編指令)。參考芯片手冊(cè)編寫CS8900A的驅(qū)動(dòng),實(shí)現(xiàn)基本I/O操作CS8900A_SendFrame和CS8900A_RecvFrame。EDK中有需付費(fèi)的以太網(wǎng)IP CORE并附帶有一些TCP/IP協(xié)議棧,該協(xié)議棧實(shí)現(xiàn)了大部分常用功能,但也有一些重要功能并未實(shí)現(xiàn),例如TCP包的超時(shí)未達(dá)重發(fā),收發(fā)操作的中斷工作方式。通過修改、增加和完善這些軟件包,實(shí)現(xiàn)了真正面向用戶更高層應(yīng)用軟件的網(wǎng)絡(luò)編程接口。
● 軟件開發(fā)中的部分問題
軟件開發(fā)過程中遇到的幾個(gè)主要問題歸納如下:
(1)IEEE 802.3網(wǎng)絡(luò)及網(wǎng)絡(luò)控制器CS8900A采用的均是Little Endian編碼,而XC2VP40內(nèi)含的處理器PowerPC 405D5采用的是Big Endian編碼方式,因此在數(shù)據(jù)I/O過程中需要做一下轉(zhuǎn)換。
(2)可通過編寫鏈接控制腳本文件控制應(yīng)用程序的鏈接過程,從而控制程序映像在存儲(chǔ)器中的重定位過程。這在FPGA這種存儲(chǔ)器資源有限的環(huán)境中有時(shí)很有用。
(3)要將EDK提供的默認(rèn)bootloop程序打包到硬件初始化流中,這樣做的目的是提供默認(rèn)的CPU復(fù)位后運(yùn)行程序,保證CPU處在可預(yù)知的狀態(tài),而不是因?yàn)閳?zhí)行了存儲(chǔ)器中的隨機(jī)代碼而處于一種未知的狀態(tài)。
系統(tǒng)調(diào)試方法
由于PowerPC 405處理器核中已包含調(diào)試模塊,并用JTAG端口引出,只要在系統(tǒng)中添加一個(gè)叫做JTAGPPC的IP模塊并和PowerPC 405相連便可將其調(diào)試端口串入FPGA的JTAG鏈中,這樣只需使用FPGA本身的下載電纜和JTAG接口便可完成系統(tǒng)軟件調(diào)試而不需要增加額外電路。
EDK提供的軟件調(diào)試工具主要有XMD和GDB。值得一提的是利用XMD下載可執(zhí)行程序映像時(shí)還會(huì)顯示各程序段的重定位情況,在發(fā)生錯(cuò)誤時(shí)會(huì)報(bào)告錯(cuò)誤,諸如要求的地址空間大于實(shí)際提供的地址空間等錯(cuò)誤,而這在EDK集成環(huán)境下是看不到的。在存在多種類型存儲(chǔ)器資源的情況下,編寫鏈接控制腳本文件控制重定位過程可能能夠解決上述某地址空間不夠的問題。網(wǎng)絡(luò)通信部分的調(diào)試主要由Sniffer軟件輔助完成。
GDB是EDK附帶的GNU的主機(jī)方圖形界面調(diào)試工具,它通過和XMD通信完成圖形界面調(diào)試功能,此時(shí)XMD則扮演了一個(gè)主機(jī)方調(diào)試代理的角色,所有的調(diào)試通信是由XMD同目標(biāo)機(jī)通信完成的。
結(jié)語
SoPC使得硬件設(shè)計(jì)能真正實(shí)現(xiàn)象搭積木一樣方便迅速,而利用EDK開發(fā)工具就可以實(shí)現(xiàn)一個(gè)基于FPGA的嵌入式系統(tǒng)的軟硬件一體化的開發(fā),的確大大提高了嵌入式系統(tǒng)的開發(fā)效率,但是目前它還有許多不夠完善的方面。
首先是系統(tǒng)設(shè)計(jì)對(duì)設(shè)計(jì)工具軟件的依賴性很大,而這些軟件還有許多有待修正完善的地方,設(shè)計(jì)師無法避免將在使用熟悉軟件方面花許多時(shí)間。其次,IP Core的不斷豐富和完善是SoPC的基礎(chǔ),昂貴的付費(fèi)IP核不利于此技術(shù)的推廣,尤其在國(guó)內(nèi),而要設(shè)計(jì)驗(yàn)證用戶自己的IP Core對(duì)設(shè)計(jì)者的要求較高。如今一個(gè)完善的嵌入式系統(tǒng)都有實(shí)時(shí)操作系統(tǒng)在運(yùn)行,SoPC要成為主流也需要更豐富的RTOS的支持。