曹孟剛
摘要:FPGA具有豐富的可編程I/O引腳、邏輯宏單元、門電路以及RAM空間,在嵌入式領(lǐng)域的廣泛應(yīng)用。本文以FPGA使用中一種設(shè)計(jì)缺陷進(jìn)行分析并進(jìn)行了改進(jìn)。
關(guān)鍵詞:FPGA;PowerPC最小系統(tǒng);故障分析及改進(jìn)
0引言
本PowerPC最小系統(tǒng)故障為通訊模塊中偶發(fā)故障。通訊模塊由FPGA電路與協(xié)議芯片電路組成,處理GJB289A總線數(shù)據(jù)時(shí),應(yīng)用端數(shù)據(jù)通過PCI總線送到FPGA內(nèi)部的雙端口RAM緩沖區(qū),F(xiàn)PGA內(nèi)部的PowerPC405將數(shù)據(jù)從雙口RAM中搬移至GJB289A總線協(xié)議芯片中,再通過GJB289A總線協(xié)議芯片轉(zhuǎn)換成GJB289A總線格式的數(shù)據(jù)在總線上傳輸;CIM模塊從GJB289A總線接收到的數(shù)據(jù)也通過PowerPC405搬移至雙口,應(yīng)用端通過雙口獲取到數(shù)據(jù);處理429總線數(shù)據(jù)時(shí),應(yīng)用端數(shù)據(jù)通過PCI總線送到FPGA內(nèi)部的雙端口RAM緩沖區(qū),F(xiàn)PGA內(nèi)部的PowerPC405將數(shù)據(jù)從雙口RAM中搬移至429總線協(xié)議芯片中,再通過429協(xié)議芯片轉(zhuǎn)換成429格式的數(shù)據(jù)在總線上傳輸;CIM模塊從429總線接收到的數(shù)據(jù)也通過PowerPC405搬移至雙口,應(yīng)用端通過雙口獲取到數(shù)據(jù)。在FPGA內(nèi)部,包含兩個(gè)PowerPC405硬核,分別處理GIB289A總線的數(shù)據(jù)和429總線的數(shù)據(jù)。通訊模塊的設(shè)計(jì)原理框圖如圖1所示。
PowerPC最小系統(tǒng)由PowerPC405、PLB總線以及掛接在PLB總線上的RAM組成,其中,PowerPC405是運(yùn)行總線數(shù)據(jù)處理軟件的處理器,PLB總線是處理器本地總線,RAM是PowerPC405中軟件的程序區(qū)、數(shù)據(jù)區(qū)及堆棧區(qū)的存儲(chǔ)空間。
應(yīng)用端周期通過PCI總線訪問通訊模塊上BRAM1上的數(shù)據(jù)較短,當(dāng)訪問周期較低時(shí),PowerPC1偶發(fā)軟件運(yùn)行異常。
一、故障機(jī)理分析
在通訊模塊的設(shè)計(jì)中,PPC405_1在運(yùn)行時(shí),通過PLB總線1訪問RAM1,進(jìn)行取程序指令操作、讀寫程序數(shù)據(jù)、進(jìn)棧出棧操作,同時(shí)在程序運(yùn)行時(shí),通過PLB總線1對(duì)1553協(xié)議芯片通信模塊進(jìn)行讀寫訪問,通過PLB2OPB橋訪問掛接在OPB總線1上的BRAM1、中斷控制器IP核、timebase核。PPC405_2在運(yùn)行時(shí),通過PLB總線2訪問RAM2,進(jìn)行取程序指令操作、讀寫程序數(shù)據(jù)、進(jìn)棧出棧操作,同時(shí)在程序運(yùn)行時(shí),通過PLB2OPB橋訪問掛接在OPB總線1上的BRAM2,通過PLB2OPB橋訪問掛接在OPB總線2上的429通信模塊。
基于上述設(shè)計(jì),在進(jìn)行GJB289A總線通信發(fā)送數(shù)據(jù)時(shí),CPU通過PCI官方IP核,訪問OPB總線1上掛接的BRAM1,將數(shù)據(jù)寫入BRAM1中。1553軟件通過PLB2OPB橋訪問掛接在OPB總線1上的BRAM1將數(shù)據(jù)從BRAM1中搬移至掛接在PLB總線1上的1553協(xié)議芯片通信模塊中。之后等待總線上來自總線控制器的消息命令,GJB289A總線協(xié)議芯片收到消息命令后,將已寫入的數(shù)據(jù)發(fā)送至總線上,之后發(fā)送消息結(jié)束中斷給FPGA,消息結(jié)束中斷通過中斷控制器核送給PPC405_1,PPC405_1中的軟件進(jìn)入中斷服務(wù)程序執(zhí)行,在中斷服務(wù)程序中,首先通過PLB2OPB橋訪問掛接在OPB總線1上的中斷控制器核,讀取中斷狀態(tài)等寄存器,然后進(jìn)入用戶的中斷服務(wù)程序執(zhí)行,在用戶的中斷服務(wù)程序中,存在對(duì)1553協(xié)議芯片通信模塊和BRAM1的訪問。
在上述程序運(yùn)行及通信過程中,存在對(duì)PLB總線的頻繁訪問,導(dǎo)致PLB總線占用率過高,導(dǎo)致PPC405_1中的程序運(yùn)行錯(cuò)誤,出棧異常,導(dǎo)致PPC405_1訪問非法地址,該非法地址通過PLB2OPB橋傳到OPB總線上,導(dǎo)致OPB總線出現(xiàn)timeout現(xiàn)象,進(jìn)而導(dǎo)致CPU通過PCI訪問BRAM1和BRAM2異常。程序運(yùn)行錯(cuò)誤導(dǎo)致程序進(jìn)入0x0700異常處理中斷無法跳出,進(jìn)而導(dǎo)致故障。
進(jìn)一步分析OPB總線上出現(xiàn)訪問非法地址的原因,監(jiān)控PPC405內(nèi)部的軟件工作狀態(tài),通過軟件debug的方式進(jìn)行監(jiān)控跟蹤,發(fā)現(xiàn)出現(xiàn)故障時(shí),程序運(yùn)行出棧異常,堆棧溢出,程序訪問了非法空間,該非法空間通過PLB2OPB橋傳到OPB總線上,導(dǎo)致OPB總線上出現(xiàn)timeout信號(hào)。進(jìn)一步通過debug的方式監(jiān)控PPC405的行為,發(fā)現(xiàn)出現(xiàn)異常后,軟件進(jìn)入0x0700異常處理中斷執(zhí)行,且無法跳出。針對(duì)該現(xiàn)象,修改xilinx庫文件中的源文件,修改0x0700異常處理中斷程序,在該異常中斷中,讀取PLB和PLB2OPB橋的DCR寄存器,DCR寄存器中的值顯示,在出現(xiàn)故障后,PPC405處理異常,存在對(duì)非法空間的訪問,導(dǎo)致出現(xiàn)timeout信號(hào)。
更改軟件,將0x0700異常處理中斷掛接在用戶的中斷服務(wù)程序中,在用戶的中斷服務(wù)程序中增加GPIO輸出,通過示波器測(cè)量PPC405的中斷信號(hào),發(fā)現(xiàn)在出現(xiàn)故障時(shí),軟件在用戶掛接的中斷服務(wù)程序中,進(jìn)入一次700異常中斷,之后中斷服務(wù)程序正常結(jié)束,但是在下一次中斷進(jìn)入之前,PPC405反復(fù)進(jìn)入700異常中斷。導(dǎo)致軟件運(yùn)行無法恢復(fù)正常。
由于PowerPC405中的軟件運(yùn)行時(shí),需要通過PLB總線訪問RAM讀取程序指令,讀寫程序運(yùn)行的數(shù)據(jù),并進(jìn)行壓棧出棧等操作。因此針對(duì)PLB總線進(jìn)行分析,通過查看PLB總線數(shù)據(jù)手冊(cè)可知,PLB總線不支持高總線占用率,詳見圖2。
二、優(yōu)化設(shè)計(jì)
在FPGA邏輯中將原來PLB總線上掛接的供PPC405軟件運(yùn)行指令和數(shù)據(jù)的RAM去掉。啟用OCM,將PPC405中軟件的指令分配至isocm中運(yùn)行,將數(shù)據(jù)分配至dsocm中運(yùn)行。