實(shí)驗(yàn)119:下位機(jī)FPGA TCP Client客戶端 +24位ADC(模擬DSA動(dòng)態(tài)信號(hào)采集卡)

實(shí)驗(yàn)119:下位機(jī)FPGA TCP Client客戶端
+24位ADC(模擬DSA動(dòng)態(tài)信號(hào)采集卡)
???? 1、實(shí)驗(yàn)內(nèi)容
?????? ?現(xiàn)在很多電腦PC、工控機(jī)或者其他嵌入式設(shè)備都集成了千兆網(wǎng)卡,可以直接接入一根CAT5+或者CAT6類網(wǎng)線即可實(shí)現(xiàn)TCP網(wǎng)絡(luò)互聯(lián);以太網(wǎng)通信的優(yōu)點(diǎn)是傳輸距離遠(yuǎn)(網(wǎng)線內(nèi)部走的是恒流源驅(qū)動(dòng)),支持熱插拔(支持?jǐn)帱c(diǎn)續(xù)傳),傳輸速度快(理論帶寬125MB/s)。對(duì)于高速采集、分布式測(cè)試測(cè)量和邊緣計(jì)算等領(lǐng)域,TCP網(wǎng)絡(luò)通信是必不可少的,因?yàn)閁DP無(wú)法替代TCP來(lái)完成這些應(yīng)用。
?????? ?因此,很多用戶都希望自己的FPGA芯片能夠?qū)崿F(xiàn)TCP協(xié)議棧,這樣就可以開(kāi)發(fā)出來(lái)很多支持TCP網(wǎng)絡(luò)通信的工業(yè)以太網(wǎng)設(shè)備、Gige相機(jī)和邊緣計(jì)算等分布式采集終端了。也為后續(xù)基于TCP的Modbus和MQTT等網(wǎng)絡(luò)應(yīng)用層協(xié)議打下堅(jiān)實(shí)的基礎(chǔ)。
?
?????? ?本節(jié)實(shí)驗(yàn)我們準(zhǔn)備采用IEPE/ICP/DSA動(dòng)態(tài)信號(hào)采集模塊(ADS127L01),上面有1顆24位高速高精度ADC芯片,結(jié)合TCP協(xié)議棧實(shí)現(xiàn)1路采樣率(最大512KS/s)可調(diào)節(jié)的TCP千兆以太網(wǎng)DSA動(dòng)態(tài)信號(hào)采集卡,直接一根網(wǎng)線連到PC或者工控機(jī)或者工業(yè)樹(shù)莓派上即可完成高可靠性、長(zhǎng)距離數(shù)據(jù)傳輸和命令交互。該DSA例程可以直接用于采集聲音、振動(dòng)、加速度等IEPE傳感器。
?????? ?下面我們先來(lái)回顧一下TCP千兆以太網(wǎng)口和ADS127L01硬件模塊等相關(guān)內(nèi)容。
?????? ?黑金設(shè)計(jì)的ARTIX7-100T FPGA開(kāi)發(fā)板(AX7103)上集成了兩路千兆以太網(wǎng)PHY芯片KSZ9031,如圖119-1所示,當(dāng)然如果用戶自己做板子的話,也可以將昂貴的KSZ9031換成臺(tái)灣瑞昱的RTL8211F或者國(guó)產(chǎn)廉價(jià)的YT8511C這類完全兼容的PHY芯片。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ? ?用戶可以直接將這個(gè)開(kāi)發(fā)板通過(guò)一根CAT5+或者CAT6類網(wǎng)線接到工控機(jī)或者電腦的網(wǎng)口里面;當(dāng)然,如果超薄筆記本電腦,沒(méi)有千兆網(wǎng)口的話,也可以在網(wǎng)上買(mǎi)一個(gè)雷電轉(zhuǎn)千兆網(wǎng)口的擴(kuò)展塢,方便后續(xù)做實(shí)驗(yàn)。
?????? ?由于我們已經(jīng)把復(fù)雜的TCP Client通信協(xié)議封裝進(jìn)了LabVIEW FPGA下的Socket CLIP,用戶只需要根據(jù)四線握手協(xié)議來(lái)調(diào)用對(duì)應(yīng)的CLIP端口就可以了。這部分我們?cè)谇懊娴?0章已經(jīng)介紹過(guò)了。
?????? ?本節(jié)FPGA TCP Client通信實(shí)驗(yàn)重點(diǎn)向大家講解以下7個(gè)方面的內(nèi)容:
1)????? 下位機(jī)(FPGA)TCP Client客戶端通信程序開(kāi)發(fā)。
2)????? 上位機(jī)(PC)服務(wù)器端通信應(yīng)用程序開(kāi)發(fā)。
3)????? 下位機(jī)FPGA內(nèi)部多線程之間的數(shù)據(jù)交互與數(shù)據(jù)緩沖:FIFO。
4)????? 下位機(jī)FPGA內(nèi)部不同速率之間的匹配機(jī)制:四線握手。
5)????? 下位機(jī)FPGA TCP Client通信IP核全雙工通信的讀寫(xiě)機(jī)制。
6)????? TCP Client通信數(shù)據(jù)格式和類型轉(zhuǎn)換(大小端與字節(jié)數(shù)組)(下行和上行都是大端)。
7)????? 24位單通道ADC芯片(ADS127L01)的數(shù)據(jù)讀取方法(參考本書(shū)前面的“實(shí)驗(yàn)53-高精度24位512K-DSA信號(hào)采集實(shí)驗(yàn)-ADS127L01”)
?????? ?關(guān)于TCP Client下位機(jī)(FPGA)通信應(yīng)用程序開(kāi)發(fā),指的是FPGA芯片中的代碼編寫(xiě)。譬如,本節(jié)實(shí)驗(yàn)我們準(zhǔn)備開(kāi)發(fā)一個(gè)基于TCP網(wǎng)絡(luò)傳輸?shù)母呔葎?dòng)態(tài)信號(hào)采集卡(DSA),將24位ADC采集到的數(shù)據(jù)通過(guò)TCP Client實(shí)時(shí)發(fā)送到PC上,這段代碼我們可以利用圖形化的LabVIEW編程語(yǔ)言來(lái)開(kāi)發(fā),替代傳統(tǒng)的VHDL/Verilog語(yǔ)言,這里我們稱之為下位機(jī)LabVIEW FPGA編程。本節(jié)實(shí)驗(yàn)下位機(jī)FPGA程序里面的用戶線程,我們會(huì)利用ADS127L01芯片(24位)采集外部真實(shí)的Sine正弦交流信號(hào),然后發(fā)送到上位機(jī)進(jìn)行顯示或者流盤(pán)。
?????? ?關(guān)于上位機(jī)(PC)服務(wù)器端的應(yīng)用程序開(kāi)發(fā),指的是運(yùn)行在windows或者linux系統(tǒng)中的LabVIEW上位機(jī)程序,可以通過(guò)調(diào)用LabVIEW軟件自身就有的TCP函數(shù)選板里面的VI函數(shù)與下位機(jī)FPGA進(jìn)行TCP網(wǎng)絡(luò)數(shù)據(jù)交互。我們把上位機(jī)收發(fā)線程分成兩個(gè)獨(dú)立的while循環(huán)來(lái)處理,這樣調(diào)試起來(lái)簡(jiǎn)單一些。當(dāng)然,如果有些用戶不會(huì)LabVIEW,也可以使用C\C++\C#\Python來(lái)調(diào)用網(wǎng)卡DLL動(dòng)態(tài)庫(kù)進(jìn)行上位機(jī)程序開(kāi)發(fā)。
?????? ?關(guān)于FIFO的概念和操作,可以參考前面的“實(shí)驗(yàn)4-串口通信”,里面有詳細(xì)的介紹和演示過(guò)程。
?????? ?關(guān)于四線握手制的工作過(guò)程和原理,也可以參考前面的“實(shí)驗(yàn)4-串口通信”,這里不再贅述。
?????? ?關(guān)于TCP Client通信IP核全雙工通信機(jī)制,我們會(huì)通過(guò)兩個(gè)獨(dú)立的收發(fā)線程來(lái)演示。發(fā)送和接收可以同時(shí)并行執(zhí)行,而且是上行和下行同時(shí)全雙工工作。
?????? ?最后一個(gè)需要注意的問(wèn)題是,下位機(jī)FPGA 跟上位機(jī)之間的TCP通信數(shù)據(jù)格式和數(shù)據(jù)類型,需要匹配上才能正確解析,好在我們封裝的下位機(jī)TCP Client協(xié)議棧和上位機(jī)LabVIEW里面默認(rèn)是大端格式的U8字節(jié)數(shù)組;另外,模擬或者采集的ADC波形,對(duì)應(yīng)的數(shù)據(jù)類型跟TCP內(nèi)部的字節(jié)數(shù)組之間需要通過(guò)“強(qiáng)制類型轉(zhuǎn)換”函數(shù)轉(zhuǎn)換一下才能看到準(zhǔn)確的波形曲線。
?????? ?下面帶著大家一起,利用LabVIEW編寫(xiě)符合標(biāo)準(zhǔn)四線握手制的TCP Client下位機(jī)FPGA客戶端程序,來(lái)實(shí)現(xiàn)一個(gè)基于FPGA的TCP千兆以太網(wǎng) 24位單通道數(shù)據(jù)采集卡(最大采樣率512KS/s,ADS127L01芯片本身的采集電壓范圍±2.5V(取決于參考電壓),但是模塊上有縮小和增益電路,后面會(huì)講解),采集外部真實(shí)的Sine正弦信號(hào),通過(guò)TCP網(wǎng)絡(luò)發(fā)送給上位機(jī)PC服務(wù)器,同時(shí)還能接收上位機(jī)服務(wù)器端下發(fā)的指令和參數(shù)對(duì)FPGA板卡進(jìn)行采樣率和使能采集等控制。
?
?????? ?2、硬件資源
?????? ?2.1、先回顧一下FPGA千兆以太網(wǎng)接口方面的硬件知識(shí)
?????? ?打開(kāi)本書(shū)配套的光盤(pán)/云盤(pán)里面1號(hào)文件夾里面的AX7103底板原理圖,然后找到PHY網(wǎng)絡(luò)接口這部分原理圖,如圖119-2所示。這些引腳其實(shí)可以分成4類:PHY芯片復(fù)位引腳、PHY芯片寄存器參數(shù)配置的IIC引腳(mdc和mdio)、PHY芯片收發(fā)125MHz時(shí)鐘引腳;PHY芯片收發(fā)數(shù)據(jù)引腳(GMII:8bit;RGMII:4bit)。
?????? ?這4類引腳在前面第10章里面的圖10-37定義過(guò)了,如果用戶自己畫(huà)的板子或者網(wǎng)上買(mǎi)的其他家的板子上的網(wǎng)口PHY芯片引腳定義不一樣,那么照葫蘆畫(huà)瓢對(duì)應(yīng)修改一下這個(gè)FPGA終端下的xdc約束文件里面的PHY芯片引腳就可以了。

? ? ? ? 然后,打開(kāi)AX7103開(kāi)發(fā)板上插著的核心板AC7100原理圖,如圖119-3所示,可以看到黑金AX7103開(kāi)發(fā)板上第1路和第2路KSZ9031 PHY芯片都掛在了FPGA BANK16上面。

?
?????? ?2.2、再回顧一下24位單通道高精度ADC芯片ADS127L01相關(guān)的硬件內(nèi)容
?????? ?本節(jié)實(shí)驗(yàn)需要用到的ADC采集模塊是ADS127L01高精度24位高速AD模塊,這款模塊上面集成了一片ADS127L01芯片,并且預(yù)留了1個(gè)BNC焊接口,因?yàn)檫@個(gè)模塊不是黑金開(kāi)發(fā)的,所以不能直接接插到AX7103開(kāi)發(fā)板右上角的擴(kuò)展口上面,但是我們可以通過(guò)杜邦線接到J11擴(kuò)展口。如圖119-4所示。

? ? ? ? DSA IEPE模塊的等效示意圖,如圖119-5所示。可以看出,該模塊集成了ADS127L01和DAC7512E兩個(gè)主要芯片;其中,ADS127L01就是24位高精度高速ADC芯片,負(fù)責(zé)采集小信號(hào);DAC7512E是一顆DAC電壓輸出芯片,配合XTR111芯片來(lái)完成輸出電流可編程的恒流源,再通過(guò)BNC接口輸出給到IEPE這類需要激勵(lì)源的傳感器。當(dāng)外部加速度、聲音、振動(dòng)等傳感器輸出微弱電壓信號(hào)時(shí),先經(jīng)過(guò)AMP電路進(jìn)一步衰減,然后再通過(guò)可編程PGA增益放大電路進(jìn)行放大,最后再經(jīng)過(guò)ADC Driver電路將單端信號(hào)變成差分信號(hào)傳遞給ADS127L01芯片進(jìn)行采集。其中,Voltage REF選擇的是2.5V基準(zhǔn)電壓芯片。

?

? ? ? ? 通過(guò)查看ADS127L01模塊與AX7103擴(kuò)展口之間的線序關(guān)系,然后在AX7103底板原理圖上找到這些引腳序號(hào),如圖119-15所示。本節(jié)實(shí)驗(yàn),我們準(zhǔn)備使用J11擴(kuò)展口里面的2P、2N……9P、9N,對(duì)應(yīng)FPGA的16個(gè)IO引腳。

?????? ?3、FPGA TCP Client下位機(jī)ADC DSA動(dòng)態(tài)信號(hào)采集程序開(kāi)發(fā)(ADS127L01)
?????? ?下面,我們帶著用戶一起利用LabVIEW開(kāi)發(fā)一個(gè)FPGA TCP Client下位機(jī)FPGA數(shù)據(jù)采集應(yīng)用程序,這個(gè)程序可以下載到FPGA芯片里面運(yùn)行,為了更加全面形象的展示TCP網(wǎng)絡(luò)通信的魅力,我們模擬一個(gè)TCP Gige高精度動(dòng)態(tài)信號(hào)采集卡(DSA),將24位ADS127L01芯片采集到的Sine正弦信號(hào),拆分成3個(gè)字節(jié)后,通過(guò)8位位寬的TCP Client上行通道發(fā)送到上位機(jī)進(jìn)行顯示,上位機(jī)通過(guò)8位位寬的下行通道下發(fā)不同的指令參數(shù)來(lái)控制FPGA開(kāi)始采集、停止采集和調(diào)整采集頻率。以此向大家展示FPGA(客戶端)與上位機(jī)PC(服務(wù)器)之間通過(guò)TCP網(wǎng)絡(luò)進(jìn)行雙向高速通信的過(guò)程。
?????? ?提醒: ADS127L01芯片的最大采樣率可以到512KS/s,F(xiàn)XP<±24,24>換算成字節(jié)為單位,也就是512K/s×24/8B=1.5MB/s;遠(yuǎn)小于我們封裝的純FPGA TCP傳輸帶寬(95MB/s),同時(shí)拆分后的位寬也可以直接匹配TCP數(shù)據(jù)位寬,不需要像前面實(shí)驗(yàn)?zāi)菢舆M(jìn)行復(fù)雜的拼湊了,因此,可以直接參考本書(shū)實(shí)驗(yàn)15(AD9226/AD9238+千兆以太網(wǎng)通信)的框架進(jìn)行替換就可以了,這樣可以極大簡(jiǎn)化我們的FPGA編程;我們只需要一個(gè)并轉(zhuǎn)串線程將拆分后的3個(gè)U8字節(jié)FIFO里面的數(shù)據(jù)直接轉(zhuǎn)移到LabVIEW TCP CLIP的上行發(fā)送FIFO里面就可以了,不浪費(fèi)一個(gè)bit,非常簡(jiǎn)單。
?
?? ?3.1、LabVIEW FPGA項(xiàng)目創(chuàng)建
?????? ?1)啟動(dòng)LabVIEW 2019 SP1軟件,用戶可以點(diǎn)擊左上角的“文件>>新建”或者直接點(diǎn)擊“新建”下方的“項(xiàng)目”選項(xiàng)。這里我們也可以直接打開(kāi)前面實(shí)驗(yàn)里面已經(jīng)創(chuàng)建好的“My_FPGA_Starter_Board_Artix7_AX7103_TCP_Client.lvproj”這個(gè)項(xiàng)目,如圖119-16所示。

