基于FPGA的多路模擬量、數(shù)字量采集與處理系統(tǒng)
摘要:提出一種基于FPGA技術的多路模擬量、數(shù)字量采集與處理系統(tǒng)的設計方案,分析整個系統(tǒng)的結構,并討論FPGA內(nèi)部硬件資源的劃分和軟件的設計方案等。本設計方案外部電路結構簡單可靠,特別適用于多路檢測系統(tǒng)中,而且可以根據(jù)需要容易地對系統(tǒng)進行擴展,對于檢測系統(tǒng)來講具有一定的通用性。 關鍵詞:FPGA A/D采集 數(shù)字量采集 VHDL語言設計 在電氣測控系統(tǒng)中,常常需要采集各種模擬量信號、數(shù)字量信號,并對它們進行相應的處理。一般情況下,測控系統(tǒng)中用普通MCU(如51、196等單片機或控制型DSP)是可以完成系統(tǒng)任務的。但當系統(tǒng)中要采集的信號量特別多時(特別是各種信號量、狀態(tài)量),僅僅靠用普通MCU的資源就往往難以完成任務。此時,一般只能采取多MCU聯(lián)機處理模式,或者靠其它芯片擴展系統(tǒng)資源來完成系統(tǒng)的監(jiān)測任務。這樣做不僅增加了大量的外部電路和系統(tǒng)成本,而且大大增加了系統(tǒng)的復雜性,因而系統(tǒng)的可靠性就會受一定的影響,這顯然不是設計者所愿意看到的。本文所提出的一種基于FPGA技術的模擬量、數(shù)字量采集與處理系統(tǒng),利用FPGA的I/O端口多,且可以自由編程支配、定義其功能的特點,配以VHDL編寫的FPGA內(nèi)部執(zhí)行軟件,能很好地解決采集的信號路數(shù)多的問題。因為用VHDL編寫的執(zhí)行軟件內(nèi)部對各組數(shù)字量是按并行處理的,而且FPGA硬件的速度是ns級的,這是當前任何MCU都難以達到的速度,因此本系統(tǒng)比其它系統(tǒng)更能實時地、快速地監(jiān)測信號量的變化。所以在狀態(tài)量特別多的監(jiān)測系統(tǒng)中,本系統(tǒng)將更能發(fā)揮出自身的優(yōu)勢。 本系統(tǒng)中的外圍電路設計相對簡單、可靠,且鑒于FPGA和VHDL語言自身的特點,系統(tǒng)具有較好的擴展性,在監(jiān)測和控制系統(tǒng)中也具有一定的通用性。系統(tǒng)主要包括:FPGA芯片區(qū)、多路選擇與A/D采樣電路、交流信號調(diào)理電路、光耦隔離驅(qū)動電路、時鐘電源區(qū)、PROM代碼下載電路等幾部分。結構示意如圖1所示。 本系統(tǒng)中的FPGA是采用Xilinx公司的Spantan-II系理XC2S100-5 PQ208。該系列的內(nèi)核采用2.5V供電,工作頻率最高可達200 MHz;I/O端口供電電壓為3.3V,可以承受5V的輸入高電平。 Spartan-II系列具有豐富的I/O口資源,I/O口輸出緩沖器呆以接收高達24mA的拉電流和48mA的灌電流。缺省時,I/O輸出口的驅(qū)動能力的12mA,也可以設置成2、4、6、8、16或24mA。 FPGA內(nèi)部資源劃分為四大部分,如圖2所示。 ①FPGA邏輯運算中心。用來接收其它各部分的數(shù)據(jù),并按照程序中設定的方案對所收到的數(shù)據(jù)進行相應的分析和處理。包括:對從MCU接收來的數(shù)據(jù)指令進行分析,并按其指令要求進行相應操作;接收A/D采樣來的數(shù)據(jù),對數(shù)據(jù)進行各種處理,如求其有效值,進行FFT分析等;接收來自數(shù)字量的各種信息數(shù)據(jù),按設定的模式對其進行判斷處理,并負責按接收的CPU指令輸出相應的數(shù)字量。 ②A/D控制單元。主要負責控制外部A/D芯片和多路開關的選通時序,以及實現(xiàn)對A/D采要過程的合理控制。因為,在FPGA芯片內(nèi)部,不像在MCU內(nèi)部那樣有豐富的外設控制資源供用戶使用,要用FPGA來控制A/D采樣過程的動作,必須用軟件來模擬實現(xiàn)各種A/D控制資源。利用這些自設定的A/D控制管理資源,配以合理的軟件控制時序,才能保證采樣過程的順利進行。 ③數(shù)字量監(jiān)測控制單元。負責所有要監(jiān)視和控制的數(shù)字量的狀態(tài)數(shù)據(jù)的采集和控制命令的輸出。這一部分同樣也需要用軟件來模擬實現(xiàn)各種對數(shù)字量的管理控制,只有配備較完備的外設控制管理單元,整個數(shù)字量的管理控制才能正確合理地進行。 ④FPGA接口邏輯控制單元。在FPGA內(nèi)部設計了FPGA模塊與外界MCU的接口單元,這雖然占去了一定的內(nèi)部資源,但是考慮到在一般的工程系統(tǒng)中不僅僅包括對各種信息的采集控制,還往往包括通信、顯示以及進行一些復雜算術運行等等。FPGA雖然有其顯著的長處,但是在這些方面實現(xiàn)起來就往往不如普通MCU來得容易,因此考慮到本系統(tǒng)的通用性,在設計上增加了FPGA模塊與外界MCU的接口單元。 在交流模擬量采集外圍電路中,A/D芯片采用的是BB公司的ADS774。多路交流量是通過4051的多路開關后輸入到ADS774芯片的。交流信號在進入ADS774之前要經(jīng)過信號調(diào)量電路,調(diào)理成ADS774認可的模擬信號。 FPGA實現(xiàn)的交流量采樣處理控制軟件由五部分組成: 第一部分為設定的3個與A/D采樣有關的16位指令寄存器組:A/D參數(shù)寄存器(ADPR)、輸出控制寄存器(ADOR)、A/D控制寄存器(ADCR)。 ADPR(XXXXXXXXX XXXXX XX)的各位定義如下:位1、位0選擇每周波采樣的點數(shù)(00表示每周波采16個點,01表示每周波采32個點,10表示每周波采64個點,11表示每周波采128個點)。位6~位2用來表示FPGA的時鐘頻率,00001表示時鐘頻率為1MHz,11111表示時鐘頻率為31MHz,00000表示時鐘頻率為32MHz。位15~位7表示所采樣信號的頻率,這9位表示的范圍為1Hz~512Hz。 ADOR是與FPGA輸出有關的寄存器。該寄存器的作用是:當MCU要讀取某通道信號的信息時,F(xiàn)PGA應該輸出該信號的哪次諧波電壓。如為FFFFH,表示DSP讀到的是該通道信號的有效值;如果ADOR的值為0010H,那么,DSP讀到的是該通道信號的2次諧波電壓。 ADCR寄存器控制A/D采樣的通道數(shù)的選擇以及與A/D采樣有關的寄存器的復位控制等,這也是考慮到系統(tǒng)的通用性而設計的:如000C表示采樣第11路交流模擬量電壓;0011則表示同時采樣前六路信號等等。 第二部分為設計產(chǎn)生A/D與CD4051芯片的控制信號。如在圖2中,在采樣12路交流模擬量的情況下,F(xiàn)PGA需要產(chǎn)生7路控制信號,這7路控制信號應該滿足一定的時序要求。圖3給出了同時采樣前六路信號時FPGA的控制信號時序。 Abcs2[0,1,2]總線信號實際上是多路開關通道選擇的3個控制信號selA、selB、selC。需要說明的是,因為要進行修正,在對6路交流信號采樣的同時,也對4051的+5V和AGND進行了采樣,所以實際上測量的通道數(shù)為8路。 從圖3可看出,abcs2[0,1,2]總線信號每19.531 25μs加1,每156.25μs重新循環(huán)一次,滿足8路交流同步采樣的要求。 從25μs時刻的局部放大圖可以看出,當(23.6μs時刻)4051選擇通道1時,ADS774的CS和R/C信號同時為低,延時0.5μs左右CE端出現(xiàn)上升沿(24.1μs),啟動A/D轉換,這符合ADS774的A/D轉換時序。需要指出,如果CE端直接接高電平,那么,R/C的下降沿將直接啟動A/D轉換。之所以用兩個信號來啟動A/D轉換,是為了減少A/D的誤觸發(fā)??紤]到4051的導通延時,所以在通道切換0,5μs后才啟動A/D轉換。圖3中沒有畫出4051的INH信號,在采樣前6路交流信號時,該信號一直為低。如果同時采樣12路信號,那么,abcs2[0,1,2]總線信號每9.765 625μs加1,每78.125μs重新循環(huán)1次;INH信號每78.125μs電平變化1次,用來選擇哪個4051導通。 第三部分為A/D輸入數(shù)據(jù)緩沖區(qū)和數(shù)字濾波模塊。A/D轉換完成后,ADS774的引腳STS給FPGA輸出轉換完成信號(低電平)。FPGA接收這一信號后,將產(chǎn)生讀ADS774的時序,把12位的A/D轉換數(shù)據(jù)讀入到數(shù)據(jù)緩沖區(qū)的二維數(shù)組datain(abcv)(sampn)中。Abcv為通道號,sampn表示周波信號中所采樣的第幾個點。將一個周期的12路信號采樣完后,置標志ADFLAG為1,進行數(shù)據(jù)的濾波處理。首先,對datain(abcv)(sampn)的值進行修正;給定sampn,對前6路信號來說,datain(7)(sampn)存儲的是AGND的A/D轉換值,將datain(i)(sampn)減去datain(7)(sampn)的值存儲在datamid(i)(sampn)中(i=1,…,6)。與此類似,后六路的采樣值datain(i)(sampn)減去datain(15)(sampn)的值存儲在datamid(i)(sampn)(i=8,…,14)。然后,給定abcv,對datamid(abcv)(j)(j=0,…,15)這16個點的數(shù)據(jù)進行FIR濾波,將FIR濾波后的數(shù)據(jù)存儲在datamd(abcv)(sampn)數(shù)組中。 第四部分是均方根有效值計量和FFT諧波分析模塊。輸入的數(shù)據(jù)經(jīng)過處理后,首先進行均方根有效值的計算。給定abcv,先求出datamd(abcv)(j)(j=0,…,15)這16個點的平方和,將其存儲到datarsult(abcv)中。為了防止溢出,dataresult(abcv)定義28位的位矢量。然后把dataresult(abcv)中的數(shù)據(jù)進行平方的運算,結果存儲在douts(i)中。開平方是利用函數(shù)sqt(a:std_logic_vector;b:integer)return std_logic_vector來實現(xiàn)的。a為要開方的全矢量數(shù)據(jù);整數(shù)b用來定義輸出位矢量的長度。該函數(shù)被封裝成一個包(package),符合自頂向下(TopDown)的HDL語言設計思想。douts(i)是信號量,由賦值語句douts(i)<=sqt(dataresult (i);16)(i=0,…,15)可以分別求出12路信號的有效值。電壓有效值和諧波分析完成以后,清ADFLAG為0。 第五部分為輸出緩沖器單元。當DSP對FPGA產(chǎn)生讀時序(FPGACS為低電平且RD下降沿來到時),F(xiàn)PGA根據(jù)DSP的低五位地址線A0~A4的值(對應于FPGA的chansel:std_logic_vector(4 downto 0)信號量),以及ADOR寄存器中的值,將相應的數(shù)據(jù)送到數(shù)據(jù)總線上。比如,若chansel為(00010)2,ADOR中的值為FFFFH,那么,F(xiàn)PGA就會將通道2的有效值douts(2送到數(shù)據(jù)總線上。 在圖2系統(tǒng)中,假定要對16個負載進行管理,每個負載包括1個控制輸出量和2個狀態(tài)返回量,因此共有16路的數(shù)字量輸出,32路的數(shù)字量輸入。 FPGA對數(shù)字量的管理軟件結構: FPGA對數(shù)字量的控制管理也設置了三個16位的指令寄存器組。這三個指令寄存器的內(nèi)部地址為03H、04H和05H.03H為開關量輸出允許寄存器(KGER);04H為跳閘閉合寄存器(KGCR);05H為開關量開閉寄存器(KGIR)。 來自負載的總共32個狀態(tài)反饋信號(DIN00、DIN01……DIN31)分成16組,分別接到FPGA的16個信號量dini上(i=1,2,…,15)。dini是長度為2的位矢量std_logic_vector(1 downto 0),分別對應于1個負載的兩個狀態(tài)反饋位。FPGA用16個進程process(din1)、process(din1)……process(din15)來對輸入數(shù)字量敏感。當dini的載位電平發(fā)生變化時,進程啟動,F(xiàn)PGA結合MCU發(fā)送的控制指令,判斷負載的狀態(tài),并記錄在輸出數(shù)據(jù)緩沖區(qū)中。輸出數(shù)據(jù)緩沖區(qū)包括16個數(shù)據(jù)存儲器,這16個數(shù)據(jù)存儲器在FPGA內(nèi)部的地址從(10000)2到(11111)2。(100000)2單元存儲的是第1個負載的狀態(tài),以此類推,(10000)2單元存儲的是第16個負載的狀態(tài)。每個16位數(shù)據(jù)存儲器的8位固定為5AH,接下來的5位為(00000)2,只有最后3位才是負載的狀態(tài)位。 當MCU讀FPGA時,process(rd)進程啟動。這時,如果MCU地址線A4的電平(對應于FPGA的chansel:std_logic_vector(4 downto 0)信號量的第四位)為“1”,F(xiàn)PGA就根據(jù)chanse1(3 downto 0)的值,將對應的數(shù)據(jù)存儲器的值發(fā)送到數(shù)據(jù)總線上。MCU讀回數(shù)據(jù)存儲器的值后,如果前13位不是(0101101000000)2,說明產(chǎn)生了讀錯誤,MCU重新再讀一次。必須指出,在FPGA控制A/D采樣時,讀哪個通道信息也是通過A0~A3地址線區(qū)分的,但是,A4的電平為低。 MCU根據(jù)系統(tǒng)處于不同的狀態(tài)給負載發(fā)送接通/斷開指令,這是通過寫FPGA的寄存器KGIR實現(xiàn)的。KGIR的16位依次代表16個負載,“1”為接通,“0”為斷開,復位值是0000H.寄存器KGER是數(shù)字量輸出的總開關,復位后為0000H,不允許數(shù)字量輸出;MCU對其寫入FFFFH后,允許數(shù)字量輸出。FPGA給負載發(fā)去接通/斷開指令后,負載將會有兩個狀態(tài)信號返回。FPGA結合寄存器KGIR的控制指令值,可以判定負載處于何種狀態(tài)之一。如果反饋的信息為跳閘,F(xiàn)PGA將根據(jù)寄存器KGCR的值作出相應的處理。如果為其它信息,F(xiàn)PGA將不做處理,只是將狀態(tài)信息存儲在數(shù)據(jù)緩沖區(qū)中等待發(fā)送給權限高的MCU來決定。KGCR的復全值是0001H,表示跳閘發(fā)生后,F(xiàn)PGA將自動再發(fā)一次接通指令。程序運行的過程中,MCU根據(jù)任務的緊急和系統(tǒng)的布局,可以修改KGCR的值。如果KGCR的值為0003H,表示第一次跳閘發(fā)生后,F(xiàn)PGA可以重復發(fā)三次接通指令。 因為FPGA是基于RAM工藝的,在掉電后本身不能保存信息,因此需要一個外置存儲芯片來保存其信息,這里采用一次可編程的PROM:XC17S100APD8I(OTP)。該PROM與Spartan-II芯片的接口只需要一個I/O;復位引腳的極性可編程(高有效或低有效);供電電壓為3.3V。 XC17S100A的DONE、INIT、CCLK信號來自FPGA芯片XC2S100。系統(tǒng)剛一上電,F(xiàn)PGA首先初始化,置INIT、DONE為低。INIT為低后復位PROM,此時由于PROM的CE為低,因此PROM被選中,從而將數(shù)據(jù)流從DATA腳輸入到FPGA的DIN腳。配置完成后,F(xiàn)PGA將DONE接高,PROM處于低功耗的待機模式,并將DATA腳置為高阻態(tài)。 在硬件調(diào)試和在線修改過程中,選用FPGA的CCLK、DONE、DIN、PROG引腳用做硬件調(diào)試編程。將下載電纜接在計算機并口上,選擇恰當?shù)南螺d方式就會將Xilinx開發(fā)軟件生成的位流文件下載到FPGA的內(nèi)部配置存儲器中。配置下載流程可以分為3個階段:初始化、清除配置內(nèi)存、下載數(shù)據(jù)。清除內(nèi)存在所有配置模式中都是一樣的,下載數(shù)據(jù)卻隨著配置方式的不同而不同。 實際應用中,一般都需要將數(shù)據(jù)流文件燒入到Xilinx PROM中,每次上電伊始,由PROM將數(shù)據(jù)流下載到FPGA中,下載完畢,F(xiàn)PGA開始工作。 4 結論 針對監(jiān)測系統(tǒng)監(jiān)測信號一般較多的特點,本文提出了一種基于FPGA技術的多路模擬量、數(shù)字量采集與處理系統(tǒng),設計了相應的外圍硬件電路和系統(tǒng)處理軟件。在仿真和綜合調(diào)試成功的基礎上,本系統(tǒng)成功用于某航空重點預研項目的電氣負載管理系統(tǒng)試驗中。試驗結果表明,本系統(tǒng)成功地完成了對多路模擬量、數(shù)字量的采集處理任務,因此,在電氣測控系統(tǒng)中有較好的應用前景。 |