1.引言
本文所介紹的數(shù)據(jù)采集系統(tǒng)是基于ARM的信號(hào)處理系統(tǒng)中的一部分,該信號(hào)處理系統(tǒng)用于導(dǎo)彈的數(shù)字式自動(dòng)駕駛儀的開發(fā)研究中。整個(gè)系統(tǒng)由信號(hào)放大、信號(hào)濾波、信號(hào)采樣、高速數(shù)字信號(hào)處理等部分組成。其中,數(shù)據(jù)采集系統(tǒng)是一個(gè)重要的環(huán)節(jié),它的高速性和準(zhǔn)確性直接影響到整個(gè)信號(hào)處理系統(tǒng)的性能。傳統(tǒng)方法是應(yīng)用CPU通過軟件控制模數(shù)轉(zhuǎn)換,這樣必將頻繁中斷系統(tǒng)的運(yùn)行從而減弱系統(tǒng)的數(shù)據(jù)運(yùn)算能力,數(shù)據(jù)采集的速度也將受到限制。因此,本文利用可編程邏輯控制器CPLD,由硬件控制模數(shù)轉(zhuǎn)換和數(shù)據(jù)存儲(chǔ),從而最大限度地提高系統(tǒng)的信號(hào)采集和處理能力。
2.系統(tǒng)總體設(shè)計(jì)方案
數(shù)據(jù)采集系統(tǒng)的總體設(shè)計(jì)方案如圖1所示。基于Verilog HDL設(shè)計(jì)的自動(dòng)狀態(tài)機(jī)由硬件控制A/D轉(zhuǎn)換以及自動(dòng)向FIFO中存儲(chǔ)數(shù)據(jù),當(dāng)采樣數(shù)據(jù)達(dá)到要求時(shí),向CPU申請中斷,ARM系統(tǒng)啟動(dòng)DMA完成數(shù)據(jù)讀取。待CPU取走數(shù)據(jù)后,給狀態(tài)機(jī)一個(gè)復(fù)位信號(hào),同時(shí)對采集到的數(shù)據(jù)進(jìn)行高速處理。這期間數(shù)據(jù)采集不中斷,從而實(shí)現(xiàn)連續(xù)的實(shí)時(shí)數(shù)據(jù)采集和實(shí)時(shí)數(shù)據(jù)處理。數(shù)據(jù)采集系統(tǒng)由A/D芯片AD7656、邏輯控制芯片EPM7128、FIFO芯片CY7C425以及緩沖74LVT245組成,控制邏輯用Verilog HDL語言描述。
3.硬件設(shè)計(jì)
3.1 A/D轉(zhuǎn)換芯片
系統(tǒng)的A/D轉(zhuǎn)換芯片采用AD7656,一個(gè)AD7656芯片擁有6個(gè)16位逐次漸進(jìn)模數(shù)轉(zhuǎn)換器,在5V電壓供電下采樣率為250kSPS。芯片中的采樣保持放大器最大處理輸入頻率為8MHz。轉(zhuǎn)換過程和數(shù)據(jù)獲取由CONVST信號(hào)和內(nèi)部時(shí)鐘控制,三個(gè)CONVST管腳可以控制三對獨(dú)立的模數(shù)轉(zhuǎn)換器同時(shí)采樣。AD7656根據(jù)內(nèi)部參考電壓2.5V可提供±10V或者±5V的雙極性模擬量輸入范圍,或者根據(jù)外部參考電壓提供不同范圍的雙極性模擬量輸入信號(hào)。
AD7656的內(nèi)部轉(zhuǎn)換時(shí)序圖如圖2所示。將三個(gè)CONVST管腳連接在一起后,即可對六個(gè)A/D轉(zhuǎn)換器同時(shí)進(jìn)行采樣。CONVST的上升沿觸發(fā)A/D轉(zhuǎn)換,轉(zhuǎn)換時(shí)間為3μs。轉(zhuǎn)換過程中,BUSY信號(hào)保持高電平不變,直到轉(zhuǎn)換結(jié)束時(shí),BUSY信號(hào)由高變低,系統(tǒng)進(jìn)入跟蹤模式,轉(zhuǎn)換結(jié)果存于輸出數(shù)據(jù)寄存器中。當(dāng)片選信號(hào) 保持低電平不變時(shí),連續(xù)六個(gè)讀信號(hào) 低電平能夠依次讀出六個(gè)A/D轉(zhuǎn)換器的轉(zhuǎn)換數(shù)據(jù)。
3.2 FIFO存儲(chǔ)器
系統(tǒng)的FIFO存儲(chǔ)器采用CY7C425,它是CYPRESS公司采用CMOS工藝制造的1K×9位可以實(shí)現(xiàn)先進(jìn)先出算法,可以進(jìn)行異步讀寫操作的雙端口存儲(chǔ)器。它提供全空 、全滿 、半滿 狀態(tài)標(biāo)志,用以防止數(shù)據(jù)溢出或不足。擴(kuò)展邏輯電路允許多片F(xiàn)IFO進(jìn)行數(shù)據(jù)寬度和存儲(chǔ)深度的擴(kuò)展而不會(huì)增加額外的時(shí)間延遲。
CY7C425的異步讀寫時(shí)序圖如圖3所示。當(dāng)寫信號(hào) 為低電平時(shí)發(fā)生寫操作,A/D轉(zhuǎn)換的結(jié)果通過寫操作不斷存入FIFO中,存入一定數(shù)量的數(shù)據(jù)后,再通過讀信號(hào) 將FIFO中的數(shù)據(jù)依次讀入CPU中。采用兩片CY7C425擴(kuò)展為16位1024字的高速異步FIFO存儲(chǔ)器,數(shù)據(jù)處理速度達(dá)到50MHz,可以實(shí)現(xiàn)數(shù)據(jù)的高速寫入和高速讀出。
3.3 狀態(tài)機(jī)模塊
狀態(tài)機(jī)FSM完成自動(dòng)A/D轉(zhuǎn)換和數(shù)據(jù)存儲(chǔ),控制芯片是EPM7128。此狀態(tài)機(jī)由系統(tǒng)時(shí)鐘驅(qū)動(dòng),控制A/D轉(zhuǎn)換器的轉(zhuǎn)換、FIFO的復(fù)位及寫數(shù),并產(chǎn)生中斷信號(hào)通知CPU讀取數(shù)據(jù)。由于系統(tǒng)使用了兩片AD7656,而不同芯片的個(gè)體會(huì)有差別,同一器件也會(huì)有溫漂、時(shí)漂還有老化的問題,如果采用中斷方式取數(shù),很有可能會(huì)引起各個(gè)通道A/D采樣率不一致并且單個(gè)通道A/D工作時(shí)采樣率也不恒定。因此,可以不管BUSY信號(hào),只需要把各段的時(shí)序留夠足夠的裕量就可以了,譬如AD7656的轉(zhuǎn)換時(shí)間是3μs,那么,只要狀態(tài)機(jī)保持CONVST至少3μs的高電平,這樣就可以完全確定A/D轉(zhuǎn)換的結(jié)束。這樣控制器就可以不需要檢測A/D的BUSY信號(hào),同時(shí)也能很準(zhǔn)確地保證采樣速率了。
系統(tǒng)復(fù)位時(shí),轉(zhuǎn)換信號(hào)CONVST及FIFO復(fù)位信號(hào)MR保持低電平不變,此時(shí)不進(jìn)行數(shù)據(jù)采集。系統(tǒng)復(fù)位后,CONVST上升沿觸發(fā)轉(zhuǎn)換開始,系統(tǒng)進(jìn)入采樣保持階段。3μs后,待A/D轉(zhuǎn)換結(jié)束,連續(xù)產(chǎn)生12個(gè)A/D讀脈沖,可以依次讀出12個(gè)通道的轉(zhuǎn)換結(jié)果。取數(shù)的同時(shí)產(chǎn)生FIFO的寫脈沖,可將讀出的數(shù)據(jù)連續(xù)寫入FIFO中。為利于CPU中處理軟件的編寫,CPLD中設(shè)置了一個(gè)計(jì)數(shù)器,可以進(jìn)行32(2的5次方)次采樣。最后發(fā)送中斷信號(hào)到CPU,CPU通過DMA方式將數(shù)據(jù)全部讀入內(nèi)部存儲(chǔ)器,數(shù)字濾波通過取和以后右移5位即可進(jìn)行。
4.Verilog HDL描述
電子系統(tǒng)設(shè)計(jì)中一般遵循自上而下的設(shè)計(jì)思路,對系統(tǒng)進(jìn)行設(shè)計(jì)、描述與仿真??紤]到模塊的通用性、移植性,常常使用硬件描述語言來描述數(shù)字系統(tǒng),如Verilog HDL、VHDL、AHDL語言等。其中Verilog HDL語言具有結(jié)構(gòu)清晰、文法簡明、功能強(qiáng)大、高速模擬和多庫支持等優(yōu)點(diǎn),被近90%的半導(dǎo)體公司使用,成為一種強(qiáng)大的設(shè)計(jì)工具。
4.1 用Verilog HDL語言描述自動(dòng)狀態(tài)機(jī)
自動(dòng)狀態(tài)機(jī)有兩個(gè)輸入信號(hào)和七個(gè)輸出信號(hào)。輸入信號(hào)中CLK由CPU的輸出頻率提供,產(chǎn)生50MHz的時(shí)鐘頻率,RST由CPU提供,負(fù)責(zé)復(fù)位狀態(tài)機(jī)。CONVST產(chǎn)生A/D轉(zhuǎn)換器的轉(zhuǎn)換啟動(dòng)信號(hào);ADC_CS、ADC1_RD、 ADC2_RD分別是兩個(gè)A/D轉(zhuǎn)換器的片選信號(hào)以及讀信號(hào);FIFO_WR和 FIFO_MR控制FIFO的讀數(shù)和復(fù)位;中斷信號(hào)INT通知CPU在DMA方式下取數(shù)。程序如下:
module fsm(RST, CLK, CONVST, ADC_CS, ADC1_RD, ADC2_RD, FIFO_WR, FIFO_MR, INT);
input RST, CLK;
output CONVST, ADC_CS, ADC1_RD, ADC2_RD, FIFO_WR, FIFO_MR, INT;
reg CONVST, ADC_CS, ADC1_RD, ADC2_RD, FIFO_WR, FIFO_MR, INT;
parameter ST0=8‘b00000000, ST150=8’b10010110, ST152=8‘b10011000, ST153=8’b10011001,
ST155=8‘b10011011, ST156=8’b10011100, ST158=8‘b10011110, ST159=8’b10011111,
ST161=8‘b10100001, ST162=8’b10100010, ST164=8‘b10100100, ST165=8’b10100101,
ST167=8‘b10100111, ST168=8’b10101000, ST170=8‘b10101010, ST171=8’b10101011,
ST173=8‘b10101101, ST174=8’b10101110, ST176=8‘b10110000, ST177=8’b10110001,
ST179=8‘b10110011, ST180=8’b10110100, ST182=8‘b10110110, ST183=8’b10110111,
ST185=8‘b10111001;
reg[7:0] COUNTER;
reg[4:0] CN;
always @(posedge CLK)
if(!RST)
begin COUNTER《=0; ADC_CS《=1; ADC1_RD《=1; ADC2_RD《=1;
FIFO_WR《=1; FIFO_MR《=0; CONVST《=0; CN《=0;INT《=0; end
else if(CN》=5’b11111)
begin INT《=1; COUNTER《=0; ADC_CS《=1; ADC1_RD《=1;
ADC2_RD《=1; FIFO_WR《=1; FIFO_MR《=0; CONVST《=0; end
else
begin
if(COUNTER《8‘b11001100)
COUNTER《=COUNTER+8’b00000001;
else
begin CN《=CN+5‘b00001; COUNTER《=0; end
case(COUNTER)
ST0: begin CONVST《=1; FIFO_MR《=1; end
ST150: begin ADC_CS《=0; ADC1_RD《=0; FIFO_WR《=0; end
ST152: begin FIFO_WR《=1; ADC1_RD《=1; end
ST153: begin FIFO_WR《=0; ADC1_RD《=0; end
ST155: begin FIFO_WR《=1; ADC1_RD《=1; end
ST156: begin FIFO_WR《=0; ADC1_RD《=0; end
ST158: begin FIFO_WR《=1; ADC1_RD《=1; end
ST159: begin FIFO_WR《=0; ADC1_RD《=0; end
ST161: begin FIFO_WR《=1; ADC1_RD《=1; end
ST162: begin FIFO_WR《=0; ADC1_RD《=0; end
ST164: begin FIFO_WR《=1; ADC1_RD《=1; end
ST165: begin FIFO_WR《=0; ADC1_RD《=0; end
ST167: begin FIFO_WR《=1; ADC1_RD《=1; end
ST168: begin FIFO_WR《=0; ADC2_RD《=0; end
ST170: begin FIFO_WR《=1; ADC2_RD《=1; end
ST171: begin FIFO_WR《=0; ADC2_RD《=0; end
ST173: begin FIFO_WR《=1; ADC2_RD《=1; end
ST174: begin FIFO_WR《=0; ADC2_RD《=0; end
ST176: begin FIFO_WR《=1; ADC2_RD《=1; end
ST177: begin FIFO_WR《=0; ADC2_RD《=0; end
ST179: begin FIFO_WR《=1; ADC2_RD《=1; end
ST180: begin FIFO_WR《=0; ADC2_RD《=0; end
ST182: begin FIFO_WR《=1; ADC2_RD《=1; end
ST183: begin FIFO_WR《=0; ADC2_RD《=0; end
ST185: begin FIFO_WR《=1; ADC2_RD《=1; ADC_CS《=1; CONVST《=0; end
endcase
end
endmodule
4.2 仿真圖形
圖4為狀態(tài)機(jī)復(fù)位時(shí)的仿真圖形。由圖可以看出,當(dāng)按下復(fù)位鍵時(shí),A/D轉(zhuǎn)換信號(hào)CONVST保持為低電平,A/D轉(zhuǎn)換器不采集數(shù)據(jù)。同時(shí),F(xiàn)IFO復(fù)位信號(hào)FIFO_MR也保持低電平不變,可將FIFO中的數(shù)據(jù)清空。當(dāng)復(fù)位信號(hào)變高后,在外部時(shí)鐘CLK的第一個(gè)上升沿,CONVST電平升高,開始A/D轉(zhuǎn)換(存在時(shí)延)。
圖5為狀態(tài)機(jī)從A/D轉(zhuǎn)換器將數(shù)據(jù)讀入FIFO中的時(shí)序圖。由圖可知,3μs(A/D轉(zhuǎn)換器的轉(zhuǎn)換時(shí)間)后,分別通過對ADC_CS、ADC1_RD、ADC2_RD、FIFO_WR信號(hào)的控制,實(shí)現(xiàn)將12路通道的數(shù)據(jù)依次讀入FIFO中的操作。
5.結(jié)束語
本文提出的自動(dòng)數(shù)據(jù)采集系統(tǒng)采用CPLD芯片,用硬件描述語言設(shè)計(jì)自動(dòng)狀態(tài)機(jī),實(shí)現(xiàn)硬件控制數(shù)據(jù)采集和存儲(chǔ)。目前采集系統(tǒng)應(yīng)用于開發(fā)數(shù)字式自動(dòng)駕駛儀的ARM實(shí)驗(yàn)應(yīng)用板上,省去了ARM監(jiān)控A/D芯片的時(shí)間,使信號(hào)處理系統(tǒng)能夠高效地工作。通過調(diào)整狀態(tài)機(jī)中的采樣次數(shù)或采用轉(zhuǎn)換速率更高的A/D芯片可進(jìn)一步提高系統(tǒng)的數(shù)據(jù)采集速度。
責(zé)任編輯:gt
評(píng)論