? ? ? ? 由于本章我們引入了TCP網(wǎng)絡(luò)通信,之前創(chuàng)建的FPGA終端里面沒(méi)有添加TCP Client Socket CLIP,所以,我們需要先右擊“我的電腦”選擇新建“終端和設(shè)備”,如圖119-17所示;然后再在彈出來(lái)的FPGA終端選擇列表里面,選擇一個(gè)帶TCP Client后綴的ARTIX7-100T FPGA終端設(shè)備,如圖119-18所示;點(diǎn)擊“確定”按鈕后,創(chuàng)建好的ARTIX7 TCP Client FPGA終端設(shè)備,如圖119-19所示。
?????? ?提醒:新建含有FPGA TCP Client Socket CLIP的過(guò)程,在前面實(shí)驗(yàn)111里面已經(jīng)創(chuàng)建過(guò)了,所以這里可以忽略,如果是用戶自己新建的項(xiàng)目,只需要參考上面的步驟走一遍就可以了。



?? ? ? ? 2)右擊FPGA終端,選擇“新建>>虛擬文件夾”,如圖119-20所示。將添加到FPGA終端里面的虛擬文件夾,重命名為“實(shí)驗(yàn)119-TCP客戶端+24位AD數(shù)據(jù)采集實(shí)驗(yàn)(模擬動(dòng)態(tài)信號(hào)采集卡)-下位機(jī)”,如圖119-21所示。


?? ?3.2、LabVIEW FPGA EIO節(jié)點(diǎn)與FIFO創(chuàng)建
1)????? 新建按鍵KEY和LED燈的EIO節(jié)點(diǎn)
?????? ?1)由于本節(jié)所有的TCP通信實(shí)驗(yàn)里面都會(huì)用到LED指示燈和按鍵KEY等EIO資源,所以,我們可以在FPGA終端上面右擊,選擇“新建>>FPGA I/O”,如圖119-22所示。然后在彈出來(lái)的I/O資源選擇對(duì)話框里面,找到AX7103 FPGA開(kāi)發(fā)板上的LED和KEY對(duì)應(yīng)的管腳資源,如圖119-23所示。單擊對(duì)話框中間的“向右箭頭”按鈕,將這些引腳對(duì)應(yīng)的EIO節(jié)點(diǎn)添加到右側(cè)的FPGA資源列表里面,如圖119-24所示。
?????? ?提醒:實(shí)際上LED燈和按鍵KEY的EIO節(jié)點(diǎn)在前面實(shí)驗(yàn)111里面已經(jīng)創(chuàng)建過(guò)了,所以這里可以忽略,如果是用戶自己新建的項(xiàng)目,那么參考上面的步驟做一遍就可以了。



? ? ? ? 點(diǎn)擊“確定”按鈕后,這些EIO節(jié)點(diǎn)會(huì)被添加到FPGA終端項(xiàng)目里面,如圖119-25所示。

(在前面做實(shí)驗(yàn)111的時(shí)候已經(jīng)添加過(guò)了)
2)????? 新建ADS127L01和DAC7512E芯片對(duì)應(yīng)的EIO節(jié)點(diǎn)
?????? ?1)右擊“FPGA終端”,選擇“新建>>FPGA I/O”,如圖119-26所示。然后在彈出來(lái)的I/O資源選擇對(duì)話框里面,找到DSA模塊上的ADS127L01和DAC7512E兩個(gè)芯片對(duì)應(yīng)到AX7103 FPGA開(kāi)發(fā)板J11擴(kuò)展口關(guān)聯(lián)的管腳資源,如圖119-27所示。單擊對(duì)話框中間的“向右箭頭”按鈕,將這些引腳資源添加到右側(cè)的FPGA資源列表里面,如圖119-28所示。因?yàn)?,Vivado編譯器不支持同一個(gè)物理IO在xdc約束文件里面有多處定義,所以這里我們直接使用原始的擴(kuò)展口IO名稱。



? ? ? ? 點(diǎn)擊“確定”按鈕后,這些EIO節(jié)點(diǎn)被添加到FPGA終端項(xiàng)目里面,如圖119-29所示。

? ? ? ??注意:細(xì)心的用戶會(huì)發(fā)現(xiàn),這些EIO節(jié)點(diǎn)實(shí)際上已經(jīng)在前面2個(gè)實(shí)驗(yàn)里面添加過(guò)了,所以本節(jié)實(shí)驗(yàn)里面的圖119-27實(shí)際上里面并沒(méi)有這些EIO節(jié)點(diǎn)。如果是用戶自己新建的一個(gè)FPGA終端項(xiàng)目,那么可以完整的添加。
3)????? 新建FIFO
?????? ?我們可以將TCP通信IP核看成一個(gè)獨(dú)立的功能模塊,類似MCU里面的子函數(shù)或者子VI,F(xiàn)PGA程序只需要關(guān)心如何將不同類型的數(shù)據(jù)(U64、U32、U16、U8)通過(guò)TCP協(xié)議發(fā)送出去以及收到的數(shù)據(jù)怎么反饋給FPGA用戶程序,這個(gè)中間的橋梁,可以采用FIFO緩沖區(qū)來(lái)實(shí)現(xiàn)。FIFO非常適合在不同的線程之間傳遞數(shù)據(jù),而且設(shè)計(jì)合理的話,數(shù)據(jù)不會(huì)丟失或者被覆蓋。
?????? ?注意:FPGA用戶線程相當(dāng)于生產(chǎn)者,TCP收發(fā)線程相當(dāng)于消費(fèi)者,所以,二者之間有個(gè)速率匹配的問(wèn)題,生產(chǎn)者發(fā)送數(shù)據(jù)的速度不能快于消費(fèi)者(其中,基于純FPGA實(shí)現(xiàn)的TCP傳輸吞吐率實(shí)測(cè)最高在95MB/s左右),否則會(huì)造成數(shù)據(jù)丟失。比如,本節(jié)實(shí)驗(yàn)里面,我們使用的是24位單通道的ADS127L01芯片,每通道最大采樣率是512KS/s,因此,需要的通道帶寬至少大于3×512KS=1.5MB/s的上行通道才能把下位機(jī)FPGA采集的數(shù)據(jù)無(wú)損的傳輸給上位機(jī)PC,否則會(huì)造成數(shù)據(jù)丟失,顯然我們封裝的純FPGA TCP千兆以太網(wǎng)帶寬完全足夠,后面我們會(huì)根據(jù)具體程序進(jìn)一步分析二者之間的速度匹配問(wèn)題。
?
?????? ?1)右擊FPGA終端項(xiàng)目,選擇新建一個(gè)“虛擬文件夾”,如圖119-30所示。然后重命名為“FIFO_ADC”,這個(gè)虛擬文件夾專門(mén)用來(lái)存放接下來(lái)我們創(chuàng)建的各種ADC芯片的FIFO緩沖區(qū)資源,如圖119-31所示。


(這個(gè)虛擬文件夾在前面實(shí)驗(yàn)116里面創(chuàng)建過(guò)了)
? ? ? ? 2)右擊虛擬文件夾“FIFO_ADC”,選擇“新建>>FIFO”,如圖119-32所示。
?????? ?提醒:考慮到后續(xù)我們需要將原始24位經(jīng)過(guò)拆分之后得到的連續(xù)3個(gè)8位字節(jié)數(shù)據(jù)(U8)通過(guò)并轉(zhuǎn)串依次轉(zhuǎn)移到TCP發(fā)送通道往上位機(jī)傳輸,所以這里需要?jiǎng)?chuàng)建3個(gè)U8類型的ADS127L01臨時(shí)緩沖區(qū)FIFO,分別命名為:FIFO_ADS127L01 _U8_ 1、FIFO_ADS127L01 _U8_ 2、FIFO_ADS127L01 _U8_ 3;為了保持程序結(jié)構(gòu)統(tǒng)一性,我們可以將中間過(guò)渡的ADS127L01 U8 FIFO單獨(dú)新建出來(lái),命名為FIFO_ADS127L01 _U8,這樣一共會(huì)創(chuàng)建4個(gè)U8類型的FIFO。

? ? ? ? 3)接著會(huì)自動(dòng)彈出FIFO屬性設(shè)置對(duì)話框,如圖119-33所示。下面我們逐項(xiàng)解釋一下每個(gè)選項(xiàng)的含義。
?????? ?首先是“名稱”,這里可以隨便輸入一個(gè)能夠體現(xiàn)這個(gè)FIFO功能的名稱,比如我們要把FPGA從ADS127L01芯片里面采集到的有符號(hào)24位數(shù)據(jù)(FXP<±24,24>)拆分成3個(gè)字節(jié)之后,存放到這個(gè)FIFO,那么可以重命名為“FIFO_ADS127L01 _U8_ 1”。
?????? ?其次是“類型”,這個(gè)下拉列表里面默認(rèn)只有一個(gè)選項(xiàng)“終端范圍”,意思就是我們創(chuàng)建的這個(gè)FIFO只能在這個(gè)FPGA芯片內(nèi)部使用,不能用于其他終端,如果用戶使用的是NI的RT+FPGA終端設(shè)備,那么這個(gè)地方會(huì)有更多的選擇,這里不再贅述。?????
?????? ?接著是“請(qǐng)求元素?cái)?shù)量”,默認(rèn)是1023,這個(gè)數(shù)值就是FIFO的深度,最大可以緩沖的數(shù)據(jù)長(zhǎng)度,數(shù)值越大,編譯消耗的FPGA資源就越多。很多客戶以為這個(gè)數(shù)值設(shè)置越大越好,這樣就不容易溢出了,實(shí)則不然,如果多線程之間的FIFO讀寫(xiě)速度差別很大的話,再大的FIFO對(duì)于FPGA這種高速運(yùn)行的器件來(lái)說(shuō),也是瞬間就會(huì)溢出或者覆蓋丟點(diǎn)的。所以問(wèn)題的關(guān)鍵不在于FIFO深度,而是要設(shè)計(jì)一個(gè)合理的讀寫(xiě)匹配機(jī)制。這里我們可以將FIFO深度設(shè)置為128.
?????? ?新增重大更新:對(duì)于FPGA跟上位機(jī)(Windows/Linux)之間存在握手機(jī)制的通信協(xié)議來(lái)說(shuō),比如常見(jiàn)的TCP和PCIe協(xié)議,F(xiàn)PGA什么時(shí)候可以往上行FIFO里面送數(shù)據(jù),是可以根據(jù)ready信號(hào)來(lái)判斷的,UDP協(xié)議不存在握手,所以下位機(jī)FPGA不需要大容量緩沖FIFO;通常這些存在握手協(xié)議的上行FIFO一般都是異步的,比如ADC采集循環(huán)(線程)與TCP或者PCIe傳輸循序(線程)往往是兩個(gè)獨(dú)立的線程,并且時(shí)鐘域也不一樣,因此,這個(gè)上行FIFO的深度就顯得非常重要,而不是隨便設(shè)置的。因?yàn)槲覀兊纳衔粰C(jī)特別是Windows系統(tǒng),抖動(dòng)非常大,通常都是ms量級(jí)的,舉個(gè)例子,假設(shè)下位機(jī)FPGA模擬或者實(shí)際的ADC采樣率是10MS/s,ADC位數(shù)是16位,如果上位機(jī)系統(tǒng)稍微卡頓或者阻塞的時(shí)間是1ms,那么下位機(jī)FPGA需要緩沖的FIFO深度至少是10M×0.001=10K,也就是最少需要1萬(wàn)個(gè)點(diǎn)的空間或者2萬(wàn)個(gè)字節(jié)空間;因此,我們建議在FPGA資源足夠的情況下,盡量將這類承擔(dān)高速傳輸?shù)纳闲蠪IFO(FIFO_TCP_Send_U8)深度設(shè)置的足夠大,比如這里我們可以設(shè)置為120K個(gè)點(diǎn),這樣后續(xù)上位機(jī)只要抖動(dòng)不是很劇烈的話(比如ms量級(jí)),是可以保證下位機(jī)FPGA數(shù)據(jù)不溢出丟點(diǎn)的;但是,如果下位機(jī)ADC采樣率非常高的話,比如100MS/s甚至上GS/s的話,那么光靠下位機(jī)FPGA芯片自身的Memory空間顯然不足,因?yàn)閷氋F的LUT資源一般不要輕易作為FIFO用,那么此時(shí),F(xiàn)PGA外圍的DDR3或者DDR4就起到了真正的作用;在我們整本書(shū)里面雖然有DDR的實(shí)驗(yàn)例程和講解,但是并沒(méi)有真正說(shuō)清楚這些DDR顆粒在什么情況下使用,實(shí)際上存在高速采集和握手協(xié)議的傳輸或者通信程序中,DDR可以起到大容量數(shù)據(jù)緩沖的作用,這樣上位機(jī)即使卡頓或者抖動(dòng)時(shí)間達(dá)到幾百ms都不用擔(dān)心了,當(dāng)然,如果上位機(jī)的抖動(dòng)這么大的話,用戶還是需要對(duì)上位機(jī)程序進(jìn)行優(yōu)化的。在我們單獨(dú)移植開(kāi)發(fā)的純FPGA TCP Socket CLIP里面也會(huì)著重強(qiáng)調(diào)上行FIFO空間深度設(shè)置的大小合理性。

? ? ? ? 然后是“實(shí)現(xiàn)”方式,里面有3個(gè)選項(xiàng)“觸發(fā)器”、“查找表”和“存儲(chǔ)器塊”,如圖119-34所示。前兩個(gè)就是FPGA最為寶貴的邏輯門(mén)資源了,一般不輕易使用,除非是用戶已經(jīng)將FPGA內(nèi)部的存儲(chǔ)器全部用完了,否則優(yōu)先使用內(nèi)部存儲(chǔ)器塊,這個(gè)存儲(chǔ)器不占用FPGA內(nèi)部的邏輯資源,不用也是浪費(fèi)。
圖119-34:FIFO屬性對(duì)話框:實(shí)現(xiàn)方式
?????? ?最后是“控制邏輯”,這個(gè)特別需要注意,默認(rèn)選擇的是“終端優(yōu)化”,如圖119-35所示。最下方有個(gè)提示框,里面有段文字“根據(jù)FIFO使用的時(shí)鐘域和終端類型,應(yīng)用程序?qū)?huì)通過(guò)邏輯片架構(gòu)或內(nèi)置控制邏輯實(shí)現(xiàn)FIFO,因此當(dāng)使用“終端優(yōu)化”控制邏輯時(shí),元素的實(shí)際數(shù)量可能有所不同?!币簿褪钦f(shuō)LabVIEW在生成VHDL代碼的時(shí)候,真實(shí)生成的FIFO深度并沒(méi)有達(dá)到我們前面實(shí)際設(shè)置的“請(qǐng)求元素長(zhǎng)度”。如果用戶忽略這個(gè),可能會(huì)導(dǎo)致程序在運(yùn)行的時(shí)候,出現(xiàn)一些跟預(yù)期目標(biāo)不一致的情況。
圖119-35:FIFO屬性對(duì)話框:控制邏輯:終端優(yōu)化
?????? ?所以建議用戶選擇“邏輯片架構(gòu)”,如圖119-36所示。這時(shí)下面會(huì)提醒用戶“元素?cái)?shù)量已強(qiáng)制轉(zhuǎn)換為FPGA可高效實(shí)現(xiàn)的值。”也就是說(shuō)LabVIEW生成的FIFO深度會(huì)強(qiáng)制為我們申請(qǐng)的長(zhǎng)度。
圖119-36:FIFO屬性對(duì)話框:控制邏輯:邏輯片架構(gòu)
?????? ?4)接下來(lái)需要設(shè)置FIFO緩沖區(qū)單元的數(shù)據(jù)類型,在左側(cè)的“類別”列表里面選擇“數(shù)據(jù)類型”,然后在右側(cè)的下拉列表里面選擇8位無(wú)符號(hào)整形數(shù)據(jù),如圖119-37所示。因?yàn)槲覀儚腁DS127L01芯片里面采集回來(lái)的數(shù)據(jù)位寬是8位。
圖119-37:FIFO屬性對(duì)話框:數(shù)據(jù)類型:U8
?????? ?5)最后點(diǎn)擊左側(cè)的“接口”,切換到仲裁選項(xiàng),如圖119-38所示。將讀取和寫(xiě)入的仲裁全部設(shè)置為“從不仲裁”,這樣編譯出來(lái)的代碼執(zhí)行速度也就是時(shí)鐘約束可以提高不少,同時(shí)代碼的健壯性和確定性也比仲裁來(lái)的穩(wěn)。
圖119-38:FIFO屬性對(duì)話框:接口:從不仲裁
?????? ?6)全部設(shè)置完成后,點(diǎn)擊“確定”按鈕,即可創(chuàng)建出一個(gè)用來(lái)存放ADS127L01數(shù)據(jù)的緩沖區(qū)“FIFO_ADS127L01 _U8_ 1”,然后再以同樣的方式再創(chuàng)建3個(gè)接收緩沖區(qū)“FIFO_ADS127L01 _U8_ 2”、“FIFO_ADS127L01 _U8_ 3”和“FIFO_ADS127L01 _U8”,如圖119-39所示。

