李 華,劉寶盈,劉 萌,謝 謙
(商洛學(xué)院,陜西商洛,726000)
在實(shí)際工程應(yīng)用中,數(shù)據(jù)采集是最重要的設(shè)計(jì)環(huán)節(jié)之一。傳統(tǒng)的設(shè)計(jì)形式存在一次只采集一路數(shù)據(jù)且傳輸距離較短、容易丟包等缺陷,已經(jīng)遠(yuǎn)遠(yuǎn)不能滿足實(shí)際應(yīng)用的需要。另一方面,從設(shè)計(jì)的角度考慮,因?yàn)橥瑫r(shí)采集并傳輸多路數(shù)據(jù)要兼顧準(zhǔn)確性和速度等眾多因素,所以必須采用新的設(shè)計(jì)思路與方法來實(shí)現(xiàn)。本文以Xilinx公司的FPGA為主控芯片,結(jié)合TI公司的多路、高速ADC以及Philips公司的CAN協(xié)議芯片—SJA1000實(shí)現(xiàn)了對8路模擬數(shù)據(jù)的實(shí)時(shí)采集與傳輸。文章在理論分析的同時(shí)還給出了相關(guān)設(shè)計(jì)的ModelSim時(shí)序仿真波形,并對系統(tǒng)的實(shí)際采集與傳輸效果進(jìn)行了分析與評價(jià)。
本文所設(shè)計(jì)的8數(shù)據(jù)采集與傳輸系統(tǒng)以FPGA為核心,首先用于產(chǎn)生ADC128正常工作所需要的時(shí)序,當(dāng)ADC128正常工作并輸出一位數(shù)字信號時(shí),將一位信號送入FPGA進(jìn)行串并轉(zhuǎn)換,同時(shí)進(jìn)行數(shù)據(jù)重組,用于改變數(shù)據(jù)格式以適應(yīng)SJA1000的傳輸需要,然后將數(shù)據(jù)通過SJA1000協(xié)議芯片輸出,經(jīng)PCA82C250后傳給應(yīng)用系統(tǒng)。整個(gè)系統(tǒng)充分發(fā)揮了FPGA并行運(yùn)算的優(yōu)勢,有效提高了數(shù)據(jù)采集和傳輸?shù)乃俣群途取?/p>
圖1 系統(tǒng)原理框圖
圖1 所示為本文系統(tǒng)的原理框圖,系統(tǒng)的具體工作過程為:將需要采集的8路模擬信號連接到ADC128的輸入端(IN0-IN7),為了使ADC能夠工作在50kSPS采集模式下,F(xiàn)PGA提供給ADC128的時(shí)鐘頻率為0.8MHz,這時(shí)ADC就開始以0.8MHz的數(shù)據(jù)速率輸出一位數(shù)字信號。為了應(yīng)用方便,系統(tǒng)首先將一位數(shù)字信號經(jīng)過串并轉(zhuǎn)換,變成12位的數(shù)字信號。但是一般傳輸系統(tǒng)的數(shù)據(jù)形式是8位,因此為了節(jié)約帶寬,通過數(shù)據(jù)重組單元將12位信號重組成8位數(shù)字信號。因?yàn)锳DC128以50kSPS的速率采集數(shù)據(jù)時(shí),它每秒輸出的數(shù)據(jù)量為50k*12b=0.6Mb,相應(yīng)的帶寬為0.6Mbps,而CAN的最大傳輸速率為1Mbps,滿足帶寬要求;和一般的通信總線相比,CAN總線具有更好的數(shù)據(jù)通信可靠性、實(shí)時(shí)性和靈活性,因此應(yīng)用領(lǐng)域越來越廣泛,鑒于以上考慮,本文利用CAN總線傳輸采集到的數(shù)據(jù)。
ADC128是美國TI公司的一款單5V供電的12位高速、低功耗、8通道同步采樣模數(shù)轉(zhuǎn)換器。ADC128的控制主要由SCLK、DOUT、DIN和CS完成,其中,SCLK 是AD時(shí)鐘,控制著轉(zhuǎn)換過程和讀出過程,它的頻率直接影響著轉(zhuǎn)換速率,本文設(shè)計(jì)使用的是0.8MHz,保證了50kSPS的轉(zhuǎn)換速率;DOUT是數(shù)字信號輸出端口,位寬為1,在SCLK的下降沿輸出結(jié)果;DIN是控制信號,主要用于設(shè)置ADC的寄存器用于轉(zhuǎn)換信號的選擇,位寬為1 ,在SCLK的上升沿使能;CS是芯片使能信號,位寬為1,只有當(dāng)CS為低電平時(shí),ADC的AD轉(zhuǎn)換過程才能繼續(xù)。
圖2所示為ADC128采集8路數(shù)據(jù),經(jīng)過串并轉(zhuǎn)換得到12位并行數(shù)據(jù)的時(shí)序仿真波形。在CS為低時(shí),Din用于對輸入模擬通道進(jìn)行選擇,本設(shè)計(jì)從0-7依次累加,完成8路數(shù)據(jù)的采集。ADC128在設(shè)計(jì)時(shí)需要注意的是,它是延時(shí)輸出器件,即第0個(gè)過程選擇的數(shù)據(jù),在第1個(gè)過程數(shù)據(jù)才輸出,所以,一次數(shù)據(jù)周期總共的轉(zhuǎn)換過程為9個(gè),即第7個(gè)數(shù)據(jù)選擇完成后,還要加一個(gè)讀出周期,這樣才能將輸入的8路數(shù)據(jù)完整的采集出來。
圖2 ADC128采集8路數(shù)據(jù)仿真波形
由于ADC128每次輸出的數(shù)據(jù)是12bit,而CAN總線的數(shù)據(jù)幀格式是8bit,因此,為了傳輸方便且不浪費(fèi)帶寬,我們將ADC128輸出且經(jīng)過串并轉(zhuǎn)換過的數(shù)據(jù)進(jìn)行了處理,其思路是數(shù)據(jù)拼接,例如取第一個(gè)數(shù)據(jù)的高8位輸出給CAN,再將第一個(gè)數(shù)據(jù)的低4位和第二個(gè)數(shù)據(jù)的高4位組合輸給CAN,把第二個(gè)數(shù)余下的8位作為CAN的第三個(gè)數(shù)據(jù),如此處理之后,就實(shí)現(xiàn)了ADC128和CAN總線之間數(shù)據(jù)格式的匹配,不會(huì)造成數(shù)據(jù)的丟失,同時(shí)充分利用了CAN總線的帶寬,不會(huì)造成浪費(fèi)。
但是,數(shù)據(jù)拼接后,在數(shù)據(jù)傳輸過程中給數(shù)據(jù)的識別帶來了一定的影響,因?yàn)镃AN協(xié)議一次只能傳輸8個(gè)字節(jié)的數(shù)據(jù),而ADC一次輸出的數(shù)據(jù)轉(zhuǎn)化成8位數(shù)據(jù)需要12字節(jié),因此,整個(gè)采集傳輸過程就變?yōu)榱艘粋€(gè)數(shù)據(jù)流,即:無法區(qū)分什么地方是數(shù)據(jù)開始,什么地方是數(shù)據(jù)結(jié)束。為了解決這個(gè)問題,我們采取了添加數(shù)據(jù)標(biāo)識的方法,即每包數(shù)據(jù)的開始用0x55標(biāo)識,而一幀數(shù)據(jù)結(jié)束則用0xAA標(biāo)識,這樣,數(shù)據(jù)解析單元就可以根據(jù)這兩個(gè)標(biāo)識碼,將其中間的數(shù)據(jù)提取,并按照拼接規(guī)則解析即可。
CAN總線的操作主要是通過對CAN總線控制器—SJA1000進(jìn)行操作來完成, SJA1000的操作主要分為三個(gè)步驟:初始化、數(shù)據(jù)發(fā)送和數(shù)據(jù)接收,如圖3所示。
圖3 SJA1000控制流圖
2.3.1 初始化過程
在SJA1000上電后,首先進(jìn)行硬件復(fù)位,即給reset管腳一個(gè)低電平,并且要持續(xù)100ms的時(shí)間,再將該信號抬高,完成硬件的初始化。然后進(jìn)行軟件復(fù)位,即進(jìn)行寄存器的初始化以完成特定的功能,由于本設(shè)計(jì)使用的是BasicCAN模式,因此主要是對以下寄存器進(jìn)行賦初值:控制寄存器、命令寄存器、狀態(tài)寄存器、中斷寄存器、驗(yàn)收代碼寄存器、驗(yàn)收屏蔽寄存器、總線定時(shí)0、總線定時(shí)1、輸出控制寄存器和時(shí)鐘分頻器。其中,驗(yàn)收代碼寄存器和驗(yàn)收屏蔽寄存器主要用于標(biāo)識碼的確認(rèn);總線定時(shí)0、總線定時(shí)1用于總線傳輸速度的設(shè)定,最大總線長度越長,傳輸速度越低;輸出控制寄存器用于設(shè)置總線輸出驅(qū)動(dòng)方式。
軟件的初始化本質(zhì)上是對SJA1000的特定寄存器進(jìn)行寫操作,但是前提是要在復(fù)位模式下進(jìn)行,即寫之前先要設(shè)置模式寄存器的RM為1使SJA1000進(jìn)入復(fù)位模式。SJA1000的初始化過程的時(shí)序仿真如圖4所示。在ALE的下降沿將寄存器打入,在WR的上升沿將數(shù)據(jù)寫入,完成對SJA1000的初始化。
圖4 SJA1000初始化過程
2.3.2 發(fā)送數(shù)據(jù)
SJA1000的數(shù)據(jù)發(fā)送和初始化類似,也是將要發(fā)送的數(shù)據(jù)寫入SJA1000。但是SJA1000在發(fā)送數(shù)前,一般先檢查狀態(tài)寄存器的3個(gè)狀態(tài)位:
1)接收狀態(tài)位(SR.4):如果目前SJA1000正在接收信息,則不能發(fā)送,至少等到本次接收完畢才能申請發(fā)送;
2)發(fā)送狀態(tài)位(SR.3):檢查SJA1000是否正在發(fā)送信息,如果正在發(fā)送,則需要等一次發(fā)送完成才能啟動(dòng)新的發(fā)送任務(wù);
3)發(fā)送緩存區(qū)(SR.2):只有該緩沖區(qū)處于釋放狀態(tài)時(shí)才能發(fā)送信息。
當(dāng)以上3個(gè)寄存器滿足寫要求時(shí),開始SJA1000的寫操作。因?yàn)锽asicCAN一包數(shù)據(jù)由10個(gè)字節(jié)組成,因此,一包數(shù)據(jù)的發(fā)送要連續(xù)對10-19共10個(gè)寄存器進(jìn)行連續(xù)10次的數(shù)據(jù)寫入,其中,前兩個(gè)字節(jié)為描述符,分別定義了識別碼、數(shù)據(jù)類型和數(shù)據(jù)長度。因?yàn)椋覀冊隍?yàn)收代碼寄存器設(shè)置了相應(yīng)的代碼約定,因此,描述符的第一個(gè)字節(jié)要和設(shè)置的代碼完全一致才能發(fā)送成功,同時(shí),驗(yàn)收代碼位和信息識別碼的高8位相等且與驗(yàn)收屏蔽位的相應(yīng)位相或應(yīng)該為1,因此,驗(yàn)收屏蔽寄存器設(shè)置成0xFF的形式。1位的遠(yuǎn)程發(fā)送請求PTR,為1時(shí)表示無數(shù)據(jù),為0時(shí)根據(jù)數(shù)據(jù)長度確定后面的數(shù)據(jù),數(shù)據(jù)長度DLC,有8、4、2、1四個(gè)選項(xiàng),數(shù)據(jù)的長度位設(shè)置的是要發(fā)送數(shù)據(jù)的長度。接下來的8個(gè)字節(jié)用于存放數(shù)據(jù)。這樣,一個(gè)完整的CAN數(shù)據(jù)幀就完成了,使能發(fā)送寄存器CMR.0完成數(shù)據(jù)幀的發(fā)送。相應(yīng)的時(shí)序仿真波形如圖5所示:
圖5 SJA1000寫數(shù)據(jù)時(shí)序仿真波形
2.3.3 接收數(shù)據(jù)
相比發(fā)送過程,接收過程要相對復(fù)雜一些,有些文獻(xiàn)使用了查詢方式進(jìn)行,即接收緩存器RXFIFO中有數(shù)據(jù)時(shí),接收緩沖標(biāo)志位RBS為1,這時(shí)就可以進(jìn)行讀操作,但是,這種方式要不停的查詢該位以判斷何時(shí)進(jìn)行讀操作,因此,實(shí)際操作過于麻煩。本文設(shè)計(jì)將SJA1000的/INT管腳作為外部觸發(fā)條件,即當(dāng)系統(tǒng)捕獲到/INT的下降沿時(shí),表明有中斷,再查詢是不是數(shù)據(jù)中斷,是表明接收緩存器RXFIFO有數(shù)據(jù)存在,開始讀取數(shù)據(jù)。這樣的設(shè)計(jì)避免了不停的查詢,因此,簡化了設(shè)計(jì)。其中,SJA1000的查詢操作是將需要查詢的寄存器送入地址A7-A0,然后讀取數(shù)據(jù)D7-D0,根據(jù)D7-D0的值判斷下一步的動(dòng)作,當(dāng)然此處僅需發(fā)送一包數(shù)據(jù)即可,如果要查詢多個(gè)寄存器,就一次發(fā)送多個(gè)數(shù)據(jù)包。
發(fā)送緩存器的地址是10-19,而接收緩存器的識別碼、遠(yuǎn)程發(fā)送請求位和數(shù)據(jù)長度碼同發(fā)送緩沖器的相同只不過地址是20-29。讀一般也要連續(xù)進(jìn)行10次,前面2包是描述符,包括11位的識別碼,1位的遠(yuǎn)程發(fā)送請求PTR和數(shù)據(jù)長度DLC信息。由于本文系統(tǒng)約定了數(shù)據(jù)長度是8字節(jié),因此,后面8字節(jié)全是有效數(shù)據(jù)。讀完一包數(shù)據(jù),需要釋放緩沖區(qū),返回空閑狀態(tài),即使能寄存器CMR.2,為下一包數(shù)據(jù)的接收做準(zhǔn)備。
本文系統(tǒng)使用了模塊化設(shè)計(jì)思想和自頂向下的設(shè)計(jì)思路,利用VerilogHDL語言、在Xilinx公司的ISE10.1軟件環(huán)境下實(shí)現(xiàn),硬件平臺選用的是xilinx公司的XC2V3000。為了驗(yàn)證本文系統(tǒng)的數(shù)據(jù)采集效果,我們從兩方面進(jìn)行說明。一方面,3.1和3.3節(jié)的時(shí)序仿真波形從理論上證明了設(shè)計(jì)的正確性;另一方面,本文系統(tǒng)設(shè)計(jì)完成后,進(jìn)行了芯片燒寫,并對實(shí)際數(shù)據(jù)進(jìn)行了采集,為了直觀,我們使用的是Xilinx自帶的Chipscope進(jìn)行觀測,結(jié)果如圖6所示,表示的是將ADC128采集的一包數(shù)據(jù)發(fā)給SJA1000的情況,數(shù)據(jù)以0x55開始,后面緊接采集到的數(shù)據(jù),進(jìn)一步證明了設(shè)計(jì)的可行性和正確性。
圖6 發(fā)送采集數(shù)據(jù)過程截圖
本文設(shè)計(jì)僅采用一片F(xiàn)PGA完成了對8路模擬數(shù)據(jù)的采集、數(shù)據(jù)格式的轉(zhuǎn)換和數(shù)據(jù)的CAN總線傳輸,使傳統(tǒng)復(fù)雜的系統(tǒng)得到簡化,同時(shí)采用了流水線設(shè)計(jì)的思想,充分發(fā)揮了FPGA的并行設(shè)計(jì)優(yōu)勢,使整個(gè)過程做到了實(shí)時(shí)處理,相比傳統(tǒng)的基于單片機(jī)的設(shè)計(jì),更加靈活,并且移植更加方便,從而大大提高了效率。目前,該系統(tǒng)已經(jīng)成功應(yīng)用到某工業(yè)現(xiàn)場。另外,雖然本文設(shè)計(jì)用于采集8路模擬信號,但是,我們對整個(gè)系統(tǒng)分析可知,只要修改一下采集對象和路數(shù),該系統(tǒng)就可以應(yīng)用到其它數(shù)據(jù)采集系統(tǒng)中,具有較好的通用性。
[1]仲建鋒,胡慶生,孫遠(yuǎn).基于FPGA的多路高速串并轉(zhuǎn)換器設(shè)計(jì)[J].電子器件,2008, 31(2):657~660.
[2]張貴清,朱磊,顏露新,等.基于FPGA的多路同步實(shí)時(shí)數(shù)據(jù)采集方案設(shè)計(jì)與實(shí)現(xiàn)[J].測控技術(shù) ,2005,24(12):26~29.
[3]儲(chǔ)成君,任勇峰,劉東海,等.基于FPGA的多通道信號采集電路設(shè)計(jì)[J].科學(xué)技術(shù)與工程,2013,13(19):5692~5695。
[4]陳彥,張宏偉,林宏宇.基于FPGA的CMOS圖像傳感器LUPA-4000時(shí)序設(shè)計(jì)[J].航天器返回與遙感 ,2012,33(5):62~67.