趙計(jì)賀,李 杰,張德彪,李金強(qiáng)
(1.中北大學(xué) 儀器科學(xué)與動(dòng)態(tài)測(cè)試教育部重點(diǎn)實(shí)驗(yàn)室,山西 太原 030051;2.山東航天電子技術(shù)研究所,山東 煙臺(tái) 264000)
導(dǎo)彈具有遠(yuǎn)距離、精準(zhǔn)打擊的作戰(zhàn)能力,在現(xiàn)代化國(guó)防建設(shè)中的地位日益提升.在導(dǎo)彈研制成功后需要進(jìn)行外場(chǎng)飛行測(cè)試試驗(yàn)評(píng)估其真實(shí)性能.為了獲取彈體飛行狀態(tài),消除可能存在的隱患及進(jìn)行故障診斷,試驗(yàn)中采用基于存儲(chǔ)測(cè)試技術(shù)的多通道高速數(shù)據(jù)記錄儀提供有力的數(shù)據(jù)支撐[1-2].為了可以及時(shí)處理和分析試驗(yàn)中存儲(chǔ)的大量數(shù)據(jù),需要高速回讀系統(tǒng)將數(shù)據(jù)從存儲(chǔ)器傳輸至上位機(jī)[3].
現(xiàn)場(chǎng)可編程門(mén)陣列(FPGA)在靈活性、并行性方面有著其它芯片所不具備的優(yōu)勢(shì),被廣泛地應(yīng)用在數(shù)據(jù)采集存儲(chǔ)、網(wǎng)絡(luò)傳輸?shù)确矫鎇4-5].FPGA可以與存儲(chǔ)器高速傳輸,但FPGA實(shí)現(xiàn)USB協(xié)議極其困難,不能直接與上位機(jī)進(jìn)行通信[6].
由于USB 3.0物理接口比USB 2.0多出兩組超高速傳輸差分對(duì),USB 3.0的最大傳輸速度理論值可達(dá)500 MB/s,是USB 2.0最大傳輸速度60 MB/s 的8倍[7-8].CYUSB3014是CYPRESS(賽普拉斯)公司推出的一款USB 3.0控制器,提供了集成且靈活的功能.FPGA通過(guò)CYUSB3014內(nèi)部提供的第二代通用可編程接口(GPIF II)以讀寫(xiě)先進(jìn)先出(FIFO)的方式進(jìn)行雙向通信.
本系統(tǒng)采用CYUSB3014在FPGA和上位機(jī)之間傳輸數(shù)據(jù)后,傳輸速度大幅度提高.FPGA向上位機(jī)發(fā)送數(shù)據(jù)的速度達(dá)到346.23 MB/s,上位機(jī)以116.56 MB/s的速度將數(shù)據(jù)寫(xiě)進(jìn)硬盤(pán).與USB 2.0相比,傳輸速度提升了286.23 MB/s.
整體設(shè)計(jì)框圖如圖1 所示.使用C#語(yǔ)言編寫(xiě)上位機(jī)界面,通過(guò)托管Microsoft.NET類庫(kù)CyUSB.dll所提供的方法和屬性調(diào)用底層驅(qū)動(dòng)CyUSB.sys訪問(wèn)CYUSB3014.
圖1 整體設(shè)計(jì)框圖
USB3014內(nèi)部使用自動(dòng)直接內(nèi)存訪問(wèn)(DMA)通道,USB模塊與GPIF II模塊的數(shù)據(jù)流通過(guò)DMA緩沖區(qū)相連,USB套接字與GPIF套接字之間互發(fā)信號(hào)通知DMA緩沖區(qū)空滿.根據(jù)CYUSB3014提供的GPIF II時(shí)序要求,使用Verilog HDL編寫(xiě)FPGA程序讀寫(xiě)數(shù)據(jù)流.
電源去耦的重要作用是能夠保證在供電過(guò)程中,盡量減少系統(tǒng)噪聲對(duì)數(shù)據(jù)傳輸造成的影響[9].濾波電容為系統(tǒng)噪聲提供一條低阻抗回路,在噪聲頻點(diǎn)上,濾波效果與濾波電容阻抗大小成反比.
電容器件除了電容分量還摻雜其它分量,它可以等效為電容與并聯(lián)泄漏電阻(Rleak)并聯(lián),再與等效串聯(lián)電阻(ESR)、等效串聯(lián)電感(ESL)串聯(lián).其中ESL主要取決于類型和封裝,ESR主要取決于電容工作溫度、頻率及本身的導(dǎo)線電阻,Rleak主要由電容本身特有的泄漏特性決定.電容、ESR、ESL分量和泄漏特性共同決定了電容特性.
電容阻抗的計(jì)算公式為
(1)
式中:Z為阻抗;R為ESR阻值;f為頻率;L為ESL感值;C為容值.根據(jù)式(1)可知,電容整體阻抗表現(xiàn)為:達(dá)到諧振點(diǎn)時(shí),電容分量與ESL分量抵消,阻抗最小,濾波效果最佳;在諧振點(diǎn)前,電容分量起主要作用,隨頻率的增加,濾波效果增強(qiáng);在諧振點(diǎn)后,ESL分量起主要作用,隨頻率增加,濾波效果減弱.對(duì)于村田4 700 nF、0603封裝的電容,ESL為0.287 7 nH,ESR為0.073 53 Ω,其阻抗大小如圖2 所示.
圖2 濾波電容阻抗
設(shè)計(jì)中,系統(tǒng)噪聲等干擾占據(jù)了一段頻帶,而不是單一的頻率點(diǎn).在實(shí)際工作中,把每一處的噪聲頻帶找出來(lái)費(fèi)時(shí)費(fèi)力,系統(tǒng)電路設(shè)計(jì)過(guò)程中,主要關(guān)注的噪聲頻帶為0 MHz~100 MHz.使用兩個(gè)不同的電容構(gòu)造在頻率為100 MHz內(nèi)的低阻抗回路中.
時(shí)鐘電路對(duì)數(shù)據(jù)傳輸質(zhì)量起著至關(guān)重要的作用[10].RC振蕩電路的頻率穩(wěn)定度可達(dá)到10-3,LC振蕩電路的頻率穩(wěn)定度可達(dá)到10-4,而石英晶體的品質(zhì)因數(shù)遠(yuǎn)高于RC、LC振蕩電路,頻率穩(wěn)定度至少可達(dá)到10-9.本設(shè)計(jì)選用19.2 MHz的石英晶體振蕩器為CYUSB3014提供時(shí)鐘.
晶振提供正確的時(shí)鐘源,負(fù)載電容起著重要的作用,必須慎重選擇.晶振負(fù)載電容為
(2)
式中:CL為晶振負(fù)載電容,根據(jù)晶體器件資料,該晶體要求CL=9 pF;C1,C2為外部電容,一端連晶振引腳,另一端接地;CS為電路板晶振兩引腳走線間的寄生電容,一般在2 pF~5 pF之間,本文CS=3 pF.取C1=C2,根據(jù)式(2)計(jì)算得,C1=C2=12 pF.
晶振的另一個(gè)重要參數(shù)是功耗.使用的晶振驅(qū)動(dòng)電平與功耗相比過(guò)小,會(huì)加速該晶振老化.晶振功耗的計(jì)算公式為
P=2[πf(C0+CL)Vx]2R,
(3)
式中:f為晶振頻率;C0為晶振中并聯(lián)電容;CL為晶振負(fù)載電容;Vx為晶振OUT引腳的最大電壓;R為晶振等效串聯(lián)電阻.針對(duì)NDK公司的NX3225SA型晶振,根據(jù)提供的資料可知,功耗為10 μW,R為80 Ω,C0為1.26 pF,Vx為1.32 V,通過(guò)式(3)計(jì)算得驅(qū)動(dòng)電平為107 μW,符合設(shè)計(jì)要求.
CYUSB3014擁有高性能且獨(dú)立于ARM9可提供256種可編程狀態(tài)狀態(tài)機(jī)的GPIF II.GPIF II最高支持100 MHz頻率,且支持8位、16位、24位和32位并行數(shù)據(jù)總線.將GPIF II作為同步從設(shè)備FIFO與FPGA連接.
圖3 為同步從設(shè)備接口框圖.SLCS#為芯片選擇信號(hào),低電平有效;PKTEND#為寫(xiě)入數(shù)據(jù)包信號(hào),低電平有效;FLAGA、FLAGB、FLAGC、FLAGD標(biāo)志套接字狀態(tài);A[1:0]為從設(shè)備的地址總線,與GPIF II的4個(gè)線程相對(duì)應(yīng);DQ[31:0]為32位雙向數(shù)據(jù)總線;SLWR#為寫(xiě)入信號(hào),低電平有效;SLRD#為讀取信號(hào),低電平有效;SLOE#為輸出使能信號(hào),低電平時(shí),才能對(duì)從設(shè)備FIFO進(jìn)行讀取操作;PCLK為同步時(shí)鐘輸入信號(hào).
圖3 同步從設(shè)備FIFO接口框圖
系統(tǒng)設(shè)計(jì)選用自動(dòng)DMA通道,在GPIF線程、套接字和由DMA描述符控制的DMA緩沖區(qū)之間傳輸數(shù)據(jù).GPIF II 狀態(tài)機(jī)必須根據(jù)內(nèi)部控制信號(hào)或外部輸入選擇一個(gè)有效的 GPIF 線程用于數(shù)據(jù)傳輸.套接字的功能是連接外設(shè)硬件模塊與RAM.DMA描述符用于記錄DMA緩沖區(qū)的地址和大小,并指向下一個(gè)DMA描述符的指針.DMA緩沖區(qū)用于暫時(shí)存儲(chǔ)發(fā)送套接字和接收套接字之間的數(shù)據(jù).
如圖4 所示,套接字根據(jù)DMA描述符列表傳輸數(shù)據(jù).套接字加載DMA描述符1,獲取緩沖區(qū)的地址(A1)、大小(L)和下個(gè)描述符的地址.傳輸L個(gè)字節(jié)后,加載DMA描述符2獲取信息,傳輸L個(gè)字節(jié),加載DMA描述符3獲取信息,傳輸L個(gè)字節(jié),加載DMA描述符1,如此反復(fù)循環(huán).
圖4 套接字傳輸數(shù)據(jù)示意圖
由于RAM提供的緩沖空間不足以支持同時(shí)具有8個(gè)緩沖區(qū)大小為16×1 024的兩個(gè)通道,且FPGA向上位機(jī)發(fā)送數(shù)據(jù)量大,上位機(jī)只需向FPGA發(fā)送少量命令,所以,將上傳通道使用8個(gè)緩沖區(qū),下傳通道使用4個(gè)緩沖區(qū),以增強(qiáng)系統(tǒng)高吞吐量性能.
圖5 為從設(shè)備FIFO寫(xiě)時(shí)序圖.固件配置FLAGA為An對(duì)應(yīng)線程專用標(biāo)志,配置的發(fā)送套接字編號(hào)必須與An對(duì)應(yīng).在寫(xiě)入數(shù)據(jù)之前,應(yīng)保證FIFO地址穩(wěn)定及SLCS#激活.在SLWR#有效后的PCLK上升沿來(lái)時(shí),數(shù)據(jù)總線DQ上的值被寫(xiě)入FIFO并更新FIFO指針.寫(xiě)傳輸結(jié)束時(shí),F(xiàn)LAGA始終會(huì)延遲3個(gè)周期更新,在最后一次激活SLWR#后的第4個(gè)PCLK上升沿來(lái)臨時(shí),若FLAGA處于低電平表示緩沖區(qū)已滿.
圖5 從設(shè)備FIFO寫(xiě)時(shí)序
圖6 為從設(shè)備FIFO讀時(shí)序圖.
圖6 從設(shè)備FIFO讀時(shí)序
固件配置FLAGB為Am對(duì)應(yīng)線程專用標(biāo)志,配置的接收套接字編號(hào)必須與Am對(duì)應(yīng).讀取數(shù)據(jù)時(shí),應(yīng)保證FIFO地址穩(wěn)定且SLCS#、SLOE#激活.在FIFO輸入地址后的第3個(gè)PCLK上升沿及激活SLRD#后的第2個(gè)PCLK上升沿,才可以讀取數(shù)據(jù)總線DQ上的值,即激活SLRD#必須至少比輸入地址時(shí)刻遲1個(gè)時(shí)鐘周期.讀傳輸結(jié)束時(shí),F(xiàn)LAGB始終延遲2個(gè)周期更新,在最后一次激活SLRD#后的第3個(gè)PCLK上升沿來(lái)臨時(shí),若FLAGB處于低電平表示緩沖區(qū)已空.
局部標(biāo)志有效解決了線程標(biāo)志更新有延遲會(huì)導(dǎo)致緩沖區(qū)溢出或讀空還在讀的問(wèn)題.對(duì)于從設(shè)備FIFO讀寫(xiě)時(shí),通過(guò)固件配置水印值的公式為
(4)
(5)
式中:wrnum為時(shí)鐘上升沿對(duì)局部標(biāo)志采樣為低電平后將要寫(xiě)入的數(shù)據(jù)量;rdnum為時(shí)鐘上升沿對(duì)局部標(biāo)志采樣為低電平后將要讀取的數(shù)據(jù)量;watermark為固件配置的水印值,32位寬;buswidth為使用的數(shù)據(jù)總線位寬.
對(duì)于從設(shè)備FIFO寫(xiě)入數(shù)據(jù)且32位數(shù)據(jù)總線,設(shè)置水印值為6,當(dāng)局部標(biāo)志變?yōu)榈碗娖綍r(shí),表示FIFO繼續(xù)寫(xiě)入6個(gè)數(shù)據(jù)就會(huì)滿,而局部標(biāo)志始終延遲3個(gè)時(shí)鐘,應(yīng)在第4個(gè)上升沿采樣,所以當(dāng)前FIFO實(shí)際上再寫(xiě)入2個(gè)數(shù)據(jù)就會(huì)滿.對(duì)于從設(shè)備FIFO讀取數(shù)據(jù)且32位數(shù)據(jù)總線,設(shè)置水印值為5,局部標(biāo)志變?yōu)榈碗娖綍r(shí),再讀取5個(gè)數(shù)據(jù)就會(huì)空,而局部始終延遲2個(gè)時(shí)鐘,應(yīng)該在第3個(gè)上升沿采樣,而讀取數(shù)據(jù)延遲命令2個(gè)時(shí)鐘,即讀取4個(gè)數(shù)據(jù)FIFO就會(huì)空.
圖7 為系統(tǒng)狀態(tài)機(jī).配置FLAGA為線程0的專用滿標(biāo)志,F(xiàn)LAGB為線程0水印值6的局部滿標(biāo)志,F(xiàn)LAGC為線程3的專用空標(biāo)志,F(xiàn)LAGD為線程3水印值6的局部空標(biāo)志.FPGA上電后處于空閑狀態(tài),設(shè)置地址A[1:0]=3,在FLAGC與FLAGD都為高電平后,激活SLWR#及SLOE#讀取數(shù)據(jù),等待 FLAGD為低電平,根據(jù)式(4)將FIFO中的數(shù)據(jù)讀空.
圖7 系統(tǒng)狀態(tài)機(jī)
收到的數(shù)據(jù)是讀取數(shù)據(jù)命令后,設(shè)置地址A[1:0]=0后根據(jù)FLAGA、FLAGB標(biāo)志判斷FIFO滿,若滿就要等待,非滿就發(fā)送32位遞增數(shù),計(jì)數(shù)到232-1時(shí)停止發(fā)送并返回空閑狀態(tài).發(fā)送過(guò)程中,采樣FLAGB為低電平時(shí),根據(jù)式(5)寫(xiě)滿FIFO,等待FIFO處于非滿狀態(tài)時(shí),繼續(xù)寫(xiě)入數(shù)據(jù).
在Visual Studio編譯環(huán)境使用C#語(yǔ)言編寫(xiě)上位機(jī).在程序中引用賽普拉斯為USB設(shè)備提供高級(jí)編程接口的托管Microsoft.NET類庫(kù)CYUSB.dll與CYUSB3014通信.在調(diào)用USBDeviceList類返回使用cyusb3.sys的設(shè)備列表中查找VID=0x04B4,PID=0x00F1的設(shè)備后復(fù)位,在上位機(jī)界面顯示查找設(shè)備及復(fù)位設(shè)備的結(jié)果.
調(diào)用XferData方法接收或發(fā)送數(shù)據(jù),可實(shí)現(xiàn)同步阻塞數(shù)據(jù)流,數(shù)據(jù)傳輸完成或超時(shí)前不會(huì)返回值.使用大量輸入端點(diǎn)XferData方法每次從緩沖區(qū)讀取1 MB數(shù)據(jù),以二進(jìn)制文件形式進(jìn)行存儲(chǔ),直至緩沖區(qū)無(wú)數(shù)據(jù).C#是面向?qū)ο蟮奶峁┝藦?qiáng)大功能的高級(jí)程序設(shè)計(jì)語(yǔ)言,但由于中間語(yǔ)言和編譯過(guò)程沒(méi)有C語(yǔ)言效率高,為能夠高速將數(shù)據(jù)存儲(chǔ)在硬盤(pán),引用C語(yǔ)言中的fwrite函數(shù)寫(xiě)文件.
利用上位機(jī)讀取大小為1 000 M的二進(jìn)制文件,通過(guò)CYUSB3014發(fā)給FPGA,F(xiàn)PGA將收到的數(shù)據(jù)返回至上位機(jī),上位機(jī)把收到的數(shù)據(jù)寫(xiě)入文件.上位機(jī)逐字節(jié)讀取原始文件和新寫(xiě)文件,對(duì)文件大小和內(nèi)容進(jìn)行比較,未發(fā)現(xiàn)大小和內(nèi)容不同,即傳輸過(guò)程中無(wú)錯(cuò)幀、丟幀現(xiàn)象發(fā)生.
FPGA與CYUSB3014的接口頻率為100 MHz、數(shù)據(jù)總線為32位.FPGA向上位機(jī)發(fā)送228個(gè)遞增數(shù),每個(gè)遞增數(shù)占4個(gè)字節(jié),上位機(jī)顯示開(kāi)始傳輸和傳輸結(jié)束的時(shí)間.經(jīng)計(jì)算,CYUSB3014傳輸速度達(dá)到346.23 MB/s.
上位機(jī)發(fā)出讀取數(shù)據(jù)命令后,等待接收FPGA發(fā)送的數(shù)據(jù)且將數(shù)據(jù)以二進(jìn)制文件的形式存儲(chǔ)在固態(tài)硬盤(pán)中.上位機(jī)顯示數(shù)據(jù)傳輸?shù)拈_(kāi)始、結(jié)束時(shí)間和已經(jīng)寫(xiě)入文件的數(shù)據(jù)量,經(jīng)測(cè)試,上位機(jī)接收數(shù)據(jù)并以二進(jìn)制文件形式寫(xiě)入固態(tài)硬盤(pán)的速度為116.56 MB/s,如圖8 所示.
圖8 上位機(jī)界面
系統(tǒng)利用CYUSB3014自身接口在FPGA與上位機(jī)之間進(jìn)行雙向高速傳輸數(shù)據(jù),彌補(bǔ)了FPGA與上位機(jī)不能直接通信的缺點(diǎn),有一定的工程價(jià)值.通過(guò)C#編寫(xiě)的上位機(jī)引用C語(yǔ)言寫(xiě)文件函數(shù),將接收的數(shù)據(jù)以116.56 MB/s的速度以二進(jìn)制文件形式存儲(chǔ)固態(tài)硬盤(pán),便于對(duì)數(shù)據(jù)進(jìn)行處理.