? ? ? ? 7)因?yàn)槲覀兘o用戶封裝的LabVIEW FPGA TCP Client Socket CLIP里面,正好上下行通道位寬也是8位,與并轉(zhuǎn)串后的ADS127L01 FIFO位寬正好匹配上。為了將ADS127L01的數(shù)據(jù)通過(guò)TCP Client上行通道傳輸?shù)缴衔粰C(jī)PC服務(wù)器端,我們還需要?jiǎng)?chuàng)建一個(gè)8位位寬的TCP Client FIFO緩沖區(qū)作為不同線程里面的過(guò)渡。用戶可以參考前面FIFO的創(chuàng)建步驟單獨(dú)新建一個(gè),也可以直接利用我們前面創(chuàng)建好的“FIFO_TCP_Send_U8”這個(gè)FIFO,位于虛擬文件夾“FIFO_TCP”里面,如圖119-40所示。
圖119-40:創(chuàng)建1個(gè)U8類型的TCP上行通道FIFO緩沖區(qū)(實(shí)驗(yàn)111里面已經(jīng)新建過(guò)了)
?????? ?8)最后,我們還需要新建一個(gè)可以接收上位機(jī)PC(服務(wù)器端)下發(fā)指令和參數(shù)的接收FIFO緩沖區(qū)。需要注意的是:因?yàn)樯衔粰C(jī)下發(fā)的指令和參數(shù)一般速度不會(huì)太快,另外,上位機(jī)發(fā)送的數(shù)據(jù)一般會(huì)經(jīng)過(guò)“強(qiáng)制類型轉(zhuǎn)換”VI變成字符串或者字節(jié)數(shù)組,這兩種類型的數(shù)據(jù)表示法默認(rèn)都是U8,所以,這里我們創(chuàng)建的FPGA接收PC下發(fā)的讀取FIFO的數(shù)據(jù)類型也要設(shè)置為U8,因此,“FIFO_TCP_Receive_U8”的數(shù)據(jù)類型要設(shè)置為U8,如圖119-41所示。其實(shí),這個(gè)FIFO我們?cè)谇懊鎸?shí)驗(yàn)111里面也已經(jīng)創(chuàng)建過(guò)了。如果用戶沒(méi)有新建,那么參考前面的FIFO創(chuàng)建步驟自己創(chuàng)建一個(gè)就可以了。
圖119-41:創(chuàng)建U8類型的TCP下行接收通道FIFO緩沖區(qū)(實(shí)驗(yàn)111里面已經(jīng)新建過(guò)了)
?????? ?9)開(kāi)始編寫(xiě)程序之前,我們先通過(guò)創(chuàng)建虛擬文件夾的方式,將接下來(lái)新建的主VI等文件分類進(jìn)行管理,便于維護(hù)和調(diào)試。這里用到的方法建議用戶在開(kāi)發(fā)自己的項(xiàng)目時(shí),優(yōu)先分類管理。首先右擊虛擬文件夾“實(shí)驗(yàn)119-TCP客戶端+24位AD數(shù)據(jù)采集實(shí)驗(yàn)(模擬動(dòng)態(tài)信號(hào)采集卡)-下位機(jī)”,新建1個(gè)子虛擬文件夾(Main),如圖119-42所示。這個(gè)虛擬文件夾用來(lái)存放主VI文件。
圖119-42:創(chuàng)建1個(gè)虛擬文件夾分別用來(lái)存放1類文件-便于管理
?? ?3.3、下位機(jī)FPGA TCP DSA主VI編寫(xiě)過(guò)程(基于TCP Client CLIP + ADS127L01+DAC7512E)
?????? ?1)右擊“實(shí)驗(yàn)119-TCP客戶端+24位AD數(shù)據(jù)采集實(shí)驗(yàn)(模擬動(dòng)態(tài)信號(hào)采集卡)-下位機(jī)”里面的子虛擬文件夾“Main”,選擇“新建>>VI”,如圖119-43所示。然后,新建一個(gè)VI,另存為“實(shí)驗(yàn)119-TCP客戶端+24位動(dòng)態(tài)信號(hào)采集卡(ADS127L01)-FPGA.vi”,如圖119-44所示。


? ? ? ? 2)再創(chuàng)建一個(gè)名為NGC的虛擬文件夾,然后右擊該虛擬文件夾NGC,選擇“添加”,將實(shí)驗(yàn)53里面的ADS127L01和DAC7512E兩個(gè)芯片的FPGA驅(qū)動(dòng)網(wǎng)表文件添加到項(xiàng)目瀏覽器里面來(lái),如圖119-45所示。

?????? ?3.3.1、編寫(xiě)24位高速ADC數(shù)據(jù)采集程序(ADS127L01采集線程)
?????? ?1)雖然ADS127L01芯片的最大采樣率只有512KSps,但是底層的NGC網(wǎng)表文件需要運(yùn)行的時(shí)鐘域比較高,需要200MHz,另外,DAC7512E對(duì)應(yīng)的時(shí)鐘域是100MHz,所以我們需要提前創(chuàng)建1個(gè)100MHz的衍生時(shí)鐘,因?yàn)榘遢d時(shí)基就是默認(rèn)的200MHz時(shí)鐘,所以這個(gè)200MHz可以不用再創(chuàng)建了。
?????? ?2)右擊項(xiàng)目瀏覽器里面的板載時(shí)鐘“200 MHz Onboard Clock”,如圖119-46所示。在彈出的衍生時(shí)鐘屬性配置頁(yè)面里面,將所需衍生頻率設(shè)置為100MHz,如圖119-47所示。點(diǎn)擊“確定”按鈕后,展開(kāi)板載時(shí)鐘“200 MHz Onboard Clock”可以看到這個(gè)新建的時(shí)鐘源,如圖119-48所示。實(shí)際上,這個(gè)100M的衍生時(shí)鐘我們?cè)谇懊娴膶?shí)驗(yàn)里面創(chuàng)建過(guò)了。



? ? ? ? 3)打開(kāi)主VI“實(shí)驗(yàn)119-TCP客戶端+24位動(dòng)態(tài)信號(hào)采集卡(ADS127L01)-FPGA.vi”,切換到程序框圖,放置一個(gè)定時(shí)循環(huán)結(jié)構(gòu),然后雙擊打開(kāi)這個(gè)定時(shí)循環(huán)的時(shí)鐘源配置頁(yè)面,選擇“200 MHz Onboard Clock”作為ADS127L01采集線程的時(shí)鐘源,如圖119-49所示。

? ? ? ? 4)接下來(lái),我們直接把本書(shū)前面第53個(gè)實(shí)驗(yàn)里面的這個(gè)FPGA VI“實(shí)驗(yàn)53-高精度24位512KS-DSA動(dòng)態(tài)信號(hào)采集-IEPE.vi”里面的ADS127L01數(shù)據(jù)采集線程定時(shí)循環(huán)拷貝到本節(jié)程序里面,如圖119-50所示。然后將里面的3個(gè)FIFO換成本節(jié)實(shí)驗(yàn)我們創(chuàng)建的3個(gè)ADS127L01臨時(shí)FIFO緩沖區(qū);添加一個(gè)布爾型的開(kāi)關(guān)按鈕來(lái)控制ADS127L01采集使能,將按鈕名稱改成“開(kāi)始/停止”,更加形象一些,這個(gè)按鈕可以由上位機(jī)PC通過(guò)TCP下發(fā)指令控制ADS127L01是否采集數(shù)據(jù)。
?????? ?注意:拷貝過(guò)來(lái)的IP節(jié)點(diǎn),需要重新配置一遍,用戶可以直接雙擊IP Node節(jié)點(diǎn),然后做一遍配置流程即可。

? ? ? ? 5)由于ADS127L01芯片本身可以實(shí)現(xiàn)4個(gè)檔位的采樣率控制,因此,我們不需要像前面實(shí)驗(yàn)?zāi)菢?,人為加?jì)數(shù)分頻代碼,比如,我們直接控制“sample_rate”就可以實(shí)現(xiàn)不同的采樣率;當(dāng)然了,如果用戶覺(jué)得ADS127L01芯片自身的幾個(gè)固定檔位的采樣率不方便自己使用,用戶可以自己在FPGA下位機(jī)里面加入計(jì)數(shù)分頻或者在上位機(jī)進(jìn)行抽點(diǎn)分頻都行,這里,不再贅述了。
?????? ?6)為了能夠調(diào)節(jié)ADS127L01的采樣率,我們?cè)谙挛粰C(jī)FPGA程序前面板上放置了一個(gè)“sample_rate”,如圖119-51所示,本質(zhì)上是一個(gè)3bit的數(shù)值控件。假設(shè),sample_rate設(shè)置為0,那么實(shí)際的采樣率就是64KS/s,等效于的吞吐率是3×64KS=0.192MSps,如圖119-51所示;如果設(shè)置為1,那么采樣率就是128KS/s,一共4個(gè)檔位;以此類推,用戶可以提前在前面板上設(shè)置好sample_rate,但是需要保存為默認(rèn)值之后再編譯,或者由上位機(jī)PC通過(guò)TCP下發(fā)參數(shù)來(lái)控制這個(gè)sample_rate參數(shù),然后觀察上位機(jī)PC端的波形圖控件里面的信號(hào)周期點(diǎn)數(shù)是否發(fā)生符合預(yù)期的變化。
?????? ?注意1:這種方式相對(duì)來(lái)說(shuō)比較簡(jiǎn)單,不會(huì)影響其他時(shí)序,特別是有些芯片需要嚴(yán)格時(shí)序邏輯時(shí),不得不采用定時(shí)循環(huán),但是同時(shí)又希望自己能夠掌控實(shí)際采樣率,那么可以采用這種設(shè)計(jì)模式,兩全其美。

? ? ? ?注意2:直接復(fù)制過(guò)來(lái)的ADS127L01采集線程提示有錯(cuò)誤,LabVIEW運(yùn)行箭頭是斷開(kāi)的,這是因?yàn)槔锩嬗蠭P Block調(diào)用網(wǎng)表的節(jié)點(diǎn)存在,拷貝意味著挪動(dòng),所以我們需要雙擊這個(gè)IP節(jié)點(diǎn),重新走一遍配置過(guò)程就可以了,如圖119-52所示。

? ? ? ??7)如果用戶希望通過(guò)TCP網(wǎng)絡(luò)控制DSA模塊上的恒流源輸出指定大小的電流來(lái)激勵(lì)外部的IEPE這些無(wú)源傳感器,那么還需要將本書(shū)前面實(shí)驗(yàn)53里面的“DAC7512E恒流源控制線程”拷貝到本節(jié)下位機(jī)FPGA里面來(lái),如圖119-53所示。然后雙擊IP Node節(jié)點(diǎn)重新配置一遍,需要注意的是:這個(gè)恒流源輸出線程的定時(shí)循環(huán)時(shí)鐘要選擇前面我們創(chuàng)建好的100MHz,其次,如果用戶想屏蔽恒流源輸出,可以拉高Source_ENA這個(gè)按鈕,而不能通過(guò)對(duì)DAC芯片賦值為0,因?yàn)闀?huì)存在漏電流,所以最保險(xiǎn)的方式就是控制Source_ENA來(lái)決定是否開(kāi)啟XTR111使能輸出;關(guān)于12位的DAC7512E的賦值跟實(shí)際輸出的電流之間的關(guān)系,我們?cè)谇懊娴哪K原理圖部分已經(jīng)給用戶做過(guò)詳細(xì)的講解了。

?????? ?3.3.2、編寫(xiě)并轉(zhuǎn)串程序(3個(gè)U8依次轉(zhuǎn)移到1個(gè)U8緩沖里面)
?????? ?接著我們需要將這3個(gè)并行的U8字節(jié)FIFO里面的數(shù)據(jù)依次存放到TCP發(fā)送FIFO里面,不能錯(cuò)位,不然上位機(jī)就無(wú)法正確解析出來(lái)了。ADS127L01最大采樣時(shí)鐘頻率是512KHz,那么為了能夠快速實(shí)現(xiàn)3個(gè)FIFO的數(shù)據(jù)轉(zhuǎn)移,并轉(zhuǎn)串線程的時(shí)鐘只要≥512KHz×3=1.5MHz,就不會(huì)發(fā)生數(shù)據(jù)溢出或者覆蓋,這里我們選擇常見(jiàn)的10MHz或者50MHz時(shí)鐘作為并轉(zhuǎn)串線程的時(shí)鐘域都行。
?
?????? ?下面,我們單獨(dú)開(kāi)辟一個(gè)并轉(zhuǎn)串線程,將ADS127L01臨時(shí)3個(gè)U8類型的FIFO數(shù)據(jù)直接轉(zhuǎn)移到我們創(chuàng)建的臨時(shí)8位FIFO里面去。并轉(zhuǎn)串線程的幾個(gè)case條件程序框圖,如圖119-54~119-56所示。當(dāng)右側(cè)的臨時(shí)U8類型的FIFO沒(méi)有溢出的情況下,“輸入就緒”會(huì)拉高,將這個(gè)信號(hào)按照四線握手接到ADS127L01拆分出來(lái)的3個(gè)原始數(shù)據(jù)FIFO的“輸出就緒”端口上,然后再根據(jù)“輸出有效”高低來(lái)決定是否跳轉(zhuǎn)到下一個(gè)case條件分支,這樣就實(shí)現(xiàn)了將3個(gè)ADS127L01 FIFO里面的按照順序轉(zhuǎn)移到這個(gè)臨時(shí)FIFO里面去了,上位機(jī)只需要把原始的U8字節(jié)數(shù)組拼接成有符號(hào)24位定點(diǎn)數(shù)據(jù)后,再利用公式節(jié)點(diǎn)轉(zhuǎn)成實(shí)際的電壓值就可以了。



? ? ? ??提醒:并轉(zhuǎn)串這個(gè)架構(gòu)在前面的多個(gè)實(shí)驗(yàn)都講到了,不熟悉的用戶需要加深一下理解,多動(dòng)手自己練習(xí)一下就會(huì)了。
?????? ?注意:由于我們需要將3個(gè)字節(jié)依次上傳到上位機(jī)進(jìn)行拼接解析,如果中間錯(cuò)了一個(gè)字節(jié)或者丟失一個(gè)字節(jié),那么會(huì)導(dǎo)致上位機(jī)解析的所有數(shù)據(jù)都會(huì)出錯(cuò)。因?yàn)樨?fù)責(zé)把FPGA采集的數(shù)據(jù)發(fā)送到上位機(jī)的是8位位寬的TCP通道,如果傳輸?shù)臅r(shí)候出現(xiàn)非3個(gè)字節(jié),順序計(jì)數(shù)不對(duì)的話,就完蛋了,因?yàn)樯衔粰C(jī)下發(fā)給FPGA的停止條件是隨機(jī)的,雖然在后續(xù)的TCP發(fā)送線程里面已經(jīng)無(wú)條件將上行通道里面的字節(jié)進(jìn)行讀取清空了,但是ADS127L01拆分出來(lái)的3個(gè)U8字節(jié)的FIFO并沒(méi)有清空,所以,為了保險(xiǎn)起見(jiàn),萬(wàn)無(wú)一失,我們可以將圖119-54~119-56里面的邏輯代碼框起來(lái),然后在條件為“假”的分支里面對(duì)3個(gè)臨時(shí)FIFO進(jìn)行讀取清空,同時(shí)對(duì)狀態(tài)機(jī)的計(jì)數(shù)器進(jìn)行清零操作,如下圖119-57所示。這樣就能搞定因通道排序錯(cuò)點(diǎn)等問(wèn)題造成的上位機(jī)解析問(wèn)題。這個(gè)思想跟前面實(shí)驗(yàn)63里面的8通道AD7606是完全一樣的。

