基于FPGA軟核的高速數(shù)據(jù)采集系統(tǒng)設(shè)計(jì)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
數(shù)據(jù)采集在現(xiàn)代工業(yè)生產(chǎn)及科學(xué)研究中的重要地位日益突出,同時(shí)對(duì)實(shí)時(shí)采集、實(shí)時(shí)傳輸、實(shí)時(shí)處理的高速數(shù)據(jù)采集的要求也不斷提高。此外,對(duì)于不同的場(chǎng)合,數(shù)據(jù)采集系統(tǒng)的數(shù)據(jù)采樣參數(shù)要求也不同。工業(yè)生產(chǎn)與科研領(lǐng)域中對(duì)數(shù)據(jù)采集研發(fā)提出了以下的要求:(1)接口簡(jiǎn)單靈活且有較高的數(shù)據(jù)傳輸率;(2)采集器體積小、抗干擾能力強(qiáng)、能夠?qū)?shù)據(jù)做出快速的存儲(chǔ),并及時(shí)進(jìn)行分析和處理;(3)設(shè)計(jì)周期短,能快速適應(yīng)市場(chǎng)需求。
USB2.0以其即插即用、支持熱插拔的靈活性,以及高達(dá)480 Mb/s的傳輸速率,成為了高速數(shù)據(jù)傳輸接口的首選。而FPGA以其工作頻率和集成度高、穩(wěn)定性良好、抗干擾能力強(qiáng)等優(yōu)點(diǎn),逐步成為各領(lǐng)域數(shù)據(jù)采集數(shù)字電路的首選。FPGA集成軟核有設(shè)計(jì)周期短、設(shè)計(jì)投入少等優(yōu)越性,且不涉及具體的物理實(shí)現(xiàn),可以方便移植到各種FPGA硬件平臺(tái),極大提高了它的靈活性和適應(yīng)性。
1 系統(tǒng)方案與結(jié)構(gòu)
數(shù)據(jù)采集系統(tǒng)性能指標(biāo)修改主要集中在A/D轉(zhuǎn)換模塊與FPGA控制模塊上,在USB2.0接口的硬件、固件、驅(qū)動(dòng)程序的設(shè)計(jì)以及PC機(jī)應(yīng)用軟件的設(shè)計(jì)基本沒有變化。而A/D轉(zhuǎn)換模塊的修改可以通過A/D轉(zhuǎn)換芯片的選擇及更改輸入信號(hào)調(diào)理電路設(shè)計(jì)來實(shí)現(xiàn)。但更換不同的A/D轉(zhuǎn)換芯片可能給A/D轉(zhuǎn)換的啟停控制、數(shù)字信號(hào)的緩存等方面帶來較多的改動(dòng)。而FPGA軟核的模塊化設(shè)計(jì)可以極大地減少這方面的改動(dòng)。
本文以TI公司的低功率高性能A/D轉(zhuǎn)換芯片ADS800為例介紹系統(tǒng)的設(shè)計(jì)。圖1為本數(shù)據(jù)采集系統(tǒng)的結(jié)構(gòu)框圖。模擬信號(hào)經(jīng)過THS4504全差分放大器進(jìn)行信號(hào)差分放大后,輸入到ADS800進(jìn)行A/D轉(zhuǎn)換。為減少不同系統(tǒng)中FPGA軟核改動(dòng)的工作量,F(xiàn)PGA內(nèi)部按功能設(shè)計(jì)了三個(gè)軟核作為系統(tǒng)的控制單元。CY7C68013作為USB控制芯片設(shè)置為從屬FIFO模式(Slave FIFO Mode),負(fù)責(zé)數(shù)字信號(hào)在采集系統(tǒng)與PC機(jī)間的傳輸;用戶通過LabVIEW設(shè)計(jì)的PC機(jī)應(yīng)用軟件,在驅(qū)動(dòng)程序的驅(qū)動(dòng)下與數(shù)據(jù)采集系統(tǒng)進(jìn)行命令以及數(shù)據(jù)的傳輸,以便對(duì)數(shù)據(jù)采集系統(tǒng)采集到的數(shù)據(jù)進(jìn)行實(shí)時(shí)處理。
2 系統(tǒng)硬件設(shè)計(jì)
2.1 模數(shù)轉(zhuǎn)換電路
數(shù)據(jù)采集系統(tǒng)采樣參數(shù)調(diào)整的本質(zhì)在于模數(shù)轉(zhuǎn)換電路的改變,設(shè)計(jì)者只需要更換不同的A/D轉(zhuǎn)換芯片、重新設(shè)計(jì)其硬件電路即可達(dá)到目標(biāo)。本系統(tǒng)中模數(shù)轉(zhuǎn)換電路由信號(hào)調(diào)理電路與高速A/D轉(zhuǎn)換器組成。信號(hào)調(diào)理電路負(fù)責(zé)對(duì)待測(cè)模擬信號(hào)進(jìn)行差分放大,高速A/D轉(zhuǎn)換器負(fù)責(zé)模擬信號(hào)到數(shù)字信號(hào)的轉(zhuǎn)換。
為了能精確檢測(cè)微弱信號(hào),數(shù)據(jù)采集系統(tǒng)的ADC前加入了全差分放大器THS4504,采用ADS800作為A/D轉(zhuǎn)換芯片。ADS800含12 bit流水線型A/D轉(zhuǎn)換內(nèi)核,支持差分輸入,最高轉(zhuǎn)換速率高達(dá)40 MHz[1],極好地滿足了本系統(tǒng)采樣頻率的要求。
2.2 FPGA芯片外圍電路
本系統(tǒng)FPGA采用Xilinx公司的XC3S200AN-4-FT256-C芯片。該芯片擁有20 萬門邏輯單元,內(nèi)含16 個(gè)18 KB的塊存儲(chǔ)器(Block RAM)與30 KB分布存儲(chǔ)器(Distributed RAM),最高工作頻率達(dá)到326 MHz[2],可滿足本系統(tǒng)的時(shí)序需求。
FPEA芯片外圍電路:
(1)FPGA與A/D接口模塊
ADS800的控制信號(hào)由FPGA生成,ADS800的轉(zhuǎn)換時(shí)鐘設(shè)定為30 MHz,由FPGA的時(shí)鐘分頻獲得。FPGA與ADS800的連接示意圖如圖2所示。本設(shè)計(jì)中,F(xiàn)PGA通過ADC_OE來控制ADS800轉(zhuǎn)換數(shù)據(jù)輸出的啟停;ADS800的30 MHz工作時(shí)鐘由FPGA的60 MHz工作時(shí)鐘經(jīng)過二分頻得到;ADS800的數(shù)據(jù)由并口輸出,F(xiàn)PGA內(nèi)部FIFO控制單元將接收到的12 bit數(shù)據(jù)轉(zhuǎn)換成16 bit數(shù)據(jù)存入FPGA內(nèi)的FIFO中。
當(dāng)更換不同的A/D轉(zhuǎn)換芯片時(shí),A/D轉(zhuǎn)換芯片與FPGA的連接有所不同。但對(duì)于并行輸出、流水線型的A/D轉(zhuǎn)換芯片,只需模仿上述連接方式,對(duì)輸出位數(shù)、控制時(shí)序以及FPGA時(shí)鐘分頻大小等做合適的修改即可。
(2)FPGA與USB接口模塊
本設(shè)計(jì)中使用Cypress公司生產(chǎn)的EZ-USB FX2LP系列的CY7C68013芯片作為USB2.0協(xié)議的微控制器芯片。由于該芯片支持480 Mb/s高速傳輸,為本設(shè)計(jì)數(shù)據(jù)傳輸提供了速率保證。FPGA與CY7C68013的連接圖如圖3所示。
FLAGA、FLAGB腳可通過PINFLGSAB、PINFLAGSCD寄存器來選擇其工作在索引模式還是固定模式。本設(shè)計(jì)中被設(shè)置為固定模式。其中FLAGA表示EP2的空狀態(tài)(FIFO_EMPTY),F(xiàn)LAGB表示EP6的滿狀態(tài)(FIFO_FULL)。
2.3 USB接口外圍芯片電路
本設(shè)計(jì)使用容量為16 KB的EEPROM芯片AT24C016A存儲(chǔ),并設(shè)置CY7C68013的VID與PID。在CY7C68013上電并脫離復(fù)位狀態(tài)后,內(nèi)部邏輯會(huì)檢查I2C端口上是否連接有串行EEPROM。如果有,則判斷連接上的EEPROM第一個(gè)字節(jié)是0xC0還是0xC2。本設(shè)計(jì)中設(shè)置EEPROM第一個(gè)字節(jié)為0xC0,設(shè)置VID=0x1234、PID=0x2211、DID=0x0001。在這種情況下,由CY7C68013內(nèi)核提供USB描述符,使用EEPROM存儲(chǔ)的VID/PID/DID值替換CY7C68013內(nèi)部的值,并設(shè)置RENUM=0。這樣,在設(shè)備重新列舉后,芯片內(nèi)的程序代碼會(huì)以全新的自定義設(shè)備來加以呈現(xiàn)。
3 FPGA軟核設(shè)計(jì)
FPGA內(nèi)部控制單元的功能分別由三個(gè)軟核負(fù)責(zé)完成,分別為:ADC接口控制單元、FIFO控制單元以及USB接口控制單元。三個(gè)軟核連接示意圖如圖4所示。
3.1 ADC接口控制單元
ADC接口控制單元控制數(shù)據(jù)采集的啟停和傳輸。數(shù)據(jù)采集開始時(shí),ADC接口控制單元將時(shí)鐘信號(hào)分頻為30 MHz供ADS800作轉(zhuǎn)換時(shí)鐘ADC_CLK使用。此時(shí)控制單元內(nèi)寄存器CLK_CNT對(duì)ADC_CLK轉(zhuǎn)換時(shí)鐘進(jìn)行周期計(jì)數(shù),當(dāng)經(jīng)過7個(gè)時(shí)鐘周期后(ADS800轉(zhuǎn)換延時(shí)為6.5個(gè)時(shí)鐘周期,為了使轉(zhuǎn)換數(shù)據(jù)穩(wěn)定,本設(shè)計(jì)再延時(shí)半個(gè)時(shí)鐘周期輸出)即CLK_CNT=8時(shí),CLK_CNT清零,F(xiàn)IFO寫時(shí)鐘(FIFO_WR_CLK)輸出,同時(shí)端口FIFO_WR_EN置高電平,經(jīng)ADC轉(zhuǎn)換完成的數(shù)據(jù)在補(bǔ)齊16 bit后,隨時(shí)鐘FIFO_WR_CLK上升沿存入FIFO中。ADC接口控制單元狀態(tài)機(jī)工作過程如下:
(1)當(dāng)FPGA上電或者復(fù)位后,狀態(tài)機(jī)進(jìn)入空閑狀態(tài)(IDEL)。
(2)在空閑狀態(tài)下,當(dāng)FIFO不滿(FIFO_FULL=0)且ADC_START=1時(shí),狀態(tài)機(jī)進(jìn)入轉(zhuǎn)換狀態(tài)(CONVERT),此時(shí),ADC_CLK輸出ADC數(shù)據(jù)轉(zhuǎn)換時(shí)鐘。
(3)在轉(zhuǎn)換狀態(tài)下,當(dāng)FIFO_WR_EN=1,即數(shù)據(jù)轉(zhuǎn)換延時(shí)結(jié)束時(shí),狀態(tài)機(jī)進(jìn)入寫狀態(tài)(WRITE),此時(shí)CLK_CNT清零,ADC_OE和FIFO_WR_EN都置為高電平,F(xiàn)IFO_WR_CLK輸出FIFO寫時(shí)鐘。
(4)在任何狀態(tài)下,如果FIFO已經(jīng)寫滿(FIFO_FULL=1)或者ADC_START=0時(shí),自動(dòng)跳轉(zhuǎn)到空閑狀態(tài)。
ADC接口控制單元狀態(tài)機(jī)示意圖如圖5所示。
3.2 FIFO控制單元
本設(shè)計(jì)首先使用FPGA內(nèi)部Block RAM生成FIFO。由于A/D接口控制單元輸出數(shù)據(jù)寬度為16 bit,因此,F(xiàn)IFO寬度也設(shè)置為16 bit,深度設(shè)置為4 KB。FIFO可以使用Xilinx ISE套件中的Core Generator生成器,由Core Generator生成的FIFO軟核配合控制部分構(gòu)成FIFO控制單元。FIFO控制單元內(nèi)部結(jié)構(gòu)示意圖如圖6所示。
由于本設(shè)計(jì)中數(shù)據(jù)采集系統(tǒng)處于異步從屬FIFO模式,且USB接口芯片讀數(shù)據(jù)的速度與ADC數(shù)據(jù)寫入FIFO的速度不同。為解決因讀寫速度不同而可能帶來的數(shù)據(jù)讀寫錯(cuò)誤問題,F(xiàn)IFO軟核上的FULL與EMPTY兩信號(hào)線可以分別指示FIFO滿與空的狀態(tài)。當(dāng)FIFO處于滿狀態(tài)時(shí),F(xiàn)IFO_FULL信號(hào)置高電平,由ADC控制單元通知ADC停止采集數(shù)據(jù);當(dāng)FIFO處于空狀態(tài)時(shí),F(xiàn)IFO_EMPTY信號(hào)置為高電平,由USB接口控制單元通知USB接口芯片停止讀FIFO。FIFO的讀時(shí)鐘信號(hào)(FIFO_RD_CLK)與讀使能信號(hào)(FIFO_RD_EN)由USB接口控制單元提供,寫時(shí)鐘(FIFO_WR_CLK)與寫使能信號(hào)(FIFO_WR_EN)由ADC接口控制單元提供。FIFO控制單元的工作有以下兩種特殊情況:
(1)在沒有來自PC機(jī)的控制命令情況下,如果FIFO_RD_EN=1,則FD[15:0]的數(shù)據(jù)傳輸方向?yàn)閺腇PGA到USB接口芯片(圖6表示為FD_OUT[15:0]),即數(shù)據(jù)從FIFO輸出至USB接口芯片;如果此時(shí)FIFO_RD_EN=0,則FD[15:0]呈高阻態(tài)。
(2)當(dāng)有來自PC機(jī)的控制命令時(shí),F(xiàn)D[15:0]的數(shù)據(jù)傳輸方向?yàn)閺腢SB接口芯片到FPGA(圖6表示為FD_IN[15:0]),即PC機(jī)的控制命令寫入到USB接口芯片,再傳輸?shù)紽PGA內(nèi)部命令分析器中。此時(shí),命令分析器會(huì)根據(jù)命令控制ADC_START信號(hào),進(jìn)而控制ADC數(shù)據(jù)采集的啟停。
無論在上述哪種情況下,如果FIFO_CLEAR=0、 FIFO_WR_EN=1且FIFO_FULL=0時(shí),F(xiàn)IFO_WR_CLK都有相應(yīng)的時(shí)鐘信號(hào)輸入,此時(shí)ADC轉(zhuǎn)換完成的數(shù)據(jù)隨寫時(shí)鐘通過ADC_DATA[11:0]寫入FIFO中。
3.3 USB接口控制單元
USB接口控制單元主要完成兩種功能:(1)通過USB接口芯片實(shí)現(xiàn)把數(shù)據(jù)傳輸?shù)絇C機(jī)。此時(shí)FIFO中的數(shù)據(jù)先寫入EP6,當(dāng)EP6寫滿時(shí),USB接口芯片自動(dòng)將數(shù)據(jù)打包傳輸?shù)絇C機(jī)。(2)協(xié)助FIFO控制單元接收來自PC機(jī)的命令數(shù)據(jù)。此時(shí)命令數(shù)據(jù)從PC機(jī)通過USB接口傳輸?shù)紼P2,然后讀取EP2的數(shù)據(jù)到FIFO控制單元的命令分析器中。USB接口控制單元狀態(tài)機(jī)工作如下:
(1)當(dāng)FPGA上電或者復(fù)位后,狀態(tài)機(jī)進(jìn)入空閑狀態(tài)(IDEL)。
(2)在空閑狀態(tài)下,當(dāng)EP2不空(EP2_EMPTY=0)時(shí),進(jìn)入讀命令狀態(tài)(READ_COMMAND),此時(shí)令EP_ADDR[1:0]=00,F(xiàn)D[15:0]的傳輸方向由EP2指向FPGA,控制單元從EP2中讀出PC機(jī)傳來的控制命令。
(3)隨后進(jìn)入存儲(chǔ)命令狀態(tài)(SOTRE_COMMAND),控制單元把傳來的控制命令存儲(chǔ)到FIFO控制單元內(nèi)部的指令分析器中。同時(shí)控制單元置FIFO_CLEAR=1,即把FIFO控制單元內(nèi)的FIFO數(shù)據(jù)清空,以準(zhǔn)備存儲(chǔ)新的ADC轉(zhuǎn)換數(shù)據(jù)。任務(wù)完成后回到空閑狀態(tài)。
(4)優(yōu)先處理PC機(jī)通過EP2傳來的命令,因此優(yōu)先查看EP2的空狀態(tài)。在空閑狀態(tài)下,當(dāng)EP2為空(EP2_EMPTY=1)且FIFO控制單元內(nèi)FIFO不為空(FIFO_EMPTY=0)且EP6不滿(EP6_FULL=0)時(shí),進(jìn)入寫數(shù)據(jù)狀態(tài)(WRITE_DATA)。在寫數(shù)據(jù)狀態(tài)下,EP_ADDR[1:0]=10,控制單元選中CY7C68013的EP6,F(xiàn)D[15:0]方向由FPGA指向EP6,同時(shí)FIFO_RD_CLK產(chǎn)生一個(gè)周期時(shí)鐘,F(xiàn)IFO_RD_EN置為高電平,一個(gè)數(shù)據(jù)從FIFO控制單元內(nèi)FIFO中讀出。
(5)隨后進(jìn)入傳輸數(shù)據(jù)狀態(tài)(TRANS_DATA)。在該狀態(tài)下,令SLWR=0,數(shù)據(jù)從FIFO控制單元內(nèi)FIFO寫入CY7C68013的EP6中。任務(wù)完成后進(jìn)入空閑狀態(tài)。
USB接口控制單元狀態(tài)機(jī)示意圖如圖7所示。
4 USB接口芯片程序設(shè)計(jì)
4.1 USB固件程序
固件程序是一種嵌入在硬件設(shè)備中的軟件,通過執(zhí)行固件程序,硬件設(shè)備可以完成各種特定的功能。在本設(shè)計(jì)中,CY7C68013芯片的固件程序是整個(gè)系統(tǒng)傳輸?shù)目刂坪诵?,主要完成以下五種功能:(1)CY7C68013芯片的初始化;(2)輔助硬件完成設(shè)備的重新枚舉;(3)中斷處理;(4)數(shù)據(jù)接收與發(fā)送;(5)對(duì)外圍電路進(jìn)行控制。
Cypress公司為提高用戶的開發(fā)效率,提供了EZ-USB FX2LP開發(fā)套件,其中包含了一個(gè)完整的固件程序架構(gòu)[3]。該架構(gòu)主要包含了EZ-USB FX2LP芯片的設(shè)備初始化、處理標(biāo)準(zhǔn)USB設(shè)備請(qǐng)求與電源管理等服務(wù)功能。用戶在開發(fā)時(shí),只需使用Keil uVision3在固件架構(gòu)下提供相應(yīng)的USB描述符以及編寫外部設(shè)備功能程序代碼。固件架構(gòu)流程圖如圖8所示。
主函數(shù)是固件架構(gòu)流程的具體實(shí)現(xiàn)。主函數(shù)首先對(duì)內(nèi)部狀態(tài)變量進(jìn)行初始化,隨即調(diào)用TD_Init()進(jìn)行用戶設(shè)備初始化,TD_Init()函數(shù)運(yùn)行完成后,使能中斷,隨后進(jìn)入主循環(huán)。
4.2 USB驅(qū)動(dòng)程序設(shè)計(jì)
USB驅(qū)動(dòng)程序位于固件程序與應(yīng)用程序之間,是USB設(shè)備與PC機(jī)的通信接口。Cypress公司為用戶設(shè)計(jì)了一款通用驅(qū)動(dòng)程序包(ezusb.sys),可以完成應(yīng)用程序與USB接口的通信與控制任務(wù)。本設(shè)計(jì)即使用該通用驅(qū)動(dòng)程序。
5 應(yīng)用程序設(shè)計(jì)
應(yīng)用程序通過USB驅(qū)動(dòng)程序與USB接口進(jìn)行通信。本設(shè)計(jì)使用LabVIEW設(shè)計(jì)應(yīng)用程序。LabVIEW為用戶提供了簡(jiǎn)單、直觀、易學(xué)的圖形編程法,相比于傳統(tǒng)的編程語言,LabVIEW能大量地節(jié)省開發(fā)時(shí)間。用戶通過LabVIEW應(yīng)用程序可以進(jìn)行對(duì)數(shù)據(jù)采集系統(tǒng)的控制,而且采集到的數(shù)據(jù)在控制界面中實(shí)時(shí)顯示。
本文介紹了一款較為通用、基于USB2.0接口的高速數(shù)據(jù)采集系統(tǒng)設(shè)計(jì)方法,通過FPGA軟核在數(shù)據(jù)采集系統(tǒng)中的應(yīng)用,解決了硬件電路設(shè)計(jì)繁瑣復(fù)雜的問題,而且便于開發(fā)者對(duì)產(chǎn)品進(jìn)行修改優(yōu)化,可以大幅度地縮短產(chǎn)品的開發(fā)時(shí)間。本系統(tǒng)通過了硬軟件的聯(lián)合調(diào)試,系統(tǒng)工作正常,穩(wěn)定性良好。
參考文獻(xiàn)
[1] Xilinx Corporation. Spartan-3AN FPGA family data sheet. 2009.
[2] Cypress Semiconductor Corporation. EZ-USB FX2 CY7C68013 technical reference manual version2.2. 2003.
[3] 錢峰.EZ-USB FX2單片機(jī)原理、編程及應(yīng)用[M].北京:北京航空航天大學(xué)出版社,2006.