文獻(xiàn)標(biāo)識(shí)碼: A
DOI:10.16157/j.issn.0258-7998.181546
中文引用格式: 魏建勇. 基于FPGA的CPCI系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].電子技術(shù)應(yīng)用,2018,44(11):50-52,56.
英文引用格式: Wei Jianyong. Design and implementation of CPCI system based on FPGA[J]. Application of Electronic Technique,2018,44(11):50-52,56.
0 引言
目前的儀器或者工控系統(tǒng)多數(shù)使用集成式工控機(jī)箱,機(jī)箱背板一般通過(guò)CPCI(Compact PCI)接口連接所有的插卡,包括工控電腦和各種采集卡、控制卡等。設(shè)計(jì)板卡時(shí)需要考慮CPCI接口實(shí)現(xiàn)及通信機(jī)制,現(xiàn)有板卡多使用專用接口芯片,例如PCI9054芯片,這類芯片可擴(kuò)展性不強(qiáng),需要外擴(kuò)FPGA芯片,使用不靈活;且直接使用FPGA的IP核實(shí)現(xiàn)CPCI協(xié)議占用資源多,開發(fā)成本較高,在有某些特殊需求時(shí)不便擴(kuò)展。
本文提出了一種基于FPGA的CPCI系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn),使用廉價(jià)FPGA芯片實(shí)現(xiàn)CPCI通信協(xié)議,同時(shí)利用FPGA的可編程特性實(shí)現(xiàn)電源控制、靈活中斷、外部觸發(fā)、外部通信等特殊應(yīng)用的功能,解決了CPCI協(xié)議經(jīng)過(guò)CPCI橋時(shí)的沖突問(wèn)題。
1 系統(tǒng)設(shè)計(jì)
1.1 系統(tǒng)框圖
如圖1所示,本系統(tǒng)主要包含嵌入式板卡和CPCI工控機(jī)箱,板卡插入到CPCI機(jī)箱背板插槽。嵌入式板卡內(nèi)的FPGA與CPCI插槽間使用CPCI總線和用戶IO連接,F(xiàn)PGA與ARM之間通過(guò)特定IO實(shí)現(xiàn)的總線連接,同時(shí)FPGA上連接一個(gè)三極管驅(qū)動(dòng)的繼電器[1]。
1.2 系統(tǒng)功能
FPGA和背板接口為CPCI接口,通過(guò)CPCI協(xié)議通信;ARM使用自定義總線協(xié)議將數(shù)據(jù)寫入到FPGA的RAM緩存,然后使用CPCI接口發(fā)送給主控機(jī),反之亦然。FPGA能識(shí)別CPCI的信號(hào)給ARM產(chǎn)生中斷,也能夠識(shí)別ARM的信號(hào)給CPCI產(chǎn)生有效中斷,還可以通過(guò)繼電器控制板卡上電、下電、復(fù)位,能通過(guò)IO控制實(shí)現(xiàn)ARM的ISP(在線升級(jí),僅需控制一個(gè)ARM管腳)功能并產(chǎn)生背板觸發(fā)信號(hào)。
下文從FPGA設(shè)計(jì)、ARM設(shè)計(jì)和通信機(jī)制三方面進(jìn)行說(shuō)明。
2 FPGA設(shè)計(jì)
如圖2所示,F(xiàn)PGA內(nèi)部主要包括CPCI協(xié)議、IO_MEM、ARM解碼、讀中斷產(chǎn)生、CPCI中斷產(chǎn)生、電源控制等模塊[2-3]。FPGA芯片根據(jù)使用資源和成本選擇Xilinx公司的XC2S100,最后使用387個(gè)Slice寄存器(占比16%)、882個(gè)LUTs(占比36%)。
2.1 CPCI協(xié)議模塊
2.1.1 協(xié)議
CPCI協(xié)議兼容PCI2.2協(xié)議,擴(kuò)展了部分用戶接口,所以模塊按照標(biāo)準(zhǔn)PCI2.2協(xié)議完成,實(shí)現(xiàn)配置空間管理、IO讀寫、Memory單字讀寫、Memory突發(fā)讀寫、仲裁和中斷等功能。協(xié)議細(xì)節(jié)參看文獻(xiàn)[4]、[5]。
2.1.2 FPGA仿真
對(duì)ISE布線后的文件用ModelSimXE進(jìn)行時(shí)序后仿真,下面給出通過(guò)CPCI總線進(jìn)行Memory突發(fā)讀寫的仿真,因IO讀寫和Memory單字讀寫時(shí)序與Memory突發(fā)讀寫類似,在此不再贅述[6-8]。
圖3上半部分是Memory突發(fā)寫的時(shí)序過(guò)程,在地址0xd000處連續(xù)寫入10個(gè)依次遞增的32 bit數(shù)據(jù),起始數(shù)據(jù)為0x15896345。下半部分是寫完之后的Memory突發(fā)讀時(shí)序,可見從0xd000讀出的連續(xù)若干32 bit數(shù)據(jù),與寫入完全一致。
此CPCI板卡在插入實(shí)際機(jī)箱槽位時(shí)出現(xiàn)這樣的問(wèn)題:某些廠家的機(jī)箱特定槽位插入會(huì)死機(jī)。該問(wèn)題使用市面上的成品CPCI板卡也會(huì)遇到,經(jīng)過(guò)分析,修改了CPCI板卡協(xié)議里的一個(gè)關(guān)于CPCI橋的接口,死機(jī)情況不再發(fā)生。
2.2 IO_MEM模塊
本模塊由3個(gè)雙口RAM組成,在CPCI系統(tǒng)中命名為BA0、BAR1、BAR2,BAR0和BAR2是16 B的IO空間,僅支持單個(gè)字讀取,BAR1為2 048 B的MEM空間,支持單字讀寫和突發(fā)讀寫。其中BAR1僅支持1 B的空間訪問(wèn),只用來(lái)進(jìn)行電源控制和ISP,不可通過(guò)其他外設(shè)訪問(wèn)。
2.3 ARM解碼模塊
本模塊實(shí)現(xiàn)FPGA與ARM之間IO和Memory接口時(shí)序,因兩者時(shí)序基本相同,以Memory時(shí)序?yàn)槔f(shuō)明,定義如圖4和圖5所示。硬件接口由時(shí)鐘、使能、RAM選擇、讀寫選擇、地址數(shù)據(jù)總線(8根)組成。特別需要注意的是,時(shí)鐘線必須連接到FPGA的全局時(shí)鐘管腳上。
Memory讀/寫時(shí)序必須保證在地址A有效之后的第2個(gè)時(shí)鐘周期開始接收/輸入數(shù)據(jù),32 bit數(shù)據(jù)由4 B組成,按低位字節(jié)到高位字節(jié)的順序輸出/輸入,數(shù)據(jù)組合/拆分由ARM完成。接收/寫入不同地址段的數(shù)據(jù)必須先使en_arm無(wú)效,然后再使能。
2.4 ARM讀中斷
當(dāng)FPGA內(nèi)部的BAR0寫有效時(shí)使能int_arm,該信號(hào)會(huì)觸發(fā)ARM的外部IO中斷。通過(guò)CPCI接口往BAR0寫入任何數(shù)據(jù)均可產(chǎn)生一個(gè)脈沖觸發(fā)信號(hào),可以使用此信號(hào)去中斷ARM。
2.5 CPCI中斷
ARM需要給CPCI產(chǎn)生中斷,機(jī)制如下:
(1)ARM給IO0空間偏移地址2寫入0x01,在INTA#上出現(xiàn)低電平觸發(fā)信號(hào);
(2)主控機(jī)檢測(cè)到此電平觸發(fā)中斷,馬上禁止中斷,往IO1空間偏移地址0寫入0xfb,之后INTA#被拉高,此時(shí)ARM無(wú)法通過(guò)步驟(1)再次發(fā)送中斷,也就是說(shuō),INTA#無(wú)法被ARM拉低;
(3)主控機(jī)處理完臨界代碼之后,往IO1空間偏移地址0寫入0xfa,允許ARM產(chǎn)生中斷,也即,ARM可以通過(guò)步驟(1)再次產(chǎn)生中斷。
2.6 外圍控制
電源控制和觸發(fā)信號(hào)都是通過(guò)ARM或者主控機(jī)給CPCI的特定空間寫入預(yù)定信息,檢測(cè)信息之后做出相應(yīng)的處理[6]。
(1)主控機(jī)向BAR2空間的0偏移寫入0xff、0xfe、0xfd、0xfc實(shí)現(xiàn)上電、掉電、復(fù)位、ISP功能;
(2)主控機(jī)往BAR2空間的0偏移寫入一個(gè)小于128的數(shù),此數(shù)值是給背板產(chǎn)生的觸發(fā)脈沖個(gè)數(shù);
(3)ARM往BAR0空間的1偏移寫入一個(gè)小于256的數(shù),此數(shù)值是給背板產(chǎn)生的觸發(fā)脈沖個(gè)數(shù),ARM能產(chǎn)生的觸發(fā)脈沖比主控機(jī)多一倍。
3 ARM設(shè)計(jì)
在本系統(tǒng)中,ARM和FPGA的總線連接使用IO口模擬實(shí)現(xiàn)。按照前面描述的時(shí)序,ARM中接口相關(guān)功能有:
(1)響應(yīng)中斷信號(hào),讀取、執(zhí)行IO命令;
(2)讀取IO數(shù)據(jù);
(3)讀寫Memory數(shù)據(jù)。
因接口時(shí)序的ARM代碼實(shí)現(xiàn)較簡(jiǎn)單,在此不再贅述,具體的實(shí)現(xiàn)機(jī)制可參看后續(xù)的通信機(jī)制設(shè)計(jì)。
4 通信機(jī)制設(shè)計(jì)
從CPCI的角度看,ARM和主控機(jī)為主設(shè)備,F(xiàn)PGA為從設(shè)備。對(duì)于FPGA來(lái)說(shuō),CPCI接口和ARM接口完全獨(dú)立,但是兩者都可以對(duì)RAM進(jìn)行讀寫,如果沒(méi)有一個(gè)協(xié)調(diào)機(jī)制,很可能發(fā)生讀寫沖突,必須有一個(gè)規(guī)則來(lái)協(xié)調(diào)數(shù)據(jù)的傳送[9-10]。因?yàn)镃PCI為標(biāo)準(zhǔn)接口,所以需要定義的是FPGA和ARM的接口和主控機(jī)驅(qū)動(dòng)讀寫規(guī)則,下面介紹FPGA和ARM的接口和主控機(jī)讀寫規(guī)則。
主控機(jī)與ARM需要交互的數(shù)據(jù)全部放在FPGA的RAM中進(jìn)行緩沖。實(shí)現(xiàn)規(guī)則如下:
(1)IO空間只分配1 B,存放主控機(jī)發(fā)送的命令;
(2)Memory中讀寫空間分開,偏移0~999為主控機(jī)寫、ARM讀數(shù)據(jù)空間,1 000~2 048為主控機(jī)讀、ARM寫數(shù)據(jù)空間。
圖6描述了ARM、CPCI和主控機(jī)的數(shù)據(jù)流向和讀寫流程。為避免系統(tǒng)讀寫沖突,需按照如下規(guī)則執(zhí)行操作:
(1)ARM讀寫CPCI的Memory空間之前,使write_acc或read_acc無(wú)效,讀寫完畢使之有效。
(2)主控機(jī)讀Memory時(shí)首先讀read_acc,如果有效,開始讀所需內(nèi)存,否則等待一段時(shí)間重試;寫Memory時(shí)首先讀write_acc,如果有效,開始往指定內(nèi)存寫數(shù)據(jù),否則等待一段時(shí)間重試;主控機(jī)對(duì)IO的寫不需要讀write_acc。
(3)主控機(jī)寫Memory一般過(guò)程為:先根據(jù)所需命令確定需要將數(shù)據(jù)寫入哪些空間,然后將配置數(shù)據(jù)寫入Memory中,最后把控制命令寫入IO空間;讀Memory則直接讀取數(shù)據(jù)。
本方案用于數(shù)據(jù)采集卡、數(shù)字基帶模擬卡、本振信號(hào)發(fā)生卡、中頻變頻接收卡等多種功能應(yīng)用,兼容研華、凌華等幾大廠家的工控機(jī)箱。
5 結(jié)束語(yǔ)
本文給出了一種基于FPGA的CPCI系統(tǒng)設(shè)計(jì)方案,介紹了實(shí)施基本框架、CPCI協(xié)議、自定義總線通信協(xié)議和通信沖突避免機(jī)制,按照設(shè)計(jì)方案實(shí)現(xiàn)了低成本、高密度、易擴(kuò)展的CPCI通信系統(tǒng),在工程上便于實(shí)現(xiàn),能廣泛應(yīng)用于工控和測(cè)量領(lǐng)域,對(duì)類似設(shè)計(jì)提供了參考。
參考文獻(xiàn)
[1] 任勇峰,彭巧君,劉占峰.基于FPGA的CPCI高速讀數(shù)接口設(shè)計(jì)[J].電子器件,2015(1):148-151.
[2] 田源,王立德,嚴(yán)翔,等.基于FPGA+CPCI的WTB通信板設(shè)計(jì)[J].機(jī)車電傳動(dòng),2014(4):28-32,56.
[3] 王銳,張友方,陳延云,等.基于FPGA的數(shù)據(jù)采集卡的CPCI接口設(shè)計(jì)[J].電子技術(shù),2010,37(2):35-37.
[4] PICMG2.0R3.0,CompactPCI Specification[Z].1999.
[5] PCI Local Bus Specification(Revision 2.3)[Z].PCI Local Bus,2001.
[6] 劉青,馬天乙.CPCI數(shù)據(jù)總線接口的設(shè)計(jì)與實(shí)現(xiàn)[J].電子科技,2011,24(6):95-96,100.
[7] SHANLEY T,ANDERSON D.PCI系統(tǒng)結(jié)構(gòu)[M].北京:電子工業(yè)出版社,2000.
[8] 李貴山,戚德虎.PCI局部總線開發(fā)者指南[M].西安:西安電子科技大學(xué)出版社,1997.
[9] 巫幪,蘇濤,史佳歡.通用信號(hào)處理板卡的CPCI總線接口設(shè)計(jì)和驅(qū)動(dòng)開發(fā)[J].國(guó)外電子元器件,2007(2):26-30.
[10] 郭立俊,譚劍波.一種基于FPGA的CPCI總線接口設(shè)計(jì)方法[J].合肥工業(yè)大學(xué)學(xué)報(bào)(自然科學(xué)版),2014(5):596-599.
作者信息:
魏建勇
(武漢虹旭信息技術(shù)有限責(zé)任公司,湖北 武漢430074)