? ? ? ? 最后,為了判斷ADS127L01采集過(guò)程中是否丟點(diǎn),我們?cè)谶@個(gè)并轉(zhuǎn)串線程里面加上FIFO溢出計(jì)數(shù)判斷,另外把LED4指示燈與溢出信號(hào)相連,也能通過(guò)板子上LED燈閃爍來(lái)直觀的判斷是否因?yàn)門(mén)CP帶寬原因而造成的ADS127L01丟點(diǎn),如圖119-58所示。注意:“輸入就緒”取反之后跟“超時(shí)”是一個(gè)效果。

?????? ?3.3.3、編寫(xiě)ADC FIFO轉(zhuǎn)移至TCP FIFO(數(shù)據(jù)轉(zhuǎn)移線程)
?????? ?為了保持FPGA程序框架的統(tǒng)一性,我們將前面ADC采集線程里面的FIFO數(shù)據(jù)利用四線握手轉(zhuǎn)移到TCP發(fā)送FIFO里面去,如圖119-59所示。需要注意的是,這個(gè)線程的時(shí)鐘頻率要≥ADC采樣率,比如本節(jié)實(shí)驗(yàn)里面的ADS127L01數(shù)據(jù)吞吐率換算成字節(jié)最大是512KS/s×24/8Byte=1.5MB/s,遠(yuǎn)遠(yuǎn)小于千兆以太網(wǎng)的極限傳輸帶寬,為了相同的時(shí)鐘域,這里我們將125MHz的TCP時(shí)鐘頻率作為定時(shí)循環(huán)時(shí)鐘源。

???? ?3.3.4、編寫(xiě)下位機(jī)FPGA TCP Client Send程序框圖(FPGA-->PC):上行
?????? ?1)為了降低FPGA TCP程序開(kāi)發(fā)的難度,我們提前將ComBlock公司提供的VHDL版本的TCP Client IP核,利用NI公司的Socket CLIP技術(shù),將其封裝到FPGA終端下面,只把需要進(jìn)行握手的FIFO端口預(yù)留出來(lái),如圖119-60所示。這樣做的好處在于,用戶即使完全不懂TCP協(xié)議棧,也能在FPGA里面調(diào)用CLIP進(jìn)行TCP網(wǎng)絡(luò)通信。關(guān)于這部分內(nèi)容,前面10.4節(jié)已經(jīng)做過(guò)了詳細(xì)的講解,不記得的用戶一定要把前面10.4節(jié)溫習(xí)一遍。

? ? ? ? 2)打開(kāi)主VI“實(shí)驗(yàn)119-TCP客戶端+24位動(dòng)態(tài)信號(hào)采集卡(ADS127L01)-FPGA.vi”,切換到程序框圖,放置一個(gè)定時(shí)循環(huán)結(jié)構(gòu),然后雙擊打開(kāi)這個(gè)定時(shí)循環(huán)的時(shí)鐘源配置頁(yè)面,選擇125MHz的TCP Client CLIP時(shí)鐘作為時(shí)鐘源,如圖119-61所示。這個(gè)125MHz同步時(shí)鐘驅(qū)動(dòng)的定時(shí)循環(huán),是專門(mén)用來(lái)處理用戶創(chuàng)建的FIFO跟TCP IP核內(nèi)部的FIFO之間進(jìn)行數(shù)據(jù)交互的,支持標(biāo)準(zhǔn)四線握手串聯(lián)。

? ? ? ? 3)接下來(lái),我們可以將FPGA終端下“TCP_Client Data”里面的前8個(gè)節(jié)點(diǎn)(TCP Client IP核復(fù)位和TCP網(wǎng)絡(luò)配置參數(shù))和“l(fā)v_tcp_client_connect_status”拖拽到剛剛創(chuàng)建的定時(shí)循環(huán)里面,然后創(chuàng)建相應(yīng)的復(fù)位按鈕和連接指示燈控件以及相應(yīng)的IP參數(shù),如圖119-62所示。

? ? ? ? 其中,“TCP_Client Data\lv_tcp_client_reset”拉高(True),復(fù)位TCP Client IP核;如果TCP連接成功,“TCP_Client Data\lv_tcp_client_connect_status”指示燈會(huì)點(diǎn)亮;中間的7個(gè)TCP參數(shù)含義分別是:
l? 下位機(jī)FPGA 客戶端MAC地址:01-02-03-04-05-06
l? 下位機(jī)FPGA客戶端IP地址:192.168.1.16
l? 下位機(jī)FPGA客戶端端口:1028
l? 下位機(jī)FPGA客戶端網(wǎng)關(guān):192.168.1.1
l? 下位機(jī)FPGA客戶端子網(wǎng)掩碼:255.255.255.0
l? 下位機(jī)FPGA需要連接的遠(yuǎn)程服務(wù)器IP地址:192.168.1.10
l? 下位機(jī)FPGA需要連接的遠(yuǎn)程服務(wù)器端口:1024
?????? ?4)接下來(lái),我們需要編寫(xiě)一下FPGA(客戶端)傳遞數(shù)據(jù)給TCP IP核然后發(fā)送到上位機(jī)PC(服務(wù)器)的代碼。首先,我們把FPGA終端下的TCP_Client Data里面的3個(gè)發(fā)送信號(hào)端口“l(fā)v_tcp_client_tx_data_in”、“l(fā)v_tcp_client_tx_data_in_vld”、“l(fā)v_tcp_client_tx_data_req_en”,拖拽到程序框圖里面來(lái),如圖119-63所示。這3個(gè)信號(hào)端口其實(shí)符合標(biāo)準(zhǔn)的四線握手。

? ? ? ? 5)然后把我們前面創(chuàng)建好的8位位寬的用戶FIFO(FIFO_TCP_Send_U8)也拖到程序框圖里面,然后根據(jù)四線握手的方式,將TCP Client CLIP上行通道的3個(gè)握手信號(hào)接到FIFO上面去,完整的TCP Client數(shù)據(jù)上行發(fā)送程序框圖,如圖119-64所示。

(FPGA-->PC上行數(shù)據(jù)發(fā)送程序框圖)
? ? ? ? 下面我們來(lái)講解一下上面紅色框框里面的程序框圖含義:當(dāng)TCP Client IP核內(nèi)部的FIFO沒(méi)有滿時(shí),這個(gè)“l(fā)v_tcp_client_tx_data_req_en”信號(hào)會(huì)拉高,也就是通知FPGA,可以將采集的數(shù)據(jù)發(fā)送給TCP IP核內(nèi)部的FIFO;我們可以將這個(gè)信號(hào)接到FPGA里面用戶創(chuàng)建的FIFO(FIFO_TCP_Send_U8)的“輸出就緒”端口,然后把“元素”和“輸出有效”兩個(gè)端口分別接到TCP Client IP核的“l(fā)v_tcp_client_tx_data_in”和“l(fā)v_tcp_client_tx_data_in_vld”兩個(gè)信號(hào)端口上;當(dāng)用戶FIFO里面有數(shù)據(jù)輸出時(shí),就會(huì)直接通過(guò)TCP傳輸?shù)缴衔粰C(jī)PC端了。
?????? ?提醒:為了讓上位機(jī)PC(服務(wù)器)能夠自由動(dòng)態(tài)的控制下位機(jī)FPGA(客戶端)使能采集,我們加了一個(gè)布爾型控件“開(kāi)始/停止”按鈕,這個(gè)控件可以由上位機(jī)下發(fā)指令和參數(shù)進(jìn)行控制,通過(guò)取反之后跟準(zhǔn)備就緒“l(fā)v_tcp_client_tx_data_req_en”信號(hào)“相或”之后接到用戶FIFO上面,同時(shí)還直接接到case結(jié)構(gòu)上面。這樣設(shè)計(jì)的目的是:是為了讓下位機(jī)FPGA能夠自動(dòng)把用戶FIFO(FIFO_TCP_Send_U8)殘留剩余的數(shù)據(jù)讀走等效于清空掉,比如上位機(jī)此時(shí)下發(fā)了一個(gè)停止采集指令,然后將布爾控件“開(kāi)始/停止”設(shè)置為“假”,取反之后為“真”,接到了用戶FIFO上面,如果此時(shí)用戶FIFO里面依然殘留了一些數(shù)據(jù),直接就讀出來(lái),通過(guò)后面的case結(jié)構(gòu)“假”分支過(guò)濾掉了;如果此時(shí)上位機(jī)PC再下發(fā)一個(gè)開(kāi)始采集指令,那么用戶FIFO里面一定是最新的數(shù)據(jù),通過(guò)TCP發(fā)送到上位機(jī)的數(shù)據(jù)也就是最新的了。利用這種巧妙的方式可以模擬一個(gè)真實(shí)的DAQ數(shù)據(jù)采集設(shè)備。
?????? ?當(dāng)然,我們還需要在ADS127L01采集線程里面加上這個(gè)“開(kāi)始/停止”按鈕來(lái)控制ADS127L01原始FIFO數(shù)據(jù)是否寫(xiě)入,如圖119-65所示。只有當(dāng)這個(gè)按鈕為“真”時(shí),才會(huì)啟動(dòng)采集。

?????? ?3.3.5、編寫(xiě)下位機(jī)FPGA TCP Client Receive程序框圖(PC-->FPGA):下行
?????? ?1)接下來(lái),我們還需要編寫(xiě)一個(gè)下行(PC-->FPGA)數(shù)據(jù)接收的程序框圖。由于發(fā)送的下行數(shù)據(jù)一般都是經(jīng)過(guò)“強(qiáng)制類型轉(zhuǎn)換”函數(shù)轉(zhuǎn)成了字節(jié)數(shù)組或者字符串形式,本質(zhì)上數(shù)據(jù)類型屬于U8,所以這里,我們可以使用FPGA終端下TCP_Client Data這個(gè)CLIP里面的8位下行通道來(lái)接收PC下發(fā)的字節(jié)數(shù)組。比如,本節(jié)實(shí)驗(yàn)我們使用下行通道來(lái)接收PC下發(fā)的指令和參數(shù)。
?????? ?2)首先,用戶可以將FPGA終端下行通道的2個(gè)握手信號(hào)(lv_tcp_client_rx_data_out、lv_tcp_client_rx_data_out_vld)拖拽到FPGA程序框圖里面,如圖119-66所示。

? ? ? ? 3)然后根據(jù)四線握手的方式,將TCP Client CLIP下行通道的2個(gè)握手信號(hào)接到用戶創(chuàng)建的Receive FIFO(FIFO_TCP_Receive_U8)上面去,完整的FPGA TCP數(shù)據(jù)下行接收程序框圖,如圖119-67所示。

(PC --> FPGA下行數(shù)據(jù)接收程序框圖)
? ? ? ? 至此,關(guān)于下位機(jī)FPGA TCP Client四線握手的通信線程代碼就編寫(xiě)完成了,這個(gè)線程也是最為核心的一個(gè)程序,今后,用戶可以直接拷貝這個(gè)線程到自己的程序里面,而無(wú)需從頭編寫(xiě)。
?????? ?3.3.6、編寫(xiě)下位機(jī)FPGA數(shù)據(jù)解析程序框圖:下行數(shù)據(jù)解析線程
?????? ?1)為了能夠真實(shí)的模擬上位機(jī)PC(服務(wù)器)和下位機(jī)FPGA(客戶端)之間的交互運(yùn)行,我們還需要編寫(xiě)一個(gè)FPGA數(shù)據(jù)解析線程,將PC下發(fā)的指令和參數(shù)正確的解析出來(lái),然后賦值給FPGA里面相應(yīng)的控件。關(guān)于這個(gè)數(shù)據(jù)解析線程的框架,其實(shí)我們?cè)诒緯?shū)前面的串口通信和千兆以太網(wǎng)通信實(shí)驗(yàn)里面都有提到,不熟悉的用戶可以回顧一下前面的相關(guān)內(nèi)容。
?????? ?2)數(shù)據(jù)解析線程的整體框架,其實(shí)很簡(jiǎn)單:就是一個(gè)普通while循環(huán),首先通過(guò)FIFO“獲取待讀取元素?cái)?shù)量”方法節(jié)點(diǎn),輪詢TCP Receive FIFO里面是否接收到指定長(zhǎng)度的數(shù)據(jù)(比如,做定長(zhǎng)解析),如果達(dá)到了指定長(zhǎng)度的數(shù)據(jù),則利用for循環(huán)一次性將這些字節(jié)數(shù)組讀取出來(lái),然后進(jìn)行拼接合并轉(zhuǎn)換,變成實(shí)際意義的參數(shù)或者指令。
?????? ?3)比如本節(jié)實(shí)驗(yàn)里面,上位機(jī)PC每次下發(fā)的指令和參數(shù)一共是12個(gè)字節(jié)數(shù)據(jù),那么我們?cè)谙挛粰C(jī)FPGA程序里面,就可以將case結(jié)構(gòu)的條件設(shè)置為12..,也就是說(shuō),只要下位機(jī)FPGA接到了至少有12個(gè)字節(jié)的數(shù)據(jù),就會(huì)進(jìn)入case里面,然后將for循環(huán)的長(zhǎng)度也設(shè)置為12,這樣就能一次性把這12個(gè)字節(jié)數(shù)據(jù)全部讀取出來(lái)變成一個(gè)字節(jié)數(shù)組,然后再對(duì)這個(gè)一維數(shù)組進(jìn)行索引拼接合并,甚至于進(jìn)行加減乘除計(jì)算,完整的數(shù)據(jù)解析線程框圖,如圖119-68所示。通過(guò)程序框圖可以看出:第1個(gè)字節(jié)跟0進(jìn)行比較,如果大于0就啟動(dòng)采集,小于等于0則停止采集;第2個(gè)字節(jié)跟0進(jìn)行比較,如果大于0就將ADS127L01工作模式設(shè)置為高性能高分辨率,小于等于0則設(shè)置為低功耗模式;第3個(gè)字節(jié)跟0進(jìn)行比較,如果大于0就對(duì)ADS127L01芯片進(jìn)行硬件復(fù)位,小于等于0則取消復(fù)位,可以看出,這些開(kāi)關(guān)量都是通過(guò)給布爾控件進(jìn)行賦值實(shí)現(xiàn)的;第4個(gè)字節(jié)賦給ADS127L01的增益控件“gain”,因?yàn)锳DS127L01模塊的增益只有3檔(2.02、6.6、13.2),所以IP Node調(diào)用的ngc網(wǎng)表里面的“gain”端口只用了2bit來(lái)表示,我們用U8來(lái)表達(dá)布爾和小于8位寬度的數(shù)值是為了簡(jiǎn)化編程;第5個(gè)字節(jié)賦給ADS127L01的采樣率控件“sample_rate”,用來(lái)改變ADS127L01芯片的采樣率,因?yàn)锳DS127L01芯片的采樣率只有4檔(64KS/s、128KS/s、256KS/s、512KS/s),所以IP Node調(diào)用的ngc網(wǎng)表里面的“sample_rate”端口只用了3bit來(lái)表示;第6個(gè)字節(jié)跟0進(jìn)行比較,如果大于0就將就把XTR111芯片的OUT-EN引腳拉高,也就是關(guān)斷了恒流源輸出,如果小于0,則開(kāi)啟恒流源輸出功能;將第7和第8個(gè)字節(jié)進(jìn)行拼接之后賦值給DAC7512E作為恒流源的電壓輸出值,因?yàn)镈AC7512E的位寬是12bit,所以我們直接用兩個(gè)U8拼接變成U16可以完全覆蓋12bit的數(shù)值范圍(0~4095); 最后4個(gè)字節(jié)是預(yù)留的,用戶可以根據(jù)實(shí)際情況下發(fā)更多的參數(shù)或者指令給FPGA,只要改下對(duì)應(yīng)的數(shù)據(jù)長(zhǎng)度就行了,這里我們就不再贅述了。

