基于FPGA軟核的高速數(shù)據(jù)采集系統(tǒng)設(shè)計(jì)
(1)在沒有來自PC機(jī)的控制命令情況下,如果FIFO_RD_EN=1,則FD[15:0]的數(shù)據(jù)傳輸方向?yàn)閺?a class="contentlabel" href="http://m.butianyuan.cn/news/listbylabel/label/FPGA">FPGA到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ù)?a class="contentlabel" href="http://m.butianyuan.cn/news/listbylabel/label/FPGA">FPGA內(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ù)目刂坪诵模饕瓿梢韵挛宸N功能:(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.
評(píng)論