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