? ? ? ??注意:如果用戶想節(jié)約FPGA上的資源,也可以將布爾開(kāi)關(guān)命令和數(shù)值指令按照bit進(jìn)行組合拼接,然后下位機(jī)進(jìn)行拆分賦值,這樣會(huì)增加下位機(jī)FPGA的編程復(fù)雜度;同時(shí)需要提醒用戶的是,在前面我們封裝的Xillybus IP里面專門(mén)給用戶講解過(guò)PCIe Memory的用法,其實(shí)關(guān)于這個(gè)mem的讀寫(xiě),完全可以用我們這里介紹的FIFO數(shù)據(jù)解析線程來(lái)等效實(shí)現(xiàn),感興趣的用戶可以自己嘗試一下。在貫穿本書(shū)的通信協(xié)議里面,除了PCIe外,還有串口、USB、網(wǎng)口等等,如果想實(shí)現(xiàn)類似的mem效果,其實(shí)用我們介紹的FIFO數(shù)據(jù)接口拼接解析線程是最好不過(guò)的,因?yàn)檫@個(gè)框架更加統(tǒng)一方便,不受限于具體的總線通信,大小通吃,只要用戶能夠理解其中的含義即可,關(guān)于這點(diǎn),我們?cè)缭赨DP千兆以太網(wǎng)通信實(shí)驗(yàn)里面的最后一個(gè)衍生內(nèi)容里面給大家講解過(guò)了。
?? ? ? ? 4)將前面的ADS127L01數(shù)據(jù)采集線程、DAC7512E恒流源輸出線程、并轉(zhuǎn)串線程、FPGA TCP通信線程(上行+下行)、下發(fā)的數(shù)據(jù)解析線程等6個(gè)線程(循環(huán))放在一起,就形成了一個(gè)完整的基于LabVIEW TCP Client Socket CLIP實(shí)現(xiàn)的FPGA TCP下位機(jī)動(dòng)態(tài)信號(hào)采集DSA程序,如圖119-69所示。

????? ?4、LabVIEW FPGA VI仿真
?????? ?本節(jié)實(shí)驗(yàn)涉及的是FPGA TCP網(wǎng)絡(luò)通信,無(wú)法在計(jì)算機(jī)上進(jìn)行虛擬,所以這里的功能性仿真可以跳過(guò),直接將LabVIEW FPGA TCP主VI程序編譯下載到FPGA芯片里面運(yùn)行,然后再利用上位機(jī)通過(guò)下發(fā)指令和參數(shù)來(lái)測(cè)試通過(guò)網(wǎng)線連到上位機(jī)PC端(服務(wù)器)的黑金AX7103開(kāi)發(fā)板(客戶端)上的TCP網(wǎng)口能否正常發(fā)送和接收數(shù)據(jù)包,并在上位機(jī)前面板上把采集到的波形數(shù)據(jù)顯示出來(lái)。
????? ?5、LabVIEW FPGA VI編譯下載
?????? ?1)直接點(diǎn)擊FPGA主VI“實(shí)驗(yàn)119-TCP客戶端+24位動(dòng)態(tài)信號(hào)采集卡(ADS127L01)-FPGA.vi”上方工具欄里面的“運(yùn)行”箭頭按鈕,保存VI之后,彈出Xilinx 編譯服務(wù)器選擇對(duì)話框,如圖119-70所示。選擇本地編譯器,然后單擊“取消”按鈕,此時(shí),在FPGA項(xiàng)目下的程序生成規(guī)范里面就會(huì)多出來(lái)一個(gè)與TCP通信VI同名的程序生成規(guī)范(實(shí)驗(yàn)119-TCP客戶端+24位動(dòng)態(tài)信號(hào)采集卡(ADS127L01)-FPGA),如圖119-71所示。雙擊打開(kāi)這個(gè)程序生成規(guī)范屬性配置頁(yè)面,勾選“加載至FPGA時(shí)運(yùn)行”復(fù)選框,最后點(diǎn)擊“生成”或者“確定”按鈕,如圖119-72所示。如果點(diǎn)擊的是“確定”按鈕,那么需要重新運(yùn)行一下VI即可再次啟動(dòng)Xilinx Vivado 2017.2編譯器,進(jìn)入編譯狀態(tài)窗口,如圖119-73所示。




? ? ? ? 2)提醒:編譯很順利,因?yàn)槲覀円呀?jīng)突破了7系列FPGA的編譯、下載和在線前面板交互式運(yùn)行和調(diào)試功能。等待FPGA VI程序編譯完成后,就可以看到最終消耗的FPGA硬件資源,如圖119-74所示。由于我們默認(rèn)將TCP網(wǎng)絡(luò)通信IP核也封裝到這個(gè)FPGA終端下面,所以編譯消耗的資源顯的非常多,實(shí)際上,純TCP協(xié)議棧消耗的FPGA資源很少,不到10%。

? ? ? ? 3)當(dāng)上面編譯完成后,會(huì)彈出一個(gè)“正在準(zhǔn)備交互式執(zhí)行”對(duì)話框,如圖119-75所示,這個(gè)想必用過(guò)NI或者看過(guò)我們Pro1開(kāi)發(fā)寶典的用戶很熟悉,正是LabVIEW FPGA啟動(dòng)在線前面板交互式運(yùn)行和調(diào)試功能的提示框;如果大家還沒(méi)有將Xilinx JTAG下載器和FPGA開(kāi)發(fā)板接到這臺(tái)電腦或者接的不是Xilinx JTAG下載器而是Digilent HS系列下載器,等一會(huì)會(huì)彈出一個(gè)超時(shí)錯(cuò)誤對(duì)話框,提醒用戶找不到下載通信線纜,也就是說(shuō)主機(jī)找不到Xilinx JTAG下載器,如圖119-76所示。


? ? ? ??重大更新:很多用戶關(guān)心的是Vivado編譯器編譯出來(lái)的原始bit文件,而不是NI的lvbitx文件,因?yàn)樵糉PGA bit文件更靈活更方便,將這個(gè)原始的bit文件發(fā)給任何人都可以通過(guò)任何手段下載到FPGA里面運(yùn)行;雖然上面我們沒(méi)有連接下載器和FPGA板子到電腦上導(dǎo)致下載超時(shí),但是LabVIEW項(xiàng)目瀏覽器所在路徑下的“FPGA Bitfiles”文件夾里面,依然會(huì)自動(dòng)生成一個(gè)同名的原始bit文件,如圖119-77所示。

? ? ? ? 注意1:這個(gè)自動(dòng)生成原始FPGA bit文件的功能是我們?cè)诤笈_(tái)幫大家實(shí)現(xiàn)的,也就是說(shuō),用戶再也不需要像前面第5章5.3節(jié)那樣總是開(kāi)著獲取bit文件的程序才能得到原始bit文件。很明顯經(jīng)過(guò)我們重大更新后的寶典和LabVIEW My FPGA工具包更方便、更易用,體驗(yàn)效果跟NI完全一樣。
?????? ?注意2:lvbitx不是FPGA原始的bit位文件,而是NI在bit基礎(chǔ)上又封裝了一層,因此,不能通過(guò)其他軟件進(jìn)行下載。但是,lvbitx里面包含了FPGA VI前面板上的控件類型和FPGA寄存器地址等信息,所以在后續(xù)FPGA VI在線前面板交互式運(yùn)行里面會(huì)用得到lvbitx,這個(gè)也是LabVIEW后臺(tái)自動(dòng)完成下載和解析的,用戶了解一下即可。
?
????? ?6、TCP通信上位機(jī)(PC服務(wù)器端)程序編寫(xiě)
?????? ?下面我們需要編寫(xiě)一個(gè)TCP上位機(jī)(服務(wù)器端)應(yīng)用程序來(lái)測(cè)試下位機(jī)FPGA(客戶端)程序是否滿足設(shè)計(jì)需求,相當(dāng)于開(kāi)發(fā)一個(gè)TCP千兆以太網(wǎng)采集卡上位機(jī)程序。這里用戶可以直接調(diào)用LabVIEW軟件自身就有的TCP函數(shù)選板里面的VI,如圖119-78所示,不熟悉的用戶可以自行研究一下,這里不再贅述。當(dāng)然了,喜歡用C、C#、Python、QT等文本編程語(yǔ)言開(kāi)發(fā)上位機(jī)TCP服務(wù)器測(cè)試程序的話,可以上網(wǎng)搜索一下或者問(wèn)問(wèn)ChatGPT。

? ? ? ? 下面我們簡(jiǎn)單介紹一下上位機(jī)TCP服務(wù)器程序的編寫(xiě)過(guò)程。
?????? ?1)右擊項(xiàng)目瀏覽器里面的“我的電腦”,選擇新建一個(gè)“虛擬文件夾”,如圖119-79所示。
圖119-79:在“我的電腦”下面新建一個(gè)上位機(jī)虛擬文件夾
?????? ?2)然后對(duì)新建出來(lái)的虛擬文件夾重命名為“實(shí)驗(yàn)119-TCP服務(wù)器端+24位AD數(shù)據(jù)采集實(shí)驗(yàn)-上位機(jī)”,如圖119-80所示。
圖119-80:將新建的虛擬文件夾進(jìn)行重命名
?????? ?3)然后右擊上面的虛擬文件夾,選擇新建一個(gè)VI,將這個(gè)VI保存為“實(shí)驗(yàn)119-TCP服務(wù)器端+24位數(shù)據(jù)采集卡(ADS127L01)-PC.vi”,如圖119-81所示。
圖119-81:新建一個(gè)TCP上位機(jī)服務(wù)器端通信程序
?????? ?4)為了加快講解速度,這里我們直接給出TCP上位機(jī)服務(wù)器通信程序框圖,如圖119-82所示。程序框圖由兩個(gè)相互獨(dú)立的線程組成,也就是兩個(gè)while循環(huán),分別是TCP寫(xiě)線程(PC服務(wù)器下發(fā)數(shù)據(jù)給客戶端FPGA)和TCP讀線程(PC服務(wù)器讀取FPGA客戶端上傳的數(shù)據(jù))。對(duì)應(yīng)的前面板控件布局,我們也先貼出來(lái),如圖119-83所示。


? ? ? ? 下面我們來(lái)分別介紹一下這兩個(gè)線程對(duì)應(yīng)的程序框圖編寫(xiě)過(guò)程及其注意事項(xiàng)。
?????? ?5)首先,程序啟動(dòng)的時(shí)候,一般都會(huì)有一個(gè)初始化過(guò)程,這里也不例外。由于前面板上有一些按鍵和指示燈等控件,為了讓程序每次運(yùn)行的時(shí)候,都能恢復(fù)到一個(gè)默認(rèn)狀態(tài),這里利用順序結(jié)構(gòu),對(duì)需要設(shè)置的控件進(jìn)行賦值操作,如圖119-84所示。
圖119-84:TCP通信上位機(jī)前面板控件初始化代碼
?????? ?6)接下來(lái),我們看看上位機(jī)TCP寫(xiě)線程代碼是怎么實(shí)現(xiàn)的。由于下位機(jī)FPGA跑的是TCP Client客戶端程序,那么上位機(jī)的角色就是服務(wù)器;所以,我們需要從TCP函數(shù)選板里面選擇偵聽(tīng)函數(shù)“TCP listen.vi”,偵聽(tīng)來(lái)自下位機(jī)FPGA的TCP連接請(qǐng)求;這個(gè)“TCP Listen.vi”要偵聽(tīng)的下位機(jī)FPGA客戶端IP地址是192.168.1.10,端口是1024,如圖119-85所示,這兩個(gè)參數(shù)就是前面下位機(jī)FPGA VI程序里面設(shè)置的PC IP和port;同時(shí)為了防止上位機(jī)阻塞死機(jī),將TCP偵聽(tīng)超時(shí)設(shè)置為30s。
圖119-85:上位機(jī)服務(wù)器端利用“TCP Listen.vi”偵聽(tīng)來(lái)自下位機(jī)FPGA客戶端發(fā)起的連接
?????? ?7)一旦上位機(jī)TCP偵聽(tīng)成功,說(shuō)明上位機(jī)PC跟下位機(jī)FPGA成功建立起TCP網(wǎng)絡(luò)連接,同時(shí),這個(gè)“TCP Listen.vi”會(huì)返回一個(gè)非零的TCP引用句柄出來(lái),用戶可以通過(guò)這個(gè)引用實(shí)現(xiàn)TCP網(wǎng)絡(luò)數(shù)據(jù)的下發(fā)和讀取。為了人為控制下發(fā)的指令和參數(shù),可以利用case條件結(jié)構(gòu)將下行數(shù)據(jù)的發(fā)送代碼框起來(lái),如圖119-86所示。
圖119-86:TCP下行數(shù)據(jù)的發(fā)送代碼
?????? ?為了讓上位機(jī)PC能夠控制下位機(jī)FPGA里面的采樣率和信號(hào)采集的啟動(dòng)和停止,我們將上位機(jī)前面板上的數(shù)值類型的“gain”、“sample_rate”和“DAC7512_Value”輸入控件通過(guò)“強(qiáng)制類型轉(zhuǎn)換”函數(shù)變成字節(jié)數(shù)組;再把前面板上的布爾型“開(kāi)始/停止采集”、“work_mode”、“RST_P_ADS127L01”和“Source_ENA”按鈕控件轉(zhuǎn)成U8類型的0或者1;然后再把預(yù)留的一個(gè)參數(shù)“size_read_U32”控件通過(guò)“強(qiáng)制類型轉(zhuǎn)換”變成字節(jié)數(shù)組;最后將這幾類轉(zhuǎn)換后的數(shù)據(jù)進(jìn)行數(shù)組拼接(實(shí)際上就是字節(jié)數(shù)組),賦給“寫(xiě)入TCP數(shù)據(jù).vi”,如圖119-87所示。這樣就可以將上位機(jī)服務(wù)器端的數(shù)據(jù)通過(guò)TCP下發(fā)給FPGA客戶端。
圖119-87:將上位機(jī)的指令和參數(shù)轉(zhuǎn)換成字節(jié)數(shù)組后下發(fā)給FPGA
?????? ?8)下面,我們?cè)賮?lái)看看上位機(jī)PC服務(wù)器端是如何把FPGA采集上傳的數(shù)據(jù)通過(guò)TCP函數(shù)讀取出來(lái)的。為了提高TCP讀取效率或者為了方便定長(zhǎng)數(shù)據(jù)的解析,我們可以給“TCP讀取數(shù)據(jù).vi”函數(shù)設(shè)置一個(gè)長(zhǎng)度閾值,只有當(dāng)上位機(jī)PC端的TCP緩沖區(qū)里面接收到指定長(zhǎng)度的字節(jié)數(shù)之后,再把這些字節(jié)數(shù)組一次性讀取出來(lái)。因?yàn)門(mén)CP傳輸?shù)臄?shù)據(jù)都是以字節(jié)為單位,所以如果用戶希望讀取的數(shù)據(jù)位寬是字節(jié)的倍數(shù),比如本節(jié)實(shí)驗(yàn),下位機(jī)FPGA上傳的ADS127L01采集的數(shù)據(jù)是FXP<±24,24>類型的信號(hào),正好就是3個(gè)字節(jié),所以在判斷之前,我們可以將指定讀取的點(diǎn)數(shù)×3,再做比較判斷,這樣讀出來(lái)的數(shù)據(jù)正好能被8整除,通過(guò)“抽取一維數(shù)組”的方式將8個(gè)通道的波形還原出來(lái)。
?????? ?LabVIEW里面自帶的“TCP讀取數(shù)據(jù).vi”這個(gè)函數(shù)非常強(qiáng)大,它提供了4種內(nèi)在讀取模式,分別是Standard、Buffered、CRLF、Immediate這4種模式:

