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