文獻(xiàn)標(biāo)識(shí)碼: A
文章編號(hào): 0258-7998(2014)08-0017-03
PowerPC具有外設(shè)豐富、處理能力強(qiáng)以及便于移植Linux等操作系統(tǒng)的特點(diǎn),而現(xiàn)場(chǎng)可編輯邏輯門(mén)陣列FPGA具有處理能力強(qiáng)、在線可編程等特點(diǎn)。因此,在復(fù)雜工業(yè)控制、路由器等諸多領(lǐng)域,采用PowerPC+FPGA的架構(gòu)得到了廣泛的使用。眾所周知,F(xiàn)PGA多采用靜態(tài)隨機(jī)存取存儲(chǔ)器SRAM(Static Random-Access Memory)工藝,掉電后配置數(shù)據(jù)將丟失。因此,系統(tǒng)每次上電后都必須進(jìn)行數(shù)據(jù)配置。此外,隨著FPGA規(guī)模越來(lái)越大,配置數(shù)據(jù)已達(dá)到幾十甚至上百兆比特,常用的串行配置邊界掃描(JTAG)等方式在很多場(chǎng)合下已無(wú)法滿(mǎn)足需求。若設(shè)計(jì)中需要對(duì)多片F(xiàn)PGA進(jìn)行配置,則更為復(fù)雜,耗費(fèi)時(shí)間更長(zhǎng)。目前,主流PowerPC具有豐富的通用輸入/輸出口GPIO(General Purpose I/O),自帶位寬達(dá)32 bit的本地總線(Local Bus),且在其上移植Linux等操作系統(tǒng)方便快捷。因此,可以利用PowerPC本地總線對(duì)多片F(xiàn)PGA進(jìn)行快速并行配置。
1 FPGA配置方式
1.1 常用的配置方式及特點(diǎn)
目前主流的FPGA廠家有Xilinx、Altera等公司。雖然不同廠家、不同系列的FPGA芯片配置方式或多或少存在一些差異,但是大體來(lái)說(shuō)配置方式包括JTAG模式、主動(dòng)模式以及被動(dòng)模式[1-2]。不同模式之間通過(guò)模式選擇控制引腳進(jìn)行選擇,具體設(shè)置方式由相應(yīng)的芯片資料給出。
JTAG模式使用最方便,使用下載器就可以很方便地將計(jì)算機(jī)生成的配置數(shù)據(jù)下載到FPGA中。但是這種模式?jīng)]有存儲(chǔ)芯片,掉電后需重新通過(guò)計(jì)算機(jī)下載,所以這種配置方式多用于調(diào)試階段;主動(dòng)模式下FPGA作為控制器,產(chǎn)生配置時(shí)鐘和控制時(shí)序,從配置器件等外部設(shè)備中讀取配置數(shù)據(jù),進(jìn)而將數(shù)據(jù)下載至FPGA。根據(jù)數(shù)據(jù)采用的是串行還是并行模式,又分為主動(dòng)串行模式和主動(dòng)并行模式。被動(dòng)模式是由外部配置器件產(chǎn)生時(shí)鐘和控制時(shí)序控制整個(gè)配置過(guò)程,F(xiàn)PGA只是被動(dòng)地接收配置數(shù)據(jù)。同樣根據(jù)數(shù)據(jù)采用的是串行還是并行模式(對(duì)應(yīng)Xilinx FPGA的SelectMAP模式),又分為被動(dòng)串行和被動(dòng)并行模式[3-4]。當(dāng)然,根據(jù)數(shù)據(jù)是同步還是異步的,還可以進(jìn)一步細(xì)分。
串行(主串或從串)模式具有配置信號(hào)少、配置電路簡(jiǎn)單等優(yōu)點(diǎn)。但是FPGA 在配置時(shí)鐘的1個(gè)上升沿只能接收1 位配置數(shù)據(jù),顯然該配置方式速度較慢;并行模式配置信號(hào)線比較多,但是配置速度較快,在高密度的FPGA系統(tǒng)中,更適合采用并行模式。并行模式除了采用專(zhuān)用配置芯片外,還可以采用微處理器或者CPLD控制Flash等存儲(chǔ)器對(duì)FPGA進(jìn)行配置。由于主流PowerPC具有豐富的GPIO口和32位總線,若運(yùn)行Linux系統(tǒng),則可以進(jìn)一步擴(kuò)展CF卡或者SD卡,將配置文件存放在CF卡或者SD卡中,而不用Flash芯片。在精簡(jiǎn)系統(tǒng)設(shè)計(jì)的同時(shí),使得程序升級(jí)維護(hù)更方便,在工程實(shí)踐中更具有實(shí)際意義。
1.2 FPGA配置文件
以Xilinx FPGA芯片為例,其配置文件可由集成開(kāi)發(fā)環(huán)境ISE生成。常用的配置文件格式(后綴名)包括:.bit、.rbt、.bin、.mcs以及.hex等格式。其中.bin和.bit文件都是直接向FPGA配置的文件。.bit文件除包含有真正的配置數(shù)據(jù)外,還在文件開(kāi)頭添加了頭部冗余信息,包含當(dāng)前ISE工程的名字、器件型號(hào)、編譯時(shí)間等信息,主要用于JTAG下載;.bin文件只包含了原始配置數(shù)據(jù)的二進(jìn)制文件,實(shí)質(zhì)上就是去除了頭部冗余信息的.bit文件。.bin文件也由文件頭和配置數(shù)據(jù)組成,其中文件頭主要包括位寬檢測(cè)和同步字等,第二部分才是真正寫(xiě)入FPGA的配置文件,這種格式常用于利用微處理器對(duì)FPGA進(jìn)行并行下載。.rbt格式為.bit文件的ASCII格式;.mcs文件包括地址和校驗(yàn)信息,主要用于專(zhuān)用配置芯片進(jìn)行程序燒寫(xiě);.hex文件只包含F(xiàn)PGA的配置數(shù)據(jù),也是給用戶(hù)使用的。顯然,利用PowerPC對(duì)FPGA進(jìn)行配置時(shí)要選擇.bin格式文件。本文采用被動(dòng)SelectMAP模式對(duì)Xinlix Virtex-6 FPGA進(jìn)行配置。
2 硬件設(shè)計(jì)與實(shí)現(xiàn)
2.1 并行配置的相關(guān)時(shí)序
Xilinx SelectMAP模式實(shí)質(zhì)上就是并行配置模式,它以字節(jié)為單位將配置數(shù)據(jù)寫(xiě)入FPGA。在從SelectMAP模式下,外部數(shù)據(jù)源向FPGA提供時(shí)鐘(CCLK)、編程(PROGRAM_B)、片選(CSI_B)、讀/寫(xiě)(RDWR_B)、初始化(INIT_B)以及數(shù)據(jù)信號(hào)D[0:n](在8 bit、16 bit、32 bit模式下,n分別對(duì)應(yīng)7、
15、31)。表 1給出了SelectMAP模式下的配置引腳功能。其中信號(hào)方向是相對(duì)于FPGA而言的。
各控制信號(hào)的具體含義如下[5]:
(1)PROGRAM_B:編程復(fù)位信號(hào)。在上電過(guò)程中為邊沿敏感,上電后為低電平有效。該信號(hào)拉低完成芯片的復(fù)位,低電平保持時(shí)間為0.5 ?滋s乘以配置文件的幀數(shù)。對(duì)Virtex-6芯片,大概幾十毫秒(經(jīng)實(shí)測(cè)在1 ms以?xún)?nèi))。復(fù)位完成后,內(nèi)部INIT_B抬高。
(2)INIT_B:初始化信號(hào)。為雙向信號(hào),在重啟或者編程初始化(PROGRAM_B=0)過(guò)程中,用來(lái)指示FPGA是否已經(jīng)完成配置初始化。作為輸入信號(hào),將INIT_B拉低來(lái)推遲對(duì)FPGA的配置。一般情況下,只需在PROGRAM_B=0后等待一定時(shí)間即可完成初始化。為了簡(jiǎn)化設(shè)計(jì),在本設(shè)計(jì)中INIT_B只用于輸入。
(3)CSI_B:片選信號(hào)。低電平有效,CSI_B=0表示總線允許。
(4)RDWR_B:讀寫(xiě)控制信號(hào)。RDWR_B=0表示總線寫(xiě)入,RDWR_B=10表示總線讀出。需要注意的是,拉低RDWR_B信號(hào)之前,必須確認(rèn)CSI_B=0,否則可能會(huì)導(dǎo)致數(shù)據(jù)丟失。
(5)BUSY:握手信號(hào)。當(dāng)配置時(shí)鐘頻率超過(guò)50 MHz時(shí),利用本信號(hào)控制寫(xiě)入或者讀出速度。
(6)DONE:配置狀態(tài)指示信號(hào)。數(shù)據(jù)正確配置后,DONE=1。
圖 1給出了連續(xù)并行配置的時(shí)序圖。
圖1 SelectMAP 模式連續(xù)配置時(shí)序圖
2.2 基本思想與硬件設(shè)計(jì)原理
由表1和圖1可以看出,F(xiàn)PGA在CSI_B、PROGRAM_B、RDWR_B以及INIT_B的控制下,在時(shí)鐘CCLK的上升沿時(shí)刻將配置數(shù)據(jù)寫(xiě)入FPGA。以上4個(gè)控制信號(hào)可以利用PowerPC的GPIO口生成,雖然CCLK也可以用GPIO生成,但是由于GPIO口輸出的數(shù)據(jù)和總線數(shù)據(jù)都要經(jīng)過(guò)鎖存、電平轉(zhuǎn)換等,在高速設(shè)計(jì)中,可能會(huì)產(chǎn)生意想不到的結(jié)果,或者為了保證時(shí)序的正確性而犧牲效率??紤]到PowerPC總線進(jìn)行寫(xiě)操作時(shí),其對(duì)應(yīng)的片選信號(hào)LCS以及RDWR信號(hào)都為低電平,而進(jìn)行其他操作時(shí),RDWR為高電平。此外,通過(guò)對(duì)PowerPC的總線控制寄存器進(jìn)行設(shè)置,可以使LCS信號(hào)滯后于RDWR拉高。因此可以將LCS與RDWR進(jìn)行“或操作”產(chǎn)生配置時(shí)鐘CCLK。寫(xiě)命令發(fā)出后,由于LCS滯后于RDWR信號(hào),可以保證數(shù)據(jù)能夠被正確寫(xiě)入FPGA。
基于以上時(shí)序分析的結(jié)果,設(shè)計(jì)了圖2所示的原理框圖。通過(guò)SATA接口相連的CF卡用來(lái)存放配置數(shù)據(jù),當(dāng)然也可以用SD卡。CF卡或者SD卡可以很方便地從卡座上拔下,使得程序維護(hù)升級(jí)非常方便,甚至非專(zhuān)業(yè)人員都能完成程序的升級(jí)。在調(diào)試過(guò)程中,數(shù)據(jù)可以直接存放在調(diào)試計(jì)算機(jī)中,利用NFS協(xié)議調(diào)試,方便快捷。為了能夠區(qū)分多片F(xiàn)PGA,可以將不同的地址線與LCS、RDWR一起進(jìn)行或運(yùn)算,實(shí)現(xiàn)片選。地址線為高電平時(shí),時(shí)鐘始終為高電平,對(duì)應(yīng)FPGA芯片不被選中(芯片較多的情況下,也可采用譯碼器來(lái)實(shí)現(xiàn)片選)。向相應(yīng)的地址寫(xiě)入數(shù)據(jù),就實(shí)現(xiàn)了片選。需要注意的是,在FPGA配置過(guò)程中,無(wú)需對(duì)地址進(jìn)行操作,地址僅僅是作為片選信號(hào)使用。此外,圖中的數(shù)據(jù)總線不僅在配置期間使用,在訪問(wèn)FPGA時(shí)也要使用。為了更好地利用同一條總線實(shí)現(xiàn)對(duì)FPGA的配置和訪問(wèn),LCS2同時(shí)連接至多片F(xiàn)PGA的片選,在配置期間與其他信號(hào)一起產(chǎn)生配置時(shí)鐘,在訪問(wèn)期間起到片選的作用。圖中的虛線表示在PowerPC訪問(wèn)FPGA時(shí)采用的信號(hào)線,在配置期間不使用。
圖2 PowerPC并行配置FPGA原理框圖
3 軟件設(shè)計(jì)與實(shí)現(xiàn)
3.1 軟件設(shè)計(jì)要點(diǎn)
針對(duì)PowerPC、Linux操作系統(tǒng)以及FPGA的特點(diǎn),在軟件設(shè)計(jì)過(guò)程中,應(yīng)注意以下幾點(diǎn):
(1)利用內(nèi)存映射函數(shù)替代驅(qū)動(dòng)程序設(shè)計(jì)。通常情況下,Linux內(nèi)核通過(guò)驅(qū)動(dòng)程序來(lái)實(shí)現(xiàn)對(duì)外部設(shè)備的輸入/輸出操作。利用PowerPC對(duì)FPGA進(jìn)行并行配置,當(dāng)然也可以利用驅(qū)動(dòng)程序來(lái)實(shí)現(xiàn)。不過(guò)由于驅(qū)動(dòng)程序編寫(xiě)比較繁瑣,使用起來(lái)也不夠靈活,所以可以利用Linux內(nèi)存映射函數(shù)mmap[6],將包括系統(tǒng)配置寄存器等相關(guān)寄存器在內(nèi)的一塊內(nèi)核空間映射到用戶(hù)空間的一段內(nèi)存區(qū)域。映射成功后,用戶(hù)對(duì)這段內(nèi)存區(qū)域的操作可以直接反映到內(nèi)核空間。具體來(lái)說(shuō),經(jīng)過(guò)映射后,用戶(hù)可以通過(guò)對(duì)相應(yīng)的內(nèi)存地址進(jìn)行操作,實(shí)現(xiàn)對(duì)系統(tǒng)配置寄存器、GPIO寄存器、本地總線控制器寄存器等的配置和訪問(wèn),而無(wú)需利用驅(qū)動(dòng)程序,使得配置程序得以簡(jiǎn)化。
(2)妥善處理字節(jié)序和比特序問(wèn)題。在FPGA配置過(guò)程中,因涉及到眾多軟硬件,要特別注意接口過(guò)程中的字節(jié)序和比特序問(wèn)題。以MPC8377 PowerPC為例,其為大端、最低有效位LSB(Least Significant Bit)在前模式,而Virtex-6系列FPGA為小端、LSB在前模式。大端模式是在寫(xiě)內(nèi)存時(shí)在內(nèi)存低地址處存放數(shù)據(jù)的高位字節(jié),高地址處存放低位字節(jié);而讀內(nèi)存時(shí),將內(nèi)存的高位地址視為目標(biāo)數(shù)據(jù)的低字節(jié),將低位地址視為高字節(jié)。小端模式正好相反。ISE生成的.bin文件與FPGA一致,也為小端模式。因此通過(guò)PowerPC將數(shù)據(jù)下載至FPGA時(shí)必須要進(jìn)行大小端轉(zhuǎn)換,即字節(jié)序轉(zhuǎn)換。因PowerPC和FPGA均為L(zhǎng)SB在前模式,因此無(wú)需作比特序的轉(zhuǎn)換。也就是說(shuō),利用ISE生成.bin文件時(shí)不需做bit swap處理。
(3)正確配置寄存器。使用本地總線首先必須要正確配置本地總線的本地訪問(wèn)窗口基址寄存器、本地訪問(wèn)窗口屬性寄存器、本地總線控制基寄存器和可選寄存器。若片選信號(hào)為L(zhǎng)CS2,則這4個(gè)寄存器分別為:LBLAWBAR2、LBLAWAR2、BR2和OR2。其中,LBLAWBAR2就是本地訪問(wèn)窗口的基址,可以直接設(shè)置為L(zhǎng)CS2對(duì)應(yīng)的地址;LBLAWAR2是本地訪問(wèn)窗口屬性寄存器,這個(gè)寄存器主要定義了允許訪問(wèn)窗口的大小,主要由需要配置的FPGA片選對(duì)應(yīng)的地址空間決定;BR2主要是對(duì)總線的位寬進(jìn)行設(shè)置,位寬有8 bit、16 bit以及32 bit 3種選擇;OR2也比較重要,決定了外部存儲(chǔ)器寫(xiě)訪問(wèn)期間LCS2 和LWE 何時(shí)無(wú)效。舉例來(lái)說(shuō),在bit21 22=00的情況下,對(duì)bit20置位,可使LWE提前總線1/4個(gè)周期。這樣可以確保在LCS2拉高前,數(shù)據(jù)能夠被正確寫(xiě)入FPGA。當(dāng)然,也可以對(duì)bit21 22通過(guò)設(shè)置其他的值,實(shí)現(xiàn)LCS2的不同延時(shí)。
3.2 軟件流程
按照上述思想,給出了軟件流程如圖3所示。
4 調(diào)試要點(diǎn)
(1)注意大小端問(wèn)題。利用MPC8377對(duì)FPGA進(jìn)行配置時(shí),總線寬度可以是8 bit、16 bit、32 bit之一。8 bit模式下不用關(guān)心字節(jié)序,16 bit和32 bit必須進(jìn)行大小端轉(zhuǎn)換。關(guān)注同步字即可確定字節(jié)序和比特序。在實(shí)際的調(diào)試過(guò)程中,應(yīng)抓住一點(diǎn),對(duì)于FPGA,其引腳上的同步字為D[31..0]=0x5599AA66。若FPGA和PowerPC的引腳是順序?qū)?yīng)的(即D0對(duì)D0,D31對(duì)D31),那么對(duì)于PowerPC,需要在總線上傳輸?shù)臄?shù)據(jù)應(yīng)該是0x665599AA。所以需要將.bin配置文件中的同步字0xAA995566進(jìn)行大小端轉(zhuǎn)換后變?yōu)?x665599AA,然后通過(guò)PowerPC傳送到FPGA對(duì)應(yīng)的引腳上即可。
(2)善于利用JTAG口。FPGA的JTAG既可以用來(lái)下載數(shù)據(jù),也可以借助它來(lái)查看FPGA配置狀態(tài)寄存器的值,其中包括總線寬度、配置模式等參數(shù)。在利用PowerPC對(duì)FPGA進(jìn)行配置的過(guò)程中,關(guān)注配置寄存器的相關(guān)狀態(tài),可以得到對(duì)應(yīng)的信息。比如配置模式在INIT信號(hào)由低變高時(shí)被采樣,總線寬度是在檢測(cè)到位寬信號(hào)后被采樣。若位寬顯示正常,說(shuō)明配置數(shù)據(jù)已能被正確寫(xiě)入FPGA;若配置還是錯(cuò)誤,就應(yīng)該檢查字節(jié)序、配置文件等是否正確。
(3)利用NFS協(xié)議調(diào)試。調(diào)試過(guò)程中,可以將程序放在本地計(jì)算機(jī)中進(jìn)行編譯,通過(guò)NFS協(xié)議,PowerPC可以運(yùn)行存放在主機(jī)中的文件。等調(diào)試完畢后,可將應(yīng)用程序、配置文件一并存入外接的CF卡中,以提高調(diào)試效率。
此外,在調(diào)試階段可以將PROGRAM、INIT等信號(hào)間隔適當(dāng)拉大,調(diào)整OR寄存器的值,適當(dāng)降低配置速率,等配置成功后,再對(duì)相關(guān)值進(jìn)行調(diào)整和優(yōu)化,以提高配置速度。
本文給出了一種利用PowerPC對(duì)多片F(xiàn)PGA進(jìn)行并行配置的簡(jiǎn)單方法。經(jīng)實(shí)測(cè),配置1片Virtex-6 XC6VS-
X475T芯片,若采用JTAG模式,需要48 s,而采用文中給出的并行配置方案,可將配置時(shí)間縮短至1 s左右,極大地縮短了配置時(shí)間。該方法也同樣適用于Xilinx其他系列的芯片以及Altera系列芯片。
參考文獻(xiàn)
[1] Altera.Device configuration schemes[EB/OL].(2013-10-08) [2014-03-30].http://www.altera.com.cn/support/devices/configuration/schemes/cfg-matrix.html.
[2] Xilinx.Configuration for Virtex-6 FPGA[EB/OL].(2013-08-25)[2014-03-30].http://www.xilinx.com/products/design_resources/config_sol/v6/config_v6.htm.
[3] 葛飛,何輔云,夏玉寶.FPGA被動(dòng)并行配置控制器的研究與實(shí)現(xiàn)[J].合肥工業(yè)大學(xué)學(xué)報(bào)(自然科學(xué)版),2008,30(4):39-41.
[4] 趙勇,孟李林,李小龍.Cyclone IV系列FPGA的配置方式及其工程應(yīng)用[J].微型機(jī)與應(yīng)用,2013,32(19):25-28.
[5] Xilinx.UG360 Virtex-6 FPGA configuration user guide[EB/OL].(2013-11-27)[2014-03-30].http://www.xilinx.com/support/documentation/user_guides/ug360.pdf.
[6] 韓超,魏治宇,廖文江.嵌入式Linux上的C語(yǔ)言編程實(shí)踐[M].北京:電子工業(yè)出版社,2009.
(收稿日期:2014-04-22)