?????? ?這里很多用戶經(jīng)常搞不清楚這些模式的含義以及用法,這個(gè)屬于基本功問(wèn)題了。下面我們簡(jiǎn)單講解一下這4種模式。
1)Standard:標(biāo)準(zhǔn)模式,也是默認(rèn)模式,因?yàn)檫@個(gè)“TCP讀取數(shù)據(jù).vi”拖拽到LabVIEW程序框圖里面之后,這個(gè)模式參數(shù)默認(rèn)是不顯示的,如果用戶不去手動(dòng)創(chuàng)建的話,那么默認(rèn)就是第一個(gè)“標(biāo)準(zhǔn)模式”。這種模式下,如果TCP緩沖區(qū)里面接收到的字節(jié)數(shù)量少于指定讀取的長(zhǎng)度,那么該VI就是有多少讀取多少,并且產(chǎn)生超時(shí)錯(cuò)誤,雖然產(chǎn)生了超時(shí)錯(cuò)誤,但是讀出來(lái)的數(shù)據(jù)都是有效的,并不妨礙數(shù)據(jù)本身,只是我們可以通過(guò)是否超時(shí)來(lái)判斷讀取的數(shù)據(jù)長(zhǎng)度是否達(dá)到我們指定的長(zhǎng)度。這種模式內(nèi)部存在阻塞機(jī)制,直到發(fā)生超時(shí)退出為止。
2)Buffered:緩沖模式,這種模式相比于標(biāo)準(zhǔn)模式,它的優(yōu)勢(shì)更明顯,那就是當(dāng)緩沖區(qū)里面的字節(jié)數(shù)據(jù)沒(méi)有達(dá)到指定讀取的長(zhǎng)度,那么這個(gè)VI讀出來(lái)的數(shù)據(jù)是無(wú)效的,TCP數(shù)據(jù)依然很好的保留在TCP緩沖區(qū)里面,通過(guò)超時(shí)錯(cuò)誤告知用戶,當(dāng)前返回的數(shù)據(jù)可以直接忽略。
3)CRLF:回車(chē)換行模式,這個(gè)模式帶有一定的協(xié)議分段功能在里面,特別適合不定長(zhǎng)數(shù)據(jù)的讀取和解析,比如下位機(jī)每次發(fā)送的TCP數(shù)據(jù)有效內(nèi)容長(zhǎng)度不固定,那么可以在TCP發(fā)送每包有效數(shù)據(jù)的尾巴加上CR(回車(chē))LF(換行)結(jié)束符,這樣,TCP對(duì)等端只需要將讀取長(zhǎng)度設(shè)置為一個(gè)超級(jí)大的數(shù),該函數(shù)內(nèi)部自己輪詢TCP緩沖區(qū)收到的字節(jié)數(shù)據(jù),一旦發(fā)現(xiàn)有CRLF結(jié)束符,立刻輸出當(dāng)前有效內(nèi)容,可以看出,這個(gè)模式非常適合不定長(zhǎng)數(shù)據(jù)和自定義協(xié)議解析等應(yīng)用。
4)Immediate:立即模式,這個(gè)模式是所有模式里面讀取效率最高的,如果用戶將超時(shí)設(shè)置為0的話,那么實(shí)際效果就是,每次執(zhí)行這個(gè)TCP讀取VI的話,緩沖區(qū)有多少字節(jié)數(shù)據(jù),就會(huì)立刻讀取出來(lái),不管有沒(méi)有超時(shí)產(chǎn)生,讀出來(lái)的數(shù)據(jù)都是有效的,這個(gè)模式配上LabVIEW里面自帶的隊(duì)列函數(shù),可以快速構(gòu)建出來(lái)一個(gè)“生產(chǎn)者-消費(fèi)者”模式,將TCP報(bào)文通過(guò)隊(duì)列存放到計(jì)算機(jī)內(nèi)存中。
?????? ?總結(jié):如果想要實(shí)現(xiàn)上面指定長(zhǎng)度字節(jié)數(shù)據(jù)的讀取、解析和信號(hào)波形恢復(fù),應(yīng)該選擇Buffered緩沖模式最佳,這樣如果下位機(jī)FPGA采集的是一個(gè)周期性信號(hào),那么只要上位機(jī)讀取的點(diǎn)數(shù)能夠整除波形周期點(diǎn)數(shù),那么波形圖里面就不會(huì)存在左右滑動(dòng)跳動(dòng)的不穩(wěn)定效果了,因?yàn)槲覀冃枰^察一個(gè)相對(duì)穩(wěn)定的周期信號(hào),類似示波器周期信號(hào)觸發(fā)功能一樣。當(dāng)然了,如果想要測(cè)試TCP傳輸?shù)臉O限吞吐率,應(yīng)該選擇Immediate立即模式,同時(shí)還要關(guān)閉所有影響CPU效率的代碼,比如波形圖顯示。
?????? ?基于以上分析,編寫(xiě)的上位機(jī)服務(wù)器端TCP讀取程序框圖,如圖119-88所示。
圖119-88:利用Buffered緩沖模式讀取下位機(jī)FPGA發(fā)送的TCP報(bào)文數(shù)據(jù)(指定讀取長(zhǎng)度)
?????? ?9)一般情況下,如果下位機(jī)FPGA發(fā)送的TCP數(shù)據(jù)吞吐率很高,那么上位機(jī)讀取的頻率和每次讀取的字節(jié)長(zhǎng)度(size_read_U32)要滿足一定的范圍才能保證所有的數(shù)據(jù)不會(huì)丟失,如果每次讀取的字節(jié)長(zhǎng)度很短,那么需要讀取的速度就要很快,這樣不僅會(huì)極大的消耗CPU的資源,還有可能會(huì)造成數(shù)據(jù)溢出丟失;關(guān)于這個(gè)數(shù)值取多少合適,用戶可以根據(jù)實(shí)際情況做實(shí)驗(yàn)決定。
?????? ?10)“TCP讀取數(shù)據(jù).vi”函數(shù)讀取返回的數(shù)據(jù)類型是字節(jié)數(shù)組,如果從FPGA里面接收到的數(shù)據(jù)物理意義并不是字節(jié)類型,那我們還需要借助“強(qiáng)制類型轉(zhuǎn)換”函數(shù)將原始的字節(jié)數(shù)組轉(zhuǎn)換真實(shí)的數(shù)據(jù)。本節(jié)實(shí)驗(yàn)下位機(jī)FPGA采集的ADS127L01數(shù)據(jù)類型比較特殊,需要把接收到的字符串先利用“強(qiáng)制類型轉(zhuǎn)換”函數(shù)轉(zhuǎn)換為無(wú)符號(hào)U8字節(jié)數(shù)組,再利用“抽取一維數(shù)組”函數(shù)把ADS127L01相鄰的3個(gè)U8提取出來(lái),然后利用for循環(huán)將相鄰3個(gè)點(diǎn)變成布爾數(shù)組,再進(jìn)行拼接變成24位布爾數(shù)組,接著利用“布爾數(shù)組至數(shù)值轉(zhuǎn)換”函數(shù)將這個(gè)24位的布爾數(shù)組變成有符號(hào)定點(diǎn)數(shù)FXP<±24,24>,最后根據(jù)利用公式節(jié)點(diǎn)把采集的原始數(shù)據(jù)轉(zhuǎn)換成單精度浮點(diǎn)數(shù),單位就是電壓V。其中,公式里面的2.5是基準(zhǔn)電壓,3是AMP衰減電路的比例系數(shù)。如圖119-89所示。
圖119-89:利用“強(qiáng)制類型轉(zhuǎn)換”VI轉(zhuǎn)成U8數(shù)組再利用“抽取一維數(shù)組”和公式節(jié)點(diǎn)將原始AD數(shù)據(jù)轉(zhuǎn)換成浮點(diǎn)數(shù)
?????? ?提醒:在對(duì)24位ADS127L01進(jìn)行轉(zhuǎn)換的時(shí)候,切記,ADS127L01轉(zhuǎn)換出來(lái)的24位數(shù)據(jù)是帶符號(hào)的,也就是I24(-8388608~8388607),假設(shè)ADS127L01芯片電壓輸入量程設(shè)置的是±10V,那么-8388608代表-10V,0代表0V,8388607代表+10V。
?????? ?11)當(dāng)ADS127L01采集到信號(hào)之后,我們可以在前面板上放置1個(gè)波形圖顯示控件,將FPGA客戶端發(fā)送上來(lái)的數(shù)據(jù)以波形的方式呈現(xiàn)出來(lái),但是考慮到實(shí)際應(yīng)用中,如果波形圖控件里面每次顯示的點(diǎn)數(shù)過(guò)大的話,會(huì)導(dǎo)致電腦CPU、內(nèi)存和顯卡壓力過(guò)大,CPU運(yùn)行速度會(huì)降低,這樣不利于TCP快速讀取數(shù)據(jù),因此,我們?cè)赥CP-讀線程里面加了兩個(gè)控制按鈕,可以人為控制讀取出來(lái)的波形是否進(jìn)行拼接以及是否開(kāi)啟波形顯示功能,如圖119-90所示。關(guān)于這幾個(gè)功能的演示,我們?cè)诤罄m(xù)的實(shí)驗(yàn)演示環(huán)節(jié)里面再給用戶做詳細(xì)的介紹。
圖119-90:是否開(kāi)啟波形顯示和波形首尾拼接功能
?????? ?12)當(dāng)用戶需要將這個(gè)程序停止運(yùn)行的時(shí)候,可以通過(guò)TCP發(fā)送停止指令給下位機(jī)FPGA,讓FPGA內(nèi)部的TCP Client發(fā)送線程進(jìn)入case為假的分支,也就是停止給上位機(jī)服務(wù)器發(fā)送數(shù)據(jù)了,同時(shí)下位機(jī)FPGA里面的“FIFO_TCP_Send_U8”也會(huì)自動(dòng)清空,這樣下次再運(yùn)行這個(gè)上位機(jī)程序的時(shí)候,采集的又是當(dāng)前最新的數(shù)據(jù)了;最后關(guān)閉上位機(jī)TCP引用句柄,防止出現(xiàn)內(nèi)存泄漏,如圖119-91所示。
圖119-91:上位機(jī)程序停止之前給FPGA下發(fā)停止指令再關(guān)閉TCP網(wǎng)絡(luò)引用句柄
?????? ?注意:細(xì)心的用戶發(fā)現(xiàn)了我們的“TCP-讀線程”while循環(huán)里面有一個(gè)禁用結(jié)構(gòu),里面是ms倍數(shù)延時(shí),如圖119-92。這個(gè)延時(shí)的作用是什么呢?這個(gè)ms倍數(shù)延時(shí)函數(shù)主要是用來(lái)控制我們的while循環(huán)讀取頻率,可以釋放CPU資源。假設(shè),當(dāng)FPGA采樣率很低的時(shí)候,也就意味著上位機(jī)PC端接收到的數(shù)據(jù)吞吐率低,那么我們就沒(méi)有必要讓“TCP-讀線程”跑的太快,這樣會(huì)極大消耗CPU資源,如果主程序里面還有其他的事情要處理,那么CPU會(huì)顯得吃力;如果下位機(jī)FPGA采樣率很高的時(shí)候,為了避免TCP緩沖區(qū)溢出,我們需要以最快的速度將里面的數(shù)據(jù)全部讀取出來(lái),這時(shí)我們可以給ms倍數(shù)延時(shí)函數(shù)賦值0或者直接將這延時(shí)函數(shù)禁用掉,這樣“TCP-讀線程”這個(gè)while循環(huán)就會(huì)全速運(yùn)行。
圖119-92:控制TCP讀取速度的ms倍數(shù)延時(shí)函數(shù)
?????? ?13)最后,再來(lái)介紹一下這個(gè)上位機(jī)PC TCP服務(wù)器端通信程序前面板上的控件有哪些功能和注意事項(xiàng),完整的上位機(jī)程序前面板,如圖119-93所示。
圖119-93:上位機(jī)PC TCP服務(wù)器端通信程序前面板
?????? ?上位機(jī)程序運(yùn)行之后,一旦偵聽(tīng)到下位機(jī)FPGA客戶端發(fā)來(lái)的連接請(qǐng)求后,成功建立連接之后,前面板上的“Running_W”和“Running_R”兩個(gè)顯示控制里面的數(shù)值就會(huì)快速遞增;然后用戶可以通過(guò)“sample_rate”控件里面的數(shù)值參數(shù)控制下位機(jī)FPGA里面的采樣率,比如當(dāng)我們?cè)O(shè)置為3,實(shí)際傳遞下去控制的是FPGA前面板上的采樣率控件里面的512KS/s,將24位的ADS127L01數(shù)據(jù)換算成字節(jié)為單位的采樣率的話,也就是1.5MByte/s,這個(gè)采樣率其實(shí)并不高;所以我們可以將前面板上的“開(kāi)始/停止采集”和“顯示波形?”兩個(gè)按鈕全部點(diǎn)亮,前者是用來(lái)通知FPGA啟動(dòng)采集發(fā)送數(shù)據(jù),后者是把上位機(jī)接收到的波形數(shù)據(jù)在波形圖控件中顯示出來(lái);然后可以在“size_read_U32”控件里面輸入一個(gè)點(diǎn)數(shù),比如512000,也就是512K個(gè)FXP<±24,24>點(diǎn);最后,當(dāng)我們點(diǎn)擊一下“Send”按鈕之后,上位機(jī)PC就會(huì)把指令和參數(shù)通過(guò)TCP下發(fā)給FPGA,然后就能看到波形圖里面出現(xiàn)一個(gè)長(zhǎng)度為512K個(gè)點(diǎn)的信號(hào)。整個(gè)過(guò)程可以很好地反應(yīng)下位機(jī)FPGA客戶端采集數(shù)據(jù)發(fā)送到PC服務(wù)器端的整個(gè)動(dòng)態(tài)展示,更多現(xiàn)象我們?cè)诤罄m(xù)的實(shí)驗(yàn)演示環(huán)節(jié)再給用戶講解。
?????? ?需要注意的是:雖然本節(jié)實(shí)驗(yàn)中用到的ADS127L01產(chǎn)生的數(shù)據(jù)量,對(duì)于我們封裝的ComBlock TCP IP核來(lái)說(shuō),完全小case;不過(guò)對(duì)于性能很差的電腦,建議用戶最好把前面板上的“顯示波形?”熄滅關(guān)掉,這樣可以節(jié)省CPU資源,加快LabVIEW應(yīng)用程序讀取速度,減少上位機(jī)的TCP緩沖區(qū)溢出造成的數(shù)據(jù)丟失。
????? ?7、實(shí)驗(yàn)操作
?? ?7.1、準(zhǔn)備工作
?????? ?1)接好硬件設(shè)備。
?????? ?將AN706模塊(AD7606)插到黑金AX7103開(kāi)發(fā)板上的J11拓展口上面;然后利用一根CAT5+或者CAT6類網(wǎng)線,一頭接到黑金AX7103開(kāi)發(fā)板第2路網(wǎng)口里面(ETH2),另外一頭接到電腦的網(wǎng)口里面;要想實(shí)現(xiàn)FPGA VI在線下載和在線前面板交互式運(yùn)行,必須使用Xilinx JTAG下載器(不能使用任何第三方Digilent HS系列下載器,比如黑金的紅色下載器本質(zhì)上就是高仿的Digilent HS1下載器),將JTAG線纜一頭插到黑金AX7103開(kāi)發(fā)板上的JTAG下載口,USB一頭接到電腦上(注意:如果用戶使用的是不帶RJ45網(wǎng)口的超薄筆記本電腦的話,可以在網(wǎng)上買(mǎi)一個(gè)雷電轉(zhuǎn)千兆網(wǎng)口擴(kuò)展塢,相當(dāng)于給筆記本擴(kuò)展了一個(gè)RJ45千兆網(wǎng)口,這樣上位機(jī)PC(服務(wù)器)和下位機(jī)FPGA(客戶端)之間的TCP網(wǎng)絡(luò)通信實(shí)際AX7103與ADS127L01模塊實(shí)驗(yàn)就可以在一臺(tái)筆記本上完成了,更方便);此時(shí),筆記本的設(shè)備管理器里面識(shí)別出來(lái)一個(gè)Xilinx JTAG下載器設(shè)備,如圖117-94所示。關(guān)于Xilinx下載器驅(qū)動(dòng)安裝方法在前面,我們已經(jīng)給用戶介紹過(guò)了,這里不再贅述。實(shí)際AX7103與ADS127L01模塊、信號(hào)發(fā)生器、JTAG下載器和筆記本之間的接線實(shí)物圖,可參考圖119-95所示。


? ? ? ? 提醒:黑金并沒(méi)有開(kāi)發(fā)ADS127L01這個(gè)模塊,市面上能買(mǎi)到的模塊沒(méi)有做成黑金那種標(biāo)準(zhǔn)40pin的接口,所以這里需要利用杜邦線將ADS127L01模塊接到黑金AX7103開(kāi)發(fā)板的J11擴(kuò)展口里面。
?? ?7.2、手動(dòng)下載bit文件(傳統(tǒng)手動(dòng)下載方式,效率低,不推薦,跳過(guò),直接看7.3節(jié))
?
?? ?7.3、自動(dòng)下載bit文件(支持在線前面板交互式運(yùn)行和調(diào)試,效率高,更方便,推薦)
?????? ?接下來(lái),就是見(jiàn)證奇跡的時(shí)刻了,大家屏住呼吸哈
?????? ?硬件接好之后,給FPGA開(kāi)發(fā)板上電,然后再點(diǎn)擊一下編譯過(guò)的“實(shí)驗(yàn)119-TCP客戶端+24位動(dòng)態(tài)信號(hào)采集卡(ADS127L01)-FPGA.vi”FPGA VI前面板左上角的運(yùn)行箭頭,此時(shí),LabVIEW會(huì)在后臺(tái)自動(dòng)將編譯好的bit文件下載到FPGA芯片里面,幾秒之后,奇跡發(fā)生了,可以看到就像我們開(kāi)發(fā)的LabVIEW STM32工具包那樣,LabVIEW前面板成功地進(jìn)入了FPGA在線交互式運(yùn)行模式,如圖119-115所示。

FPGA VI前面板自動(dòng)進(jìn)入了在線交互式運(yùn)行
? ? ? ? 幾秒之后,可以看到上位機(jī)“控制面板\網(wǎng)絡(luò)和Internet\網(wǎng)絡(luò)連接”里面的網(wǎng)卡由斷開(kāi)狀態(tài)變成了連接狀態(tài),如圖119-116所示。說(shuō)明,上位機(jī)識(shí)別到了下位機(jī)FPGA網(wǎng)絡(luò)。

?? ?7.4、準(zhǔn)備外部信號(hào)函數(shù)發(fā)生器(產(chǎn)生標(biāo)準(zhǔn)電壓信號(hào)給ADS127L01模塊)
?????? ?將外部函數(shù)信號(hào)發(fā)生器的波形設(shè)置為Sine正弦,頻率設(shè)置為:1KHz,峰峰值設(shè)置為±2.5V,如圖119-117所示。

? ? ? ? 那么增益這個(gè)參數(shù)該怎么設(shè)置最合適呢?下面我們給用戶分析一下這個(gè)DSA模塊上面的電壓變換過(guò)程:由于分壓電路的原因,輸入的信號(hào)先除以3,再乘以增益gain才會(huì)輸入到ADS127L01芯片差分引腳上面,其中,ADS127L01芯片的參考電壓Vref是2.5V基準(zhǔn)電壓,也就是說(shuō)ADS127L01能實(shí)際能采集的輸入信號(hào)范圍是±2.5V;所以為了提高采集精度,在已知輸入信號(hào)最大峰峰值Vpp范圍的前提下,增益gain可以按照下面的公式進(jìn)行推算:
Vin/3×gain≤Vref
gain≤3×Vref/Vin≤7.5/Vin
?????? ?其中,Vref=2.5V,Vin是輸入信號(hào)峰峰值Vpp的一半。這款I(lǐng)EPE模塊上的gain有3檔可以選擇:2.02、6.6和13.2。所以當(dāng)輸入的信號(hào)Vpp是±2.5V時(shí),根據(jù)上面公式計(jì)算出來(lái)的增益gain理論值是3,所以用戶只能選擇2.02;如果外部信號(hào)Vpp是±1V,那么增益可以選擇6.6。理論上,增益越大,ADS127L01采集的效果越好。
?? ?7.5、觀察現(xiàn)象(運(yùn)行上位機(jī)TCP服務(wù)器端通信測(cè)試程序)
?????? ?1)首先,需要根據(jù)下位機(jī)FPGA Client VI里面設(shè)置的遠(yuǎn)程服務(wù)器端IP地址和端口,把對(duì)等端上位機(jī)的網(wǎng)絡(luò)地址也做相應(yīng)的設(shè)置,如圖119-118所示。這里,上位機(jī)服務(wù)器端IP是192.168.1.10,端口是1024.


? ? ? ??2)為了提高TCP的極限傳輸吞吐率,建議將上位機(jī)網(wǎng)卡里面的“傳輸緩沖區(qū)”和“接收緩沖區(qū)”深度改到最大值2048,如圖119-119所示。

? ? ? ? 3)為了測(cè)試下位機(jī)FPGA Client客戶端與上位機(jī)服務(wù)器端是否建立起網(wǎng)絡(luò)通信,最簡(jiǎn)單的辦法就是利用Windows系統(tǒng)自帶的cmd命令窗口,利用ping指令來(lái)測(cè)試下位機(jī)FPGA,比如這里,我們可以輸入ping 192.168.1.16,如圖119-120所示。可以看出,下位機(jī)FPGA對(duì)于上位機(jī)的ping指令立馬做出了回應(yīng)。提醒:如果用戶ping指令沒(méi)有反應(yīng),也可以點(diǎn)擊一下下位機(jī)FPGA VI前面板上的“reset”按鈕對(duì)TCP IP核復(fù)位一下即可。

? ? ? ? 4)為了驗(yàn)證下位機(jī)FPGA DAQ Client客戶端程序的功能是否符合前面的預(yù)期設(shè)計(jì),需要一個(gè)對(duì)等端,比如本節(jié)實(shí)驗(yàn)需要一個(gè)上位機(jī)作為服務(wù)器端來(lái)與下位機(jī)FPGA進(jìn)行網(wǎng)絡(luò)測(cè)試。這里測(cè)試用到的上位機(jī)TCP服務(wù)器端程序也是利用LabVIEW編寫(xiě)的,無(wú)論是執(zhí)行效率還是靈活性還是可閱讀性都是最強(qiáng)的。
?????? ?5)打開(kāi)運(yùn)行上位機(jī)TCP服務(wù)器端通信測(cè)試程序,位于項(xiàng)目瀏覽器“我的電腦”下面的“實(shí)驗(yàn)119-TCP服務(wù)器端+24位數(shù)據(jù)采集卡(ADS127L01)-PC.vi”,如圖119-121所示。

? ? ? ? 6)運(yùn)行上位機(jī)程序之后,可以看到下位機(jī)FPGA Client VI前面板上的兩個(gè)指示燈控件點(diǎn)亮了,說(shuō)明上位機(jī)PC服務(wù)器端偵聽(tīng)到了下位機(jī)FPGA發(fā)起的連接,并成功建立起了TCP網(wǎng)絡(luò)通信,如圖119-122所示;同時(shí),上位機(jī)VI前面板上的“Running_W”和“Running_R”顯示控件里面的數(shù)字快速增加,說(shuō)明上位機(jī)TCP讀線程和寫(xiě)線程運(yùn)行起來(lái)了。

? ? ? ? 7)運(yùn)行上位機(jī)程序之后,按下“work_mode”按鈕點(diǎn)亮,將ADS127L01設(shè)置為高分辨率工作模式;在輸入控件“gain”里面輸入0,相當(dāng)于將ADS127L01模塊的增益電路放大系數(shù)設(shè)置為2.02倍;在輸入控件“sample_rate”里面輸入0,相當(dāng)于等效的采樣率是64KS/s<=>192KB/s(ADS127L01位寬是24位);因?yàn)楸竟?jié)實(shí)驗(yàn)我們直接通過(guò)信號(hào)發(fā)生器輸出的正弦信號(hào),所以不需要恒流源激勵(lì),如果用戶外接的是IEPE無(wú)源傳感器,那么可以輸出幾個(gè)mA的電流出去,這里不需要恒流源功能,因此,可以按下“Source_ENA”按鈕點(diǎn)亮;參數(shù)設(shè)置完成后,可以按下“波形顯示?”按鈕,這樣后面就能在波形圖里面看到每次讀取的Sine信號(hào)了;再在輸入控件“size_read_U32”里面輸入每次從PC端的TCP FIFO緩沖區(qū)里面需要讀取的數(shù)據(jù)長(zhǎng)度,由于前面我們?cè)O(shè)置的采樣率不高,所以這里輸入的讀取長(zhǎng)度相對(duì)自由一些,比如我們?cè)O(shè)置512000,也就是每個(gè)通道都準(zhǔn)備讀取512K個(gè)點(diǎn),就是每次讀取1.5M個(gè)Byte;最后再按下點(diǎn)亮“開(kāi)始/停止采集”這個(gè)按鈕。
?????? ?當(dāng)一切設(shè)置就緒后,點(diǎn)擊一下前面板上的“Send”發(fā)送按鈕(這是一個(gè)觸發(fā)型的控件),每點(diǎn)擊一次,上位機(jī)(服務(wù)器端)都會(huì)把前面板上設(shè)置的這些參數(shù)轉(zhuǎn)換成字節(jié)數(shù)組通過(guò)TCP下行通道發(fā)送給下位機(jī)FPGA(客戶端),當(dāng)FPGA接收完成并解析出來(lái)指令和參數(shù)后,會(huì)立刻把采集到的Sine信號(hào)通過(guò)TCP上行通道源源不斷的發(fā)送給上位機(jī)PC。
?????? ?此時(shí)前面板上出現(xiàn)了10個(gè)周期的波形,每個(gè)周期的點(diǎn)數(shù)是512個(gè)點(diǎn),但是我們明明設(shè)置的采樣率是64KS/s,為什么采樣率變成了512KS/s,這是因?yàn)椴蓸勇屎驮鲆孢@兩個(gè)參數(shù)的更新,需要發(fā)送復(fù)位指令才可以生效,于是,我們點(diǎn)亮前面板上的“RST_P_ADS127L01”這個(gè)按鈕,然后再點(diǎn)擊一下“Send”按鈕,此時(shí),Buffer內(nèi)存池“Buffer_Valid_Length_U8[]”里面沒(méi)有數(shù)據(jù)增長(zhǎng)了,因?yàn)橄挛粰C(jī)ADS127L01處于復(fù)位狀態(tài),不會(huì)采集數(shù)據(jù),如圖119-123所示。

? ? ? ? 然后我們?cè)傧纭癛ST_P_ADS127L01”這個(gè)按鈕,再次點(diǎn)擊一下“Send”按鈕,此時(shí),大約8s之后出現(xiàn)的新波形數(shù)據(jù),如圖119-124所示。并且波形周期數(shù)變成了80個(gè),恰好證明了下位機(jī)ADS127L01的采樣率變成了64KS/s。并且,傳輸過(guò)程非常穩(wěn)定,說(shuō)明下位機(jī)FPGA通過(guò)ADS127L01采集到的所有數(shù)據(jù)沒(méi)有發(fā)生溢出或者丟失,上位機(jī)全部接收到了。

? ? ? ?實(shí)際觀察到的情況是:每隔8s,TCP緩沖區(qū)清空一次,同時(shí),波形圖里面的曲線會(huì)刷新一次,這是因?yàn)橄挛粰C(jī)FPGA的采樣率是192KB/s(64KS×3),上位機(jī)LabVIEW程序每次批量讀取1.536MB數(shù)據(jù),所以刷新周期就是8s。
?????? ?我們將波形圖里面的曲線進(jìn)行放大,比如,將橫坐標(biāo)設(shè)置為512個(gè)點(diǎn)進(jìn)行顯示,可以看到,正好有8個(gè)周期的正弦曲線在里面,因?yàn)橥獠?/strong>Sine信號(hào)頻率是1KHz,ADS127L01采樣率設(shè)置的是64KS/s,所以每個(gè)周期的采集量化點(diǎn)數(shù)就是64個(gè),因此,512個(gè)點(diǎn)就是8個(gè)周期信號(hào)。再來(lái)看看幅度對(duì)不對(duì),外部信號(hào)峰峰值是±2.5V,而ADS127L01模塊的采集范圍是正負(fù)2.5V,采集到上位機(jī)的FXP<±24,24>經(jīng)過(guò)公式轉(zhuǎn)換之后變成了±2.48V,這個(gè)分析結(jié)果正好與上面圖119-124完全匹配上了,說(shuō)明我們編寫(xiě)的下位機(jī)FPGA程序和上位機(jī)程序都是完全正確的。
?
?????? ?實(shí)際上,當(dāng)下位機(jī)FPGA接收到上位機(jī)通過(guò)TCP下發(fā)的指令和參數(shù)后,也可以在下位機(jī)FPGA Client VI前面板上看到這些控件參數(shù)自動(dòng)發(fā)生更新了,并且下位機(jī)FPGA VI前面板上的“溢出點(diǎn)數(shù)”始終為0,說(shuō)明原始的ADC FIFO沒(méi)有數(shù)據(jù)溢出,也就不存在丟點(diǎn),非常好,如圖119-125所示;同時(shí),Windows任務(wù)管理器里面顯示的網(wǎng)絡(luò)使用率是0.16%,如圖119-126所示,換算一下就是:1Gbps×0.16/100=1.6Mbps=200KB/s,符合預(yù)期。算上TCP包頭、MAC、IP地址和CRC等信息,大于有效數(shù)據(jù)的192KB/s完全合理。


? ? ? ??注意:如果用戶按下上位機(jī)VI前面板上的“拼接”按鈕,可以將TCP讀取的所有波形進(jìn)行收尾拼接相連,但是如果讓這個(gè)LabVIEW上位機(jī)程序一直運(yùn)行著,過(guò)一會(huì)會(huì)彈出一個(gè)錯(cuò)誤提示:系統(tǒng)內(nèi)存不足,請(qǐng)釋放內(nèi)存空間。這是因?yàn)槲覀冊(cè)诔绦蚩驁D里面開(kāi)啟了波形首尾拼接功能,隨著時(shí)間的延長(zhǎng),程序框圖里面的數(shù)組長(zhǎng)度和波形里面的數(shù)據(jù)量越來(lái)越大,一旦超越了LabVIEW軟件本身的承受能力,就會(huì)導(dǎo)致LabVIEW報(bào)警甚至卡死崩潰。所以,一般情況下,我們都是人為控制一下程序框圖里面的數(shù)組長(zhǎng)度以及波形控件里的數(shù)據(jù)點(diǎn)數(shù),不能太大,否則不僅會(huì)造成計(jì)算機(jī)卡頓甚至造成軟件崩潰;或者利用“生產(chǎn)者-消費(fèi)者”模式將從網(wǎng)絡(luò)緩沖區(qū)里面讀取到的TCP數(shù)據(jù)轉(zhuǎn)移到隊(duì)列里面,本質(zhì)上相當(dāng)于從網(wǎng)卡轉(zhuǎn)移到計(jì)算機(jī)內(nèi)存里面,因?yàn)橛?jì)算機(jī)內(nèi)存一般都很大,而計(jì)算機(jī)網(wǎng)絡(luò)緩沖區(qū)則很小,因此這種方式可以實(shí)現(xiàn)數(shù)據(jù)流盤(pán)和無(wú)損回放。
?
?????? ?8)下面我們來(lái)提高一下FPGA采樣率,看看會(huì)有什么情況發(fā)生:首先,將輸入控件“sample_rate”里面的0改成1,相當(dāng)于等效的采樣率提高了2倍:128KS/s<=>384MB/s(ADS127L01位寬是8位);按下“波形顯示?”按鈕,這樣后面就能在波形圖里面看到每次讀取的Sine信號(hào)了,熄滅“拼接?”按鈕;其他參數(shù)保存不變,比如,輸入控件“size_read_U32”里面還是輸入512000,也就是每個(gè)通道都準(zhǔn)備讀取512K個(gè)點(diǎn),換算成字節(jié)的話,就是每次讀取1.536M個(gè)Byte(點(diǎn)數(shù)×3);“開(kāi)始/停止采集”這個(gè)按鈕要一直點(diǎn)亮。
?????? ?當(dāng)一切設(shè)置就緒后,點(diǎn)擊一下前面板上的“Send”發(fā)送按鈕(這是一個(gè)觸發(fā)型的控件),每點(diǎn)擊一次,上位機(jī)(服務(wù)器端)都會(huì)把前面板上設(shè)置的這些參數(shù)轉(zhuǎn)換成字節(jié)數(shù)組通過(guò)TCP下行通道發(fā)送給下位機(jī)FPGA(客戶端),當(dāng)FPGA接收完成并解析出來(lái)指令和參數(shù)后,會(huì)立刻把采集到的Sine信號(hào)通過(guò)TCP上行通道源源不斷的發(fā)送給上位機(jī)PC。
?????? ?此時(shí),下位機(jī)FPGA Client VI前面板上的“sample_rate”采樣率變成了128KS/s,如圖119-127所示,說(shuō)明上位機(jī)下發(fā)的TCP參數(shù)和指令成功了,并且“溢出點(diǎn)數(shù)”始終為0,說(shuō)明下位機(jī)FPGA TCP上行通道即使384KB/s傳輸速度下,依然穩(wěn)健,沒(méi)有發(fā)生數(shù)據(jù)丟失。

? ? ? ? 同時(shí),上位機(jī)依然能夠全部接收FPGA上傳的全部波形數(shù)據(jù),即使下位機(jī)FPGA里面的采樣率提高到了128KS/s,下位機(jī)FPGA實(shí)際采集到的所有Sine正弦信號(hào)依然沒(méi)有發(fā)生溢出或者丟失,上位機(jī)全部接收到了,如圖119-128所示。

? ? ? ??注意:修改后的采樣率并沒(méi)有生效,用戶需要像前面那樣,先發(fā)送一次ADS127L01復(fù)位指令然后再進(jìn)行采集就對(duì)了,切記?。?!
?????? ?上位機(jī)前面板上的波形圖經(jīng)過(guò)4s刷新一次,這是因?yàn)橄挛粰C(jī)FPGA的采樣率是128KB/s,上位機(jī)LabVIEW程序每次批量讀取1.536MB數(shù)據(jù),所以刷新周期就是4s,相當(dāng)于0.25Hz的刷新率;波形圖里面的Sine信號(hào)基本上處于不變狀態(tài),這是因?yàn)锳DS127L01采樣率跟外部信號(hào)的頻率整除關(guān)系,用戶可以嘗試改變一下外部Sine信號(hào)的頻率或者幅度就能看到上位機(jī)Sine曲線明顯變化了。
?????? ?我們將波形圖里面的曲線進(jìn)行放大,比如,將橫坐標(biāo)設(shè)置為1024個(gè)點(diǎn)進(jìn)行顯示,可以看到,正好有8個(gè)周期的正弦曲線在里面,因?yàn)橥獠?/strong>Sine信號(hào)頻率是1KHz,ADS127L01采樣率設(shè)置的是128KS/s,所以每個(gè)周期的采集量化點(diǎn)數(shù)就是128個(gè),因此,1024個(gè)點(diǎn)就是8個(gè)周期信號(hào)。
?????? ?此時(shí),可以看到當(dāng)前時(shí)刻Windows任務(wù)管理器的以太網(wǎng)傳輸速度,網(wǎng)絡(luò)吞吐率變成了0.32%,如圖119-129所示,換算一下就是:1Gbps×0.32/100=3.2Mbps=400KB/s。算上TCP包頭、MAC、IP地址和CRC等信息,大于有效數(shù)據(jù)的384KB/s完全合理。

? ? ? ? 9)下面我們進(jìn)一步提高FPGA采樣率,看看會(huì)有什么情況發(fā)生:先將輸入控件“sample_rate”里面的1改成3,相當(dāng)于等效的采樣率提高了4倍:512KS/s<=>1.5MB/s(ADS127L01位寬是24位FXP<±24,24>);其他保持不變,比如,“波形顯示?”按鈕處于點(diǎn)亮狀態(tài),這樣后面就能在波形圖里面看到每次讀取的正弦信號(hào)了;“拼接?”按鈕依然設(shè)置為熄滅狀態(tài),防止內(nèi)存溢出;輸入控件“size_read_U32”里面的512000,也就是1.536M個(gè)點(diǎn)保持不變,換算成字節(jié)的話,就是每次讀取1.536M個(gè)Byte(點(diǎn)數(shù)×3);“開(kāi)始/停止采集”這個(gè)按鈕要一直點(diǎn)亮。注意:修改后的采樣率并沒(méi)有生效,用戶需要像前面那樣,先發(fā)送一次ADS127L01復(fù)位指令然后再進(jìn)行采集就對(duì)了,切記?。?!
?????? ?設(shè)置完成后,再點(diǎn)擊一下前面板上的“Send”發(fā)送按鈕(這是一個(gè)觸發(fā)型的控件),每點(diǎn)擊一次,上位機(jī)(服務(wù)器端)都會(huì)把前面板上設(shè)置的這些參數(shù)轉(zhuǎn)換成字節(jié)數(shù)組通過(guò)TCP下行通道發(fā)送給下位機(jī)FPGA(客戶端),當(dāng)FPGA接收完成并解析出來(lái)指令和參數(shù)后,會(huì)立刻把采集到的Sine信號(hào)通過(guò)TCP上行通道源源不斷的發(fā)送給上位機(jī)PC。
?????? ?此時(shí),下位機(jī)FPGA Client VI前面板上的“sample_rate”分頻系數(shù)變成了1,如圖119-130所示,說(shuō)明上位機(jī)下發(fā)的TCP參數(shù)和指令成功了,并且“溢出點(diǎn)數(shù)”保持為0,說(shuō)明下位機(jī)FPGA TCP上行通道即使1.536MB/s傳輸速度下,依然穩(wěn)健,沒(méi)有發(fā)生數(shù)據(jù)丟失。

? ? ? ? 通過(guò)觀察“溢出點(diǎn)數(shù)”控件數(shù)值一直保持為0,說(shuō)明即使下位機(jī)FPGA里面的ADS127L01采樣率提高到了512KS/s,F(xiàn)PGA采集的信號(hào)數(shù)據(jù)沒(méi)有溢出和丟失;上位機(jī)讀到的Sine信號(hào)依然是連續(xù)的,如圖119-131所示。這是因?yàn)槲覀兎庋b的TCP Client傳輸帶寬吞吐率最大是95MB/s,加上上位機(jī)沒(méi)有什么復(fù)雜的解析和算法,能及時(shí)讀走TCP FIFO緩沖區(qū)里面的數(shù)據(jù),所以就沒(méi)有產(chǎn)生數(shù)據(jù)溢出或者丟失。

? ? ? ??我們將波形圖里面的曲線進(jìn)行放大,比如,將橫坐標(biāo)設(shè)置為5120個(gè)點(diǎn)進(jìn)行顯示,可以看到,正好有10個(gè)周期的正弦曲線在里面,因?yàn)橥獠?/strong>Sine信號(hào)頻率是1KHz,ADS127L01采樣率設(shè)置的是512KS/s,所以每個(gè)周期的采集量化點(diǎn)數(shù)就是512個(gè),因此,5120個(gè)點(diǎn)就是10個(gè)周期信號(hào)。幅度沒(méi)有變化,峰峰值依然是±2.5V。
?????? ?此時(shí),網(wǎng)絡(luò)吞吐率變成了1.3%,如圖119-132所示,換算一下就是:1Gbps×1.3/100=13Mbps=1.625MB/s。算上TCP包頭、MAC、IP地址和CRC等信息,大于有效數(shù)據(jù)的1.536MB/s完全合理。

? ? ? ? 10)當(dāng)然,感興趣的用戶,還可以將外部信號(hào)源輸出的Sine信號(hào)峰峰值變小,然后嘗試加大增益系數(shù),看看采集到的波形是否存在失真。
?? ?7.6、實(shí)驗(yàn)分析(至關(guān)重要)
?????? ?1)本節(jié)實(shí)驗(yàn)因?yàn)橄挛粰C(jī)FPGA的采樣率不高,遠(yuǎn)遠(yuǎn)小于我們封裝的純FPGA TCP協(xié)議棧的極限帶寬,加上上位機(jī)沒(méi)有什么復(fù)雜的算法,所以即使把采樣率提到最大,依然不會(huì)溢出或者丟點(diǎn)。
?????? ?2)如果某些用戶的電腦性能一般,可以將上位機(jī)PC程序前面板上的“波形顯示”功能關(guān)閉掉,這樣可以進(jìn)一步提高上位機(jī)的TCP讀取效率,以保證下位機(jī)FPGA Client ADC采集的數(shù)據(jù)不會(huì)溢出丟失。
?????? ?3)重要結(jié)論:只要上位機(jī)TCP讀線程足夠快,就不會(huì)發(fā)生下位機(jī)FPGA FIFO溢出,所有采集的數(shù)據(jù)都可以通過(guò)TCP網(wǎng)絡(luò)傳輸?shù)接?jì)算機(jī)內(nèi)存里面來(lái);本節(jié)實(shí)驗(yàn)我們測(cè)試的24位ADS127L01芯片最大采樣率512KS/s,換算成小bit,也就是24/8×512K×8bps =12.288Mbps,遠(yuǎn)小于我們封裝的FPGA TCP IP核底層協(xié)議支持的800Mbps吞吐率。
?????? ?4)有些細(xì)心的用戶發(fā)現(xiàn)了,如果上位機(jī)每次讀取長(zhǎng)度不是采樣率與實(shí)際信號(hào)的整數(shù)倍時(shí),上位機(jī)波形圖里面的鋸齒波就會(huì)出現(xiàn)左右滑動(dòng),而不是一個(gè)穩(wěn)定狀態(tài),這個(gè)跟示波器原理類似,上位機(jī)要想穩(wěn)定的顯示出來(lái),每次從TCP網(wǎng)絡(luò)緩沖區(qū)里面讀取的點(diǎn)數(shù)就需要滿足整除。
?????? ?5)一定要把上位機(jī)影響CPU和網(wǎng)絡(luò)性能的軟件全部關(guān)閉,特別是todesk、teamview、向日葵等。
????? ?8、手動(dòng)固化FPGA VI程序(傳統(tǒng)手動(dòng)固化方式,效率低,不推薦,跳過(guò),直接看第9節(jié))
????? ?9、自動(dòng)固化FPGA VI程序(右擊VI直接自動(dòng)下載固化,效率高,更方便,推薦)
?????? ?當(dāng)我們借助LabVIEW FPGA強(qiáng)大的在線交互式運(yùn)行前面板調(diào)試完FPGA VI程序后,就可以將這個(gè)FPGA VI進(jìn)行批量部署了,也就是把編譯出來(lái)的FPGA原始bit文件轉(zhuǎn)成mcs或者bin文件固化到FPGA開(kāi)發(fā)板上的Flash芯片里面。
?????? ?前面第8節(jié)我們向大家介紹了可以通過(guò)Vivado手動(dòng)將FPGA bit文件固化到Flash芯片里面,但是那個(gè)方法過(guò)于復(fù)雜,操作起來(lái)非常不方便!感興趣的用戶可以自行了解一下即可,無(wú)須深入學(xué)習(xí)第8節(jié),除非是一種特殊的情況,那就是你設(shè)計(jì)的FPGA產(chǎn)品賣(mài)給了你的用戶,當(dāng)你的FPGA bit文件升級(jí)了,你把最新的bit文件發(fā)給遠(yuǎn)在其他城市的客戶,需要將這個(gè)bit文件重新固化到你的FPGA板子里面去,但是你的客戶又不懂LabVIEW,此時(shí),你可以教他如何利用Vivado進(jìn)行手動(dòng)下載和固化。
?
?????? ?為了讓我們的LabVIEW My FPGA工具包,跟NI FPGA硬件開(kāi)發(fā)有著相同的用戶體驗(yàn),我們將整個(gè)FPGA bit文件到mcs/bin文件格式的轉(zhuǎn)換、下載器速度的設(shè)置以及各種Flash芯片的選擇,全部在后臺(tái)自動(dòng)完成,極大的方便了用戶的使用!??
?????? 需要注意的是:有些廠家做的FPGA板子為了降低硬件成本,實(shí)際焊接的Flash芯片跟其提供的說(shuō)明書(shū)有時(shí)候?qū)Σ簧?,?dǎo)致固化總是不成功,此時(shí),保險(xiǎn)起見(jiàn),最好用眼睛實(shí)際觀察一下FPGA板子上Flash芯片的具體型號(hào)和廠家,這種情況時(shí)有發(fā)生!經(jīng)驗(yàn)之談、少走彎路!
?????? ?下面進(jìn)入實(shí)戰(zhàn)操作:將“實(shí)驗(yàn)119-TCP客戶端+24位動(dòng)態(tài)信號(hào)采集卡(ADS127L01)-FPGA.vi”FPGA VI固化到黑金FPGA開(kāi)發(fā)板的Flash芯片里面。
?????? ?1)首先根據(jù)黑金提供的FPGA開(kāi)發(fā)板原理圖找到上面的Flash芯片具體型號(hào),比如黑金AX7103開(kāi)發(fā)板上的Flash芯片都是N25Q128,如圖119-143所示??梢钥闯?,這款Flash容量是128Mbit,換成大B就是16MByte。

? ? ? ? 2)然后找到黑金FPGA開(kāi)發(fā)板AX7103對(duì)應(yīng)的終端模板文件所在的路徑,如圖119-144所示。到這個(gè)文件夾里面找到xdc約束文件,打開(kāi)xdc文件,發(fā)現(xiàn)里面定義了這句話:set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design],如圖119-145所示,那就意味著FPGA VI編譯生成的bit文件內(nèi)部將讀寫(xiě)位寬設(shè)置的是x4模式。也就是當(dāng)FPGA上電從Flash里面可以通過(guò)SPI x4模式并行讀取,提高了bit文件加載和啟動(dòng)速度。
? ? ? ? 通常情況下,只要FPGA板子上的Flash芯片引腳支持x4的話,建議大家在xdc約束文件加上set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design]這句話,這樣后續(xù)FPGA程序加載啟動(dòng)速度更快,體驗(yàn)更好!
?????? ?3)知道了上面的信息,我們就可以在LabVIEW FPGA VI固化頁(yè)面的下拉列表里面選擇對(duì)應(yīng)的類型即可。右擊該終端下編譯過(guò)的“實(shí)驗(yàn)119-TCP客戶端+24位動(dòng)態(tài)信號(hào)采集卡(ADS127L01)-FPGA.vi”FPGA VI名稱,選擇菜單里面的“Download Bit to Flash”,如圖119-146所示;然后在彈出來(lái)的頁(yè)面里面,F(xiàn)lash芯片型號(hào)選擇N25Q128;容量設(shè)置為16MByte;SPI數(shù)據(jù)讀寫(xiě)位寬選擇x4模式,如圖119-147所示。


? ? ? ? 4)最后,點(diǎn)擊頁(yè)面“Download”下載按鈕,出現(xiàn)一個(gè)bit文件下載進(jìn)度條,如圖119-148所示;大約等待幾十秒,會(huì)彈出Flash燒寫(xiě)成功提示框,如圖119-149所示。然后將黑金FPGA開(kāi)發(fā)板重新上電,就能看到先前我們編寫(xiě)的“實(shí)驗(yàn)119-TCP客戶端+24位動(dòng)態(tài)信號(hào)采集卡(ADS127L01)-FPGA.vi”FPGA VI程序成功的被加載和運(yùn)行了。


????? ?10、總結(jié)
?????? ?本節(jié)實(shí)驗(yàn)內(nèi)容寫(xiě)的非常細(xì)致,難度不大,因?yàn)樯婕暗胶芏嘞挛粰C(jī)FPGA TCP Client客戶端和上位機(jī)PC服務(wù)器端通信的知識(shí)點(diǎn)和內(nèi)容,用戶需要細(xì)心學(xué)習(xí)研究。在學(xué)習(xí)研究本節(jié)實(shí)驗(yàn)之前,有些用戶是跳著看的,建議大家最好先把本章前面的TCP基礎(chǔ)內(nèi)容看一遍,否則有些概念都不清楚的話,是很難真正掌握LabVIEW FPGA下的TCP網(wǎng)絡(luò)設(shè)備開(kāi)發(fā)的。
?????? ?本節(jié)實(shí)驗(yàn)重點(diǎn)需要理解和掌握純FPGA TCP總線通信過(guò)程、原理;學(xué)會(huì)我們封裝的下位機(jī)FPGA TCP Client Socket CLIP里面的讀寫(xiě)通道的調(diào)用及其注意事項(xiàng);復(fù)習(xí)前面我們學(xué)過(guò)的24位ADC芯片ADS127L01采集線程的編寫(xiě)以及DAC7512E+XTR111恒流源的基本原理;掌握控制ADS127L01采樣率的編程方法;學(xué)會(huì)接收并解析上位機(jī)下發(fā)的指令和參數(shù);熟練使用FIFO四線握手制編程方式;最后就是學(xué)習(xí)和掌握LabVIEW上位機(jī)軟件自帶的TCP函數(shù)選板里面的所有函數(shù)(VI)的功能和注意事項(xiàng),做到熟練使用。
?