最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

實(shí)驗(yàn)111-下位機(jī)FPGA TCP客戶端-可變采樣率-異步模擬ADC需要大緩存

2023-04-22 12:18 作者:神電測控  | 我要投稿

實(shí)驗(yàn)111-下位機(jī)FPGA TCP客戶端-Slope-U8-可變采樣率-異步模擬ADC需要大緩存

????? ?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ì)于高速采集、分布式測試測量和邊緣計(jì)算等領(lǐng)域,TCP網(wǎng)絡(luò)通信是必不可少的,因?yàn)閁DP無法替代TCP來完成這些應(yīng)用。

?????? ?因此,很多用戶都希望自己的FPGA芯片能夠?qū)崿F(xiàn)TCP協(xié)議棧,這樣就可以開發(fā)出來很多支持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ǔ)。

??????

?????? ?黑金設(shè)計(jì)的ARTIX7-100T FPGA開發(fā)板(AX7103)上集成了兩路千兆以太網(wǎng)PHY芯片KSZ9031,如圖111-1所示,當(dāng)然如果用戶自己做板子的話,也可以將昂貴的KSZ9031換成臺(tái)灣瑞昱的RTL8211F或者國產(chǎn)廉價(jià)的YT8511C這類完全兼容的PHY芯片。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

圖111-1:帶有兩路千兆以太網(wǎng)PHY網(wǎng)口的Aritx7 FPGA開發(fā)板(黑金AX7103)

? ? ? ? ?用戶可以直接將這個(gè)開發(fā)板通過一根CAT5+或者CAT6類網(wǎng)線接到工控機(jī)或者電腦的網(wǎng)口里面;當(dāng)然,如果用戶是超薄筆記本電腦,沒有千兆網(wǎng)口的話,也可以在網(wǎng)上買一個(gè)雷電轉(zhuǎn)千兆網(wǎng)口的擴(kuò)展塢,方便后續(xù)做實(shí)驗(yàn)。

?????? ?由于我們已經(jīng)把復(fù)雜的TCP Client通信協(xié)議封裝進(jìn)了LabVIEW FPGA下的Socket CLIP,用戶只需要根據(jù)四線握手協(xié)議來調(diào)用對(duì)應(yīng)的CLIP端口就可以了。這部分我們?cè)谇懊娴?0章已經(jīng)介紹過了。

?????? ?本節(jié)FPGA TCP Client通信實(shí)驗(yàn)重點(diǎn)向大家講解以下6個(gè)方面的內(nèi)容:

1)????? 下位機(jī)(FPGA)TCP Client客戶端通信程序開發(fā)。

2)????? 上位機(jī)(PC)服務(wù)器端通信應(yīng)用程序開發(fā)。

3)????? 下位機(jī)FPGA內(nèi)部多線程之間的數(shù)據(jù)交互與數(shù)據(jù)緩沖:FIFO。

4)????? 下位機(jī)FPGA內(nèi)部不同速率之間的匹配機(jī)制:四線握手。

5)????? 下位機(jī)FPGA TCP Client通信IP核全雙工通信的讀寫機(jī)制。

6)????? TCP Client通信數(shù)據(jù)格式和類型轉(zhuǎn)換(大小端與字節(jié)數(shù)組)(下行和上行都是大端)。

?????? ?關(guān)于下位機(jī)(FPGA)TCP Client通信程序開發(fā),指的是FPGA上的代碼編寫。譬如,用戶可以做一個(gè)基于TCP傳輸?shù)母咚俨杉ǎ瑢DC采集到的數(shù)據(jù)通過TCP Client實(shí)時(shí)發(fā)送到PC服務(wù)器上,這段代碼我們可以利用LabVIEW來開發(fā),不需要傳統(tǒng)的VHDL/Verilog,這里稱之為下位機(jī)LabVIEW FPGA編程。本節(jié)實(shí)驗(yàn)下位機(jī)FPGA程序里面我們會(huì)模擬一個(gè)斜坡信號(hào)Slope來代替實(shí)際ADC采集的數(shù)據(jù),然后發(fā)送到上位機(jī)服務(wù)器進(jìn)行顯示或者流盤。

?????? ?關(guān)于上位機(jī)(PC)服務(wù)器端的應(yīng)用程序開發(fā),指的是運(yùn)行在windows或者linux系統(tǒng)中的LabVIEW上位機(jī)程序,可以通過調(diào)用LabVIEW軟件自身就有的TCP函數(shù)選板里面的VI函數(shù)與下位機(jī)FPGA進(jìn)行TCP網(wǎng)絡(luò)數(shù)據(jù)交互。我們把上位機(jī)收發(fā)線程分成兩個(gè)獨(dú)立的while循環(huán)來處理,這樣調(diào)試起來簡單一些。當(dāng)然,如果有些用戶不會(huì)LabVIEW,也可以使用C\C++\C#\Python來調(diào)用網(wǎng)卡DLL動(dòng)態(tài)庫進(jìn)行上位機(jī)程序開發(fā)。

?????? ?關(guān)于FIFO的概念和操作,可以參考前面的“實(shí)驗(yàn)4-串口通信”,里面有詳細(xì)的介紹和演示過程。

?????? ?關(guān)于四線握手制的工作過程和原理,也可以參考前面的“實(shí)驗(yàn)4-串口通信”,這里不再贅述。

?????? ?關(guān)于TCP Client通信IP核全雙工通信機(jī)制,我們會(huì)通過兩個(gè)獨(dú)立的收發(fā)線程來演示。發(fā)送和接收可以同時(shí)并行執(zhí)行,而且是上行和下行同時(shí)全雙工工作。

?????? ?最后一個(gè)需要注意的問題是,下位機(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ù)組之間需要通過“強(qiáng)制類型轉(zhuǎn)換”函數(shù)轉(zhuǎn)換一下才能看到準(zhǔn)確的波形曲線。

?????? ?下面我們帶著大家一起,利用LabVIEW編寫1個(gè)符合標(biāo)準(zhǔn)四線握手制的TCP Client下位機(jī)FPGA客戶端程序,來模擬一個(gè)TCP千兆以太網(wǎng)采集卡,采集1路斜坡信號(hào),通過TCP網(wǎng)絡(luò)發(fā)送給上位機(jī)PC服務(wù)器,同時(shí)還能接收上位機(jī)服務(wù)器端下發(fā)的指令和參數(shù)對(duì)FPGA板卡進(jìn)行采樣率和使能采集等控制。

?????? ?2、硬件資源

?????? ?打開本書配套的光盤/云盤里面1號(hào)文件夾里面的AX7103底板原理圖,然后找到PHY網(wǎng)絡(luò)接口這部分原理圖,如圖111-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定義過了,如果用戶自己畫的板子或者網(wǎng)上買的其他家的板子上的網(wǎng)口PHY芯片引腳定義不一樣,那么照葫蘆畫瓢對(duì)應(yīng)修改一下這個(gè)FPGA終端下的xdc約束文件里面的PHY芯片引腳就可以了。

圖111-2:打開AX7103底板原理圖,找到PHY網(wǎng)絡(luò)芯片相關(guān)的4大類引腳

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


圖111-3:在AC7100核心板上找到PHY網(wǎng)絡(luò)芯片與FPGA相連的引腳名稱


?????? ?3、FPGA TCP Client下位機(jī)客戶端通信程序開發(fā)

?????? ?從本節(jié)開始,我們會(huì)帶著用戶一起利用LabVIEW開發(fā)一個(gè)FPGA TCP Client下位機(jī)應(yīng)用程序,這個(gè)程序可以下載到FPGA芯片里面運(yùn)行,為了更加全面形象的展示TCP網(wǎng)絡(luò)通信的魅力,我們模擬一個(gè)TCP高速數(shù)據(jù)采集卡,將ADC采集到的Slope斜坡信號(hào)通過8位位寬的TCP Client上行通道發(fā)送到上位機(jī)進(jìn)行顯示,上位機(jī)通過8位位寬的下行通道下發(fā)不同的指令參數(shù)來控制FPGA開始采集、停止采集和調(diào)整采集頻率。以此向大家展示下位機(jī)FPGA(客戶端)與上位機(jī)PC(服務(wù)器)之間通過TCP網(wǎng)絡(luò)進(jìn)行雙向高速通信的過程。

?? ?3.1、LabVIEW FPGA項(xiàng)目創(chuàng)建

?????? ?1)啟動(dòng)LabVIEW 2019 SP1軟件,雖然我們可以直接打開前面實(shí)驗(yàn)里面已經(jīng)創(chuàng)建好的“My_FPGA_Starter_Board_Artix7_AX7103.lvproj”這個(gè)項(xiàng)目,但是由于我們開發(fā)的例程太多了,如果全部放在一個(gè)lvprog項(xiàng)目下進(jìn)行管理的話,每次打開這個(gè)項(xiàng)目的時(shí)候,加載需要很長時(shí)間,同時(shí)也會(huì)占用很多計(jì)算機(jī)內(nèi)存,為此,從本章開始,我們重新新建一個(gè)新的LabVIEW項(xiàng)目來開發(fā)。用戶可以點(diǎn)擊左上角的“文件>>新建(N)”或者直接點(diǎn)擊“文件”下方的“創(chuàng)建項(xiàng)目”選項(xiàng)。如圖111-4所示。點(diǎn)擊“確定”按鈕后,將新建出來的項(xiàng)目保存一下,命名為“My_FPGA_Starter_Board_Artix7_AX7103_TCP_Client.lvproj”,如圖111-5所示。

圖111-4:右擊左上角“文件”選擇“新建(N)”找到空白項(xiàng)目
圖111-5:新建一個(gè)空白的LabVIEW項(xiàng)目瀏覽器

? ? ? ??由于本章我們引入了TCP網(wǎng)絡(luò)通信,之前創(chuàng)建的FPGA終端里面沒有添加TCP Client Socket CLIP,所以,我們需要先右擊“我的電腦”選擇新建“終端和設(shè)備”,如圖111-6所示;然后再在彈出來的FPGA終端選擇列表里面,選擇一個(gè)帶TCP Client后綴的ARTIX7-100T FPGA終端設(shè)備,如圖111-7所示;點(diǎn)擊“確定”按鈕后,創(chuàng)建好的ARTIX7 TCP Client FPGA終端設(shè)備,如圖111-8所示。

圖111-6:右擊我的電腦選擇新建“終端和設(shè)備”
圖111-7:選擇一個(gè)TCP Client后綴的ARTIX7-100T FPGA終端
圖111-8:創(chuàng)建成功后的ARTIX7 FPGA TCP Client終端設(shè)備


?????? ?2)右擊FPGA終端,選擇“新建>>虛擬文件夾”,如圖111-9所示。將添加到FPGA終端里面的虛擬文件夾,重命名為“實(shí)驗(yàn)111-TCP客戶端-通信實(shí)驗(yàn)(Slope-U8-可變采樣率)-下位機(jī)”,如圖111-10所示。

圖111-9:右擊FPGA終端,新建一個(gè)虛擬文件夾
圖111-10:將虛擬文件夾重命名為“實(shí)驗(yàn)111-TCP客戶端-通信實(shí)驗(yàn)(Slope-U8-可變采樣率)-下位機(jī)”


?? ?3.2、LabVIEW FPGA EIO節(jié)點(diǎn)與FIFO創(chuàng)建

1)????? 新建EIO

?????? ?1)由于本節(jié)所有的TCP通信實(shí)驗(yàn)里面都會(huì)用到LED指示燈和按鍵KEY等EIO資源,所以,我們可以在FPGA終端上面右擊,選擇“新建>>FPGA I/O”,如圖111-11所示。然后在彈出來的I/O資源選擇對(duì)話框里面,找到AX7103 FPGA開發(fā)板上的LED和KEY對(duì)應(yīng)的管腳資源,如圖111-12所示。單擊對(duì)話框中間的“向右箭頭”按鈕,將這些引腳對(duì)應(yīng)的EIO節(jié)點(diǎn)添加到右側(cè)的FPGA資源列表里面,如圖111-13所示。

圖111-11:新建FPGA I/O EIO節(jié)點(diǎn)
圖111-12:找到AX7103開發(fā)板上LED指示燈和KEY按鍵對(duì)應(yīng)的EIO節(jié)點(diǎn)
圖111-13:將LED和KEY EIO節(jié)點(diǎn)全部添加到右側(cè)的可用列表中

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

圖111-14:LED燈和按鍵KEY的EIO節(jié)點(diǎn)被添加到FPGA終端項(xiàng)目里面

2)????? 新建FIFO

?????? ?我們可以將TCP通信IP核看成一個(gè)獨(dú)立的功能模塊,類似MCU里面的子函數(shù)或者子VI,F(xiàn)PGA程序只需要關(guān)心如何將不同類型的數(shù)據(jù)(U64、U32、U16、U8)通過TCP協(xié)議發(fā)送出去以及收到的數(shù)據(jù)怎么反饋給FPGA用戶程序,這個(gè)中間的橋梁,可以采用FIFO緩沖區(qū)來實(shí)現(xiàn)。FIFO非常適合在不同的線程之間傳遞數(shù)據(jù),而且設(shè)計(jì)合理的話,數(shù)據(jù)不會(huì)丟失或者被覆蓋。

?????? ?注意:FPGA用戶線程相當(dāng)于生產(chǎn)者,TCP收發(fā)線程相當(dāng)于消費(fèi)者,所以,二者之間有個(gè)速率匹配的問題,生產(chǎn)者發(fā)送數(shù)據(jù)的速度不能快于消費(fèi)者(其中,基于純FPGA實(shí)現(xiàn)的TCP傳輸吞吐率實(shí)測最高在95MB/s左右),否則會(huì)造成數(shù)據(jù)丟失。后面我們會(huì)根據(jù)具體程序進(jìn)一步分析二者之間的速度匹配問題。

?????? ?1)右擊FPGA終端項(xiàng)目,選擇新建1個(gè)“虛擬文件夾”,如圖111-15所示。然后重命名為“FIFO_TCP”,這個(gè)虛擬文件夾用于存放接下來我們要?jiǎng)?chuàng)建的TCP FIFO緩沖區(qū)資源,如圖111-16所示。

圖111-15:新建一個(gè)虛擬文件夾
圖111-16:將虛擬文件夾重命名為“FIFO_TCP”

? ? ? ??2)右擊虛擬文件夾“FIFO_TCP”,選擇“新建>>FIFO”,如圖111-17所示。

圖111-17:新建TCP FIFO資源

? ? ? ??3)接著會(huì)自動(dòng)彈出FIFO屬性設(shè)置對(duì)話框,如圖111-18所示。下面我們逐項(xiàng)解釋一下每個(gè)選項(xiàng)的含義。

?????? ?首先是“名稱”,這里可以隨便輸入一個(gè)能夠體現(xiàn)這個(gè)FIFO功能的名稱,比如我們要把下位機(jī)FPGA實(shí)際通過TCP發(fā)送給上位機(jī)PC的8位數(shù)據(jù)(U8\I8)存放到這個(gè)FIFO,那么可以重命名為“FIFO_TCP_Send_U8”。

?????? ?其次是“類型”,這個(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ù)長度,數(shù)值越大,編譯消耗的FPGA資源就越多。很多客戶以為這個(gè)數(shù)值設(shè)置越大越好,這樣就不容易溢出了,實(shí)則不然,如果多線程之間的FIFO讀寫速度差別很大的話,再大的FIFO對(duì)于FPGA這種高速運(yùn)行的器件來說,也是瞬間就會(huì)溢出或者覆蓋丟點(diǎn)的。所以問題的關(guān)鍵不在于FIFO深度,而是要設(shè)計(jì)一個(gè)合理的讀寫匹配機(jī)制。

?????? ?新增重大更新:對(duì)于FPGA跟上位機(jī)(Windows/Linux)之間存在握手機(jī)制的通信協(xié)議來說,比如常見的TCP和PCIe協(xié)議,F(xiàn)PGA什么時(shí)候可以往上行FIFO里面送數(shù)據(jù),是可以根據(jù)ready信號(hào)來判斷的,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萬個(gè)點(diǎn)的空間或者2萬個(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就起到了真正的作用;在我們整本書里面雖然有DDR的實(shí)驗(yàn)例程和講解,但是并沒有真正說清楚這些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ú)移植開發(fā)的純FPGA TCP Socket CLIP里面也會(huì)著重強(qiáng)調(diào)上行FIFO空間深度設(shè)置的大小合理性。

圖111-18:FIFO屬性對(duì)話框:名稱、類型與深度

? ? ? ? 然后是“實(shí)現(xiàn)”方式,里面有3個(gè)選項(xiàng)“觸發(fā)器”、“查找表”和“存儲(chǔ)器塊”,如圖111-19所示。前兩個(gè)就是FPGA最為寶貴的邏輯門資源了,一般不輕易使用,除非是用戶已經(jīng)將FPGA內(nèi)部的存儲(chǔ)器全部用完了,否則優(yōu)先使用內(nèi)部存儲(chǔ)器塊,這個(gè)存儲(chǔ)器不占用FPGA內(nèi)部的邏輯資源,不用也是浪費(fèi)。

? ? ? ? 最后是“控制邏輯”,這個(gè)特別需要注意,默認(rèn)選擇的是“終端優(yōu)化”,如圖111-20所示。最下方有個(gè)提示框,里面有段文字“根據(jù)FIFO使用的時(shí)鐘域和終端類型,應(yīng)用程序?qū)?huì)通過邏輯片架構(gòu)或內(nèi)置控制邏輯實(shí)現(xiàn)FIFO,因此當(dāng)使用“終端優(yōu)化”控制邏輯時(shí),元素的實(shí)際數(shù)量可能有所不同?!币簿褪钦fLabVIEW在生成VHDL代碼的時(shí)候,真實(shí)生成的FIFO深度并沒有達(dá)到我們前面實(shí)際設(shè)置的“請(qǐng)求元素長度”。如果用戶忽略這個(gè),可能會(huì)導(dǎo)致程序在運(yùn)行的時(shí)候,出現(xiàn)一些跟預(yù)期目標(biāo)不一致的情況。

? ? ? ? 所以建議用戶選擇“邏輯片架構(gòu)”,如圖111-21所示。這時(shí)下面會(huì)提醒用戶“元素?cái)?shù)量已強(qiáng)制轉(zhuǎn)換為FPGA可高效實(shí)現(xiàn)的值。”也就是說LabVIEW生成的FIFO深度會(huì)強(qiáng)制為我們申請(qǐng)的長度。

? ? ? ? 4接下來需要設(shè)置FIFO緩沖區(qū)單元的數(shù)據(jù)類型,在左側(cè)的“類別”列表里面選擇“數(shù)據(jù)類型”,然后在右側(cè)的下拉列表里面選擇U8無符號(hào)整形數(shù)據(jù),如圖111-22所示。因?yàn)槲覀兘o用戶封裝的LabVIEW FPGA TCP Client Socket CLIP里面,數(shù)據(jù)位寬是8位,用戶可以根據(jù)實(shí)際情況選擇U8或者I8,因?yàn)楸竟?jié)實(shí)驗(yàn)我們模擬的是一個(gè)正極性的線性斜坡信號(hào),所以這里將FIFO數(shù)據(jù)類型設(shè)置為U8正好匹配,直接通過TCP傳送到上位機(jī)PC就不用進(jìn)行正負(fù)轉(zhuǎn)換了,直接在波形顯示控件中顯示出來就可以了。當(dāng)然,如果后期用戶在實(shí)際項(xiàng)目或者產(chǎn)品中需要用到有符號(hào)8位,那就選擇I8。

? ? ? ? 5)最后點(diǎn)擊左側(cè)的“接口”,切換到仲裁選項(xiàng),如圖111-23所示。將讀取和寫入的仲裁全部設(shè)置為“從不仲裁”,這樣編譯出來的代碼執(zhí)行速度也就是時(shí)鐘約束可以提高不少,同時(shí)代碼的健壯性和確定性也比仲裁來的穩(wěn)。

? ? ? ? 6)全部設(shè)置完成后,點(diǎn)擊“確定”按鈕,即可創(chuàng)建出一個(gè)發(fā)送緩沖區(qū)“FIFO_TCP_Send_U8”,然后再以同樣的方式創(chuàng)建一個(gè)接收緩沖區(qū)“FIFO_TCP_Receive_U8”,如圖111-24所示。需要注意的是,上位機(jī)服務(wù)器端下發(fā)的指令和參數(shù)一般速度不會(huì)太快;另外,上位機(jī)發(fā)送的數(shù)據(jù)一般會(huì)經(jīng)過“強(qiáng)制類型轉(zhuǎn)換”VI變成字符串或者字節(jié)數(shù)組,這兩種類型的數(shù)據(jù)表示法默認(rèn)都是U8,所以,這里我們創(chuàng)建的FPGA接收PC下發(fā)數(shù)據(jù)的FIFO類型也要設(shè)置為U8,因此,“FIFO_TCP_Receive_U8”的數(shù)據(jù)類型要設(shè)置為U8,跟FPGA往上發(fā)送TCP數(shù)據(jù)包的Send FIFO位寬一樣。另外,由于TCP網(wǎng)絡(luò)的數(shù)據(jù)發(fā)送和讀取屬于全雙工通信,不需要通過RW讀寫指令來區(qū)分,因此,本節(jié)實(shí)驗(yàn)不需要?jiǎng)?chuàng)建RW FIFO,這一點(diǎn)與前面USB實(shí)驗(yàn)不一樣。

圖111-24:創(chuàng)建TCP發(fā)送和接收FIFO緩沖區(qū)

? ? ? ??7)開始編寫程序之前,我們先通過創(chuàng)建虛擬文件夾的方式,將接下來新建的主VI等文件分類進(jìn)行管理,便于維護(hù)和調(diào)試。這里用到的方法建議用戶在開發(fā)自己的項(xiàng)目時(shí),優(yōu)先分類管理。首先右擊虛擬文件夾“實(shí)驗(yàn)111-TCP客戶端-通信實(shí)驗(yàn)(Slope-U8-可變采樣率)-下位機(jī)”,新建1個(gè)子虛擬文件夾(Main),如圖111-25所示。這個(gè)虛擬文件夾用來存放主VI文件。

圖111-25:創(chuàng)建1個(gè)虛擬文件夾分別用來存放1類文件-便于管理


?? ?3.3、下位機(jī)FPGA TCP Client客戶端通信主VI編寫過程(基于封裝好的TCP Client CLIP)

?????? ?1)右擊“實(shí)驗(yàn)111-TCP客戶端-通信實(shí)驗(yàn)(Slope-U8-可變采樣率)-下位機(jī)”里面的子虛擬文件夾“Main”,選擇“新建>>VI”,如圖111-26所示。然后,新建一個(gè)VI,另存為“實(shí)驗(yàn)111-TCP客戶端-Slope-U8-可變采樣率-異步模擬ADC需要大緩存-FPGA.vi”,如圖111-27所示。

圖111-26:右擊虛擬文件夾Main新建一個(gè)主VI
圖111-27:新建一個(gè)下位機(jī)FPGA TCP Client通信程序VI

? ? ? ??2)為了降低FPGA TCP程序開發(fā)的難度,我們提前將ComBlock公司提供的VHDL版本的TCP Client IP核,利用NI公司的Socket CLIP技術(shù),將其封裝到FPGA終端下面,只把需要進(jìn)行握手的數(shù)據(jù)包FIFO和TCP必要的配置參數(shù)端口預(yù)留出來,如圖111-28所示。這樣做的好處在于,用戶即使完全不懂TCP協(xié)議,也能在FPGA VI里面調(diào)用CLIP編寫TCP通信程序。關(guān)于這部分內(nèi)容,前面10.4節(jié)已經(jīng)做過了詳細(xì)的講解,不記得的用戶一定要把前面10.4節(jié)溫習(xí)一遍。

圖111-28:利用NI Socket CLIP技術(shù)把ComBlock TCP Client IP核封裝到LabVIEW里面


???? ?3.3.1、編寫下位機(jī)FPGA TCP Client Send程序框圖(FPGA-->PC):上行

?????? ?1)打開主VI“實(shí)驗(yàn)111-TCP客戶端-Slope-U8-可變采樣率-異步模擬ADC需要大緩存-FPGA.vi”,切換到程序框圖,放置一個(gè)定時(shí)循環(huán)結(jié)構(gòu),然后雙擊打開這個(gè)定時(shí)循環(huán)的時(shí)鐘源配置頁面,選擇125MHz的TCP Client CLIP時(shí)鐘作為時(shí)鐘源,如圖111-29所示。這個(gè)125MHz同步時(shí)鐘驅(qū)動(dòng)的定時(shí)循環(huán),是專門用來處理用戶創(chuàng)建的FIFO跟TCP IP核內(nèi)部的FIFO之間進(jìn)行數(shù)據(jù)交互的,支持標(biāo)準(zhǔn)四線握手串聯(lián)。

圖111-29:為定時(shí)循環(huán)配置TCP Client 125MHz同步時(shí)鐘源

? ? ? ? 2)接下來,我們可以將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ù),如圖111-30所示。

圖111-30:編寫TCP Client IP核復(fù)位和參數(shù)設(shè)置程序框圖

? ? ? ? 其中,“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

?

?????? ?3)接下來,我們需要編寫一下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”,拖拽到程序框圖里面來,如圖111-31所示。這3個(gè)信號(hào)端口其實(shí)符合標(biāo)準(zhǔn)的四線握手。

圖111-31:將FPGA終端下的TCP Client CLIP上行通道3個(gè)信號(hào)端口拖拽到定時(shí)循環(huán)里面

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

圖111-32:將FPGA終端下的TCP CLIP上行通道的3個(gè)握手信號(hào)連接到用戶FIFO上

(FPGA-->PC上行數(shù)據(jù)發(fā)送程序框圖)

? ? ? ? 下面我們來講解一下上面紅色框框里面的程序框圖含義:當(dāng)TCP Client IP核內(nèi)部的FIFO沒有滿時(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ì)直接通過TCP傳輸?shù)缴衔粰C(jī)PC端了。

?????? ?提醒:為了讓上位機(jī)PC(服務(wù)器)能夠自由動(dòng)態(tài)的控制下位機(jī)FPGA(客戶端)使能采集,我們加了一個(gè)布爾型控件“開始/停止”按鈕,這個(gè)控件可以由上位機(jī)下發(fā)指令和參數(shù)進(jìn)行控制,通過取反之后跟準(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è)停止采集指令,然后將布爾控件“開始/停止”設(shè)置為“假”,取反之后為“真”,接到了用戶FIFO上面,如果此時(shí)用戶FIFO里面依然殘留了一些數(shù)據(jù),直接就讀出來,通過后面的case結(jié)構(gòu)“假”分支過濾掉了;如果此時(shí)上位機(jī)PC再下發(fā)一個(gè)開始采集指令,那么用戶FIFO里面一定是最新的數(shù)據(jù),通過TCP發(fā)送到上位機(jī)的數(shù)據(jù)也就是最新的了。利用這種巧妙的方式可以模擬一個(gè)真實(shí)的DAQ數(shù)據(jù)采集設(shè)備。

?????? ?3.3.2、編寫下位機(jī)FPGA TCP Client Receive程序框圖(PC-->FPGA):下行

?????? ?1)接下來,我們還需要編寫一個(gè)下行(PC-->FPGA)數(shù)據(jù)接收的程序框圖。由于發(fā)送的下行數(shù)據(jù)一般都是經(jīng)過“強(qiáng)制類型轉(zhuǎn)換”函數(shù)轉(zhuǎn)成了字節(jié)數(shù)組或者字符串形式,本質(zhì)上數(shù)據(jù)類型屬于U8,所以這里,我們可以使用FPGA終端下TCP_Client Data這個(gè)CLIP里面的8位下行通道來接收PC下發(fā)的字節(jié)數(shù)組。比如,本節(jié)實(shí)驗(yàn)我們使用下行通道來接收PC下發(fā)的指令和參數(shù)。

?????? ?2)首先,用戶可以將FPGA終端下行通道的2個(gè)握手信號(hào)(lv_tcp_client_rx_data_out、lv_tcp_client_rx_data_out_vld)拖拽到FPGA程序框圖里面,如圖111-33所示。

圖111-33:將FPGA終端下的TCP Client CLIP下行通道的2個(gè)信號(hào)端口拖拽到定時(shí)循環(huán)里

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

圖111-34:將FPGA終端下的TCP Client CLIP下行通道的2個(gè)握手信號(hào)連接到Receive FIFO

(PC --> FPGA下行數(shù)據(jù)接收程序框圖)

? ? ? ? 至此,關(guān)于下位機(jī)FPGA TCP Client四線握手的通信線程代碼就編寫完成了,這個(gè)線程也是最為核心的一個(gè)程序,今后,用戶可以直接拷貝這個(gè)線程到自己的程序里面,而無需從頭編寫。

?????? ?3.3.3、編寫下位機(jī)FPGA斜坡信號(hào)采集程序框圖:用戶線程

?????? ?1)現(xiàn)在我們還需要編寫一個(gè)斜坡信號(hào)或者Sine信號(hào)采集線程,來模擬一個(gè)真實(shí)的TCP DAQ數(shù)據(jù)采集卡,然后將這些實(shí)時(shí)采集的波形數(shù)據(jù)通過TCP傳輸?shù)缴衔粰C(jī)PC端進(jìn)行顯示,看看采集的數(shù)據(jù)是否正確。本節(jié)實(shí)驗(yàn)我們模擬一個(gè)簡單的8位位寬的斜坡信號(hào),后面的實(shí)驗(yàn)我們?nèi)坑肧ine信號(hào)來充當(dāng)采集的波形。不同位寬的數(shù)據(jù)會(huì)涉及到并串轉(zhuǎn)換和串并轉(zhuǎn)換的問題,這個(gè)在前面已經(jīng)重點(diǎn)提醒過了。

?????? ?2)首先,我們放置一個(gè)定時(shí)循環(huán),將定時(shí)循環(huán)時(shí)鐘源設(shè)置為50MHz,也就是20ns(50MHz的倒數(shù)),再給這個(gè)定時(shí)循環(huán)加一個(gè)計(jì)數(shù)器和分頻系數(shù)的輸入控件“Count(20nSec)”,通過軟件分頻的方式來控制ADC采樣率,當(dāng)計(jì)數(shù)達(dá)到分頻系數(shù)之后,計(jì)數(shù)器又會(huì)重新從0開始計(jì)數(shù);這樣后續(xù)就可以通過上位機(jī)PC下發(fā)參數(shù)來控制這個(gè)循環(huán)里面case結(jié)構(gòu)輪詢的速度,相當(dāng)于變相的控制了采集卡的采樣率。配置過程如圖111-35所示。注意:除了這種方式外,在后續(xù)的實(shí)驗(yàn)里面我們還可以采用普通while循環(huán)+循環(huán)定時(shí)器來代替這里的定時(shí)循環(huán),實(shí)現(xiàn)變采樣率采集效果。

圖111-35:放置一個(gè)帶計(jì)數(shù)器分頻的定時(shí)循環(huán)(時(shí)鐘源選擇50MHz衍生時(shí)鐘)

? ? ? ??需要注意的是:“普通while循環(huán)+循環(huán)定時(shí)器這種方式是沒有辦法達(dá)到最小時(shí)鐘約束的,這是因?yàn)槠胀╳hile循環(huán)里面的代碼在編譯的時(shí)候,LabVIEW會(huì)給其分配一定的冗余時(shí)間,以防止出現(xiàn)時(shí)鐘約束編譯報(bào)錯(cuò)。舉個(gè)例子,假設(shè)循環(huán)定時(shí)器單位設(shè)置為滴答,也就是5ns步進(jìn),如果循環(huán)定時(shí)器賦值1,實(shí)際上編譯完成后的普通while循環(huán)運(yùn)行速度是到不了5ns的,如果是定時(shí)循環(huán)的話,時(shí)鐘源設(shè)置為200MHz,只要編譯通過,實(shí)際下載到FPGA芯片里面bit代碼運(yùn)行的效果就是嚴(yán)格的5ns,大家切記!

?????? ?3)然后,在定時(shí)循環(huán)里面,放置一個(gè)布爾型的按鈕,和一個(gè)實(shí)體按鍵對(duì)應(yīng)的EIO節(jié)點(diǎn),二者“相或”之后,再跟上面的軟件分頻計(jì)數(shù)“≥”號(hào)相與之后連到case條件結(jié)構(gòu)上面,這樣既能通過手動(dòng)按下FPGA開發(fā)板上的實(shí)體按鍵來觸發(fā)采集也可以通過上位機(jī)PC下發(fā)開始采集指令來控制采集,實(shí)體按鍵如果替換成外部采樣脈沖信號(hào),那就實(shí)現(xiàn)了同步時(shí)鐘采集了;接下來,在case條件為“真”的分支里面放置一個(gè)8位位寬的加1計(jì)數(shù)器,通過移位寄存器的方式實(shí)現(xiàn)計(jì)數(shù)到最大值,溢出之后會(huì)自動(dòng)重新從0開始計(jì)數(shù);然后將這個(gè)計(jì)數(shù)器累加值連到上行發(fā)送數(shù)據(jù)FIFO上面(FIFO_TCP_Send_U8),最后再把這個(gè)FIFO的“超時(shí)”輸出取反之后連到第4個(gè)LED指示燈上面(LED4_D15),如果這個(gè)LED燈點(diǎn)亮,說明采集線程的速度快于TCP上行發(fā)送的速度,F(xiàn)IFO溢出,數(shù)據(jù)就會(huì)丟失,因此,必須要保證采樣率不能大于TCP上行的最大吞吐率(95MB/s)。

?????? ?需要注意的是:由于本節(jié)實(shí)驗(yàn)?zāi)M的是異步通信,也就是ADC采集線程跟TCP通信線程屬于兩個(gè)不同的時(shí)鐘域,中間隔了一層FIFO緩沖區(qū);為了方便后續(xù)分析ADC采樣率與TCP吞吐率之間的關(guān)系,我們將上行發(fā)送FIFO(FIFO_TCP_Send_U8)的超時(shí)拉出來進(jìn)行+1計(jì)數(shù),并在前面板上放置一個(gè)“溢出點(diǎn)數(shù)”顯示控件,這樣就可以直觀的判斷出當(dāng)前ADC采集的數(shù)據(jù)是否丟點(diǎn),如果因?yàn)樯衔粰C(jī)系統(tǒng)抖動(dòng)或者讀取速度慢導(dǎo)致下位機(jī)FPGA TCP發(fā)送阻塞超時(shí),那么溢出點(diǎn)數(shù)會(huì)不斷增加,只要上位機(jī)系統(tǒng)抖動(dòng)小讀取速度足夠快,理論上是不會(huì)發(fā)生溢出的,當(dāng)然,用戶做TCP極限吞吐率測試時(shí),最好把占用上位機(jī)CPU和網(wǎng)絡(luò)帶寬的應(yīng)用軟件全部關(guān)掉,特別是像todesk、teamview、向日葵這樣的軟件。

?????? ?最后,完整的用戶線程(模擬斜坡信號(hào)采集)程序框圖,如圖111-36所示。注意,在case條件為“假”的分支里面,將移位寄存器首尾相連,這樣,上位機(jī)PC端采集到的波形數(shù)據(jù)就是連續(xù)的鋸齒波。

圖111-36:編寫一個(gè)完整的FPGA斜坡信號(hào)采集線程程序框圖


?????? ?3.3.4、編寫下位機(jī)FPGA TCP Client數(shù)據(jù)解析程序框圖:下行數(shù)據(jù)解析線程

?????? ?1)為了能夠真實(shí)的模擬上位機(jī)PC(服務(wù)器)和下位機(jī)FPGA(客戶端)之間的交互運(yùn)行,我們還需要編寫一個(gè)FPGA數(shù)據(jù)解析線程,將PC下發(fā)的指令和參數(shù)正確的解析出來,然后賦值給FPGA里面相應(yīng)的控件。關(guān)于這個(gè)數(shù)據(jù)解析線程的框架,其實(shí)我們?cè)诒緯懊娴拇谕ㄐ藕颓д滓蕴W(wǎng)通信實(shí)驗(yàn)里面都有提到,不熟悉的用戶可以回顧一下前面的相關(guān)內(nèi)容。

?????? ?2)數(shù)據(jù)解析線程的整體框架,其實(shí)很簡單:就是一個(gè)普通while循環(huán),首先通過FIFO“獲取待讀取元素?cái)?shù)量”方法節(jié)點(diǎn),輪詢TCP Receive FIFO里面是否接收到指定長度的數(shù)據(jù)(比如,做定長解析),如果達(dá)到了指定長度的數(shù)據(jù),則利用for循環(huán)一次性將這些字節(jié)數(shù)組讀取出來,然后進(jìn)行拼接合并轉(zhuǎn)換,變成實(shí)際意義的參數(shù)或者指令。

?????? ?3)比如本節(jié)實(shí)驗(yàn)里面,上位機(jī)PC每次下發(fā)的指令和參數(shù)一共是9個(gè)字節(jié)數(shù)據(jù),那么我們?cè)谙挛粰C(jī)FPGA程序里面,就可以將case結(jié)構(gòu)的條件設(shè)置為9..,也就是說,只要下位機(jī)FPGA接到了至少有9個(gè)字節(jié)的數(shù)據(jù),就會(huì)進(jìn)入case里面,然后將for循環(huán)的長度也設(shè)置為9,這樣就能一次性把這9個(gè)字節(jié)數(shù)據(jù)全部讀取出來變成一個(gè)字節(jié)數(shù)組,然后再對(duì)這個(gè)一維數(shù)組進(jìn)行索引拼接合并,甚至于進(jìn)行加減乘除計(jì)算。完整的數(shù)據(jù)解析線程框圖,如圖111-37所示。通過程序框圖可以看出,我們將前面4個(gè)字節(jié)進(jìn)行拼接之后賦值給了前面的用戶線程(模擬斜坡信號(hào)采集)里面的分頻系數(shù)(Count(20nSec)),用來改變用戶線程里面的case條件輪詢速度,相當(dāng)于改變了采樣率;第5個(gè)字節(jié)跟0進(jìn)行比較,如果大于0就啟動(dòng)采集,小于等于0則停止采集,都是通過給布爾控件(開始/停止)進(jìn)行賦值實(shí)現(xiàn)的;最后4個(gè)字節(jié)是預(yù)留的,用戶可以根據(jù)實(shí)際情況下發(fā)更多的參數(shù)或者指令給FPGA,只要修改一下對(duì)應(yīng)的數(shù)據(jù)長度就行了,這里我們就不再贅述了。

圖111-37:完整的下位機(jī)FPGA TCP Client里面的數(shù)據(jù)解析線程

? ? ? ? 4)將前面的FPGA TCP Client通信線程(上行+下行)、模擬斜坡信號(hào)采集線程(用戶線程)、下發(fā)的數(shù)據(jù)解析線程這3個(gè)線程(循環(huán))放在一起,就形成了一個(gè)完整的基于LabVIEW TCP Socket CLIP實(shí)現(xiàn)的下位機(jī)FPGA TCP客戶端通信程序,這個(gè)FPGA VI程序前面板和程序框圖分別如圖111-38和111-39所示。

圖111-38:下位機(jī)FPGA TCP Client客戶端應(yīng)用程序前面板


????? ?4、LabVIEW FPGA VI仿真

?????? ?本節(jié)實(shí)驗(yàn)涉及的是FPGA TCP網(wǎng)絡(luò)通信,無法在計(jì)算機(jī)上進(jìn)行虛擬,所以這里的功能性仿真可以跳過,直接將LabVIEW FPGA TCP主VI程序編譯下載到FPGA芯片里面運(yùn)行,然后再利用上位機(jī)通過下發(fā)指令和參數(shù)來測試通過網(wǎng)線連到上位機(jī)PC端(服務(wù)器)的黑金AX7103開發(fā)板(客戶端)上的TCP網(wǎng)口能否正常發(fā)送和接收數(shù)據(jù)包,并在上位機(jī)前面板上把采集到的波形數(shù)據(jù)顯示出來。

????? ?5、LabVIEW FPGA VI編譯下載

?????? ?1)直接點(diǎn)擊FPGA主VI“實(shí)驗(yàn)111-TCP客戶端-Slope-U8-可變采樣率-異步模擬ADC需要大緩存-FPGA.vi”上方工具欄里面的“運(yùn)行”箭頭按鈕,保存VI之后,彈出Xilinx 編譯服務(wù)器選擇對(duì)話框,如圖111-40所示。選擇本地編譯器,然后單擊“取消”按鈕,此時(shí),在FPGA項(xiàng)目下的程序生成規(guī)范里面就會(huì)多出來一個(gè)與TCP通信VI同名的程序生成規(guī)范(實(shí)驗(yàn)111-TCP客戶端-Slope-U8-可變采樣率-異步模擬ADC需要大緩存-FPGA),如圖111-41所示。雙擊打開這個(gè)程序生成規(guī)范屬性配置頁面,勾選“加載至FPGA時(shí)運(yùn)行”復(fù)選框,最后點(diǎn)擊“生成”或者“確定”按鈕,如圖111-42所示。如果點(diǎn)擊的是“確定”按鈕,那么需要重新運(yùn)行一下VI即可再次啟動(dòng)Xilinx Vivado 2017.2編譯器,進(jìn)入編譯狀態(tài)窗口,如圖111-43所示。

圖111-40:選擇本地編譯器進(jìn)行編譯
圖111-41:自動(dòng)生成的FPGA VI程序生成規(guī)范
圖111-42:勾選加載至FPGA時(shí)運(yùn)行
圖111-43: Xilinx Vivado 2017.2編譯器正在編譯(LabVIEW后臺(tái)自動(dòng)控制編譯和下載)

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

圖111-44:“實(shí)驗(yàn)111-TCP客戶端-Slope-U8-可變采樣率-異步模擬ADC需要大緩存-FPGA.vi”FPGA VI編譯完成后的FPGA資源消耗情況

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

圖111-45:編譯完成后會(huì)啟動(dòng)LabVIEW FPGA在線前面板交互式運(yùn)行
圖111-46:提醒用戶找不到Xilinx JTAG下載器

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

圖111-47:FPGA VI編譯完成后會(huì)自動(dòng)生成一個(gè)lvbitx文件和一個(gè)同名的原始bit文件

? ? ? ? 注意1:這個(gè)自動(dòng)生成原始FPGA bit文件的功能是我們?cè)诤笈_(tái)幫大家實(shí)現(xiàn)的,也就是說,用戶再也不需要像前面第5章5.3節(jié)那樣總是開著獲取bit文件的程序才能得到原始bit文件。很明顯經(jīng)過我們重大更新后的寶典和LabVIEW My FPGA工具包更方便、更易用,體驗(yàn)效果跟NI完全一樣。

?????? ?注意2:lvbitx不是FPGA原始的bit位文件,而是NI在bit基礎(chǔ)上又封裝了一層,因此,不能通過其他軟件進(jìn)行下載。但是,lvbitx里面包含了FPGA VI前面板上的控件類型和FPGA寄存器地址等信息,所以在后續(xù)FPGA VI在線前面板交互式運(yùn)行里面會(huì)用得到lvbitx,這個(gè)也是LabVIEW后臺(tái)自動(dòng)完成下載和解析的,用戶了解一下即可。

?

????? ?6、TCP通信上位機(jī)PC服務(wù)器端程序編寫

?????? ?下面我們需要編寫一個(gè)TCP上位機(jī)(服務(wù)器端)應(yīng)用程序來測試下位機(jī)FPGA TCP客戶端程序是否滿足設(shè)計(jì)需求,相當(dāng)于開發(fā)一個(gè)TCP采集卡上位機(jī)程序。這里用戶可以直接調(diào)用LabVIEW軟件自身就有的TCP函數(shù)選板里面的VI,如圖111-48所示,不熟悉的用戶可以自行研究一下,這里不再贅述。當(dāng)然了,喜歡用C、C#、Python、QT等文本編程語言開發(fā)上位機(jī)TCP服務(wù)器測試程序的話,可以上網(wǎng)搜索一下或者問問ChatGPT。

圖111-48:LabVIEW軟件自帶的超強(qiáng)版TCP函數(shù)選板(運(yùn)行效率高,功能超級(jí)多)

? ? ? ? 下面我們簡單介紹一下上位機(jī)TCP服務(wù)器程序的編寫過程。

?????? ?1)右擊項(xiàng)目瀏覽器里面的“我的電腦”,選擇新建一個(gè)“虛擬文件夾”,如圖111-49所示。

圖111-49:在“我的電腦”下面新建一個(gè)上位機(jī)虛擬文件夾

? ? ? ? 2)然后對(duì)新建出來的虛擬文件夾重命名為“實(shí)驗(yàn)111-TCP服務(wù)器端-通信實(shí)驗(yàn)(Slope-U8-可變采樣率)-上位機(jī)”,如圖111-50所示。

圖111-50:將新建的虛擬文件夾進(jìn)行重命名

? ? ? ? 3)然后右擊上面的虛擬文件夾,選擇新建一個(gè)VI,將這個(gè)VI保存為“實(shí)驗(yàn)111-TCP服務(wù)器端-通信程序-Slope-U8-PC.vi”,如圖111-51所示。

圖111-51:新建一個(gè)TCP上位機(jī)服務(wù)器端通信程序

? ? ? ? 4)為了加快講解速度,這里我們直接給出TCP上位機(jī)服務(wù)器通信程序框圖,如圖111-52所示。程序框圖由兩個(gè)相互獨(dú)立的線程組成,也就是兩個(gè)while循環(huán),分別是TCP寫線程(PC服務(wù)器下發(fā)數(shù)據(jù)給客戶端FPGA)和TCP讀線程(PC服務(wù)器讀取FPGA客戶端上傳的數(shù)據(jù))。對(duì)應(yīng)的前面板控件布局,我們也先貼出來,如圖111-53所示。

圖111-52:TCP上位機(jī)服務(wù)器端通信程序框圖
圖111-53:TCP上位機(jī)服務(wù)器端通信程序前面板

? ? ? ? 下面我們來分別介紹一下這兩個(gè)線程對(duì)應(yīng)的程序框圖編寫過程及其注意事項(xiàng)。

?????? ?5)首先,程序啟動(dòng)的時(shí)候,一般都會(huì)有一個(gè)初始化過程,這里也不例外。由于前面板上有一些按鍵和指示燈等控件,為了讓程序每次運(yùn)行的時(shí)候,都能恢復(fù)到一個(gè)默認(rèn)狀態(tài),這里利用順序結(jié)構(gòu),對(duì)需要設(shè)置的控件進(jìn)行賦值操作,如圖111-54所示。

圖111-54:TCP通信上位機(jī)前面板控件初始化代碼

? ? ? ? 6)接下來,我們看看上位機(jī)TCP寫線程代碼是怎么實(shí)現(xiàn)的。由于下位機(jī)FPGA跑的是TCP Client客戶端程序,那么上位機(jī)的角色就是服務(wù)器;所以,我們需要從TCP函數(shù)選板里面選擇偵聽函數(shù)“TCP listen.vi”,偵聽來自下位機(jī)FPGA的TCP連接請(qǐng)求;這個(gè)“TCP Listen.vi”要偵聽的下位機(jī)FPGA客戶端IP地址是192.168.1.10,端口是1024,如圖111-55所示,這兩個(gè)參數(shù)就是前面下位機(jī)FPGA VI程序里面設(shè)置的PC IP和port;同時(shí)為了防止上位機(jī)阻塞死機(jī),將TCP偵聽超時(shí)設(shè)置為30s。

圖111-55:上位機(jī)服務(wù)器端利用“TCP Listen.vi”偵聽來自下位機(jī)FPGA客戶端發(fā)起的連接

? ? ? ? 7)一旦上位機(jī)TCP偵聽成功,說明上位機(jī)PC跟下位機(jī)FPGA成功建立起TCP網(wǎng)絡(luò)連接,同時(shí),這個(gè)“TCP Listen.vi”會(huì)返回一個(gè)非零的TCP引用句柄出來,用戶可以通過這個(gè)引用實(shí)現(xiàn)TCP網(wǎng)絡(luò)數(shù)據(jù)的下發(fā)和讀取。為了人為控制下發(fā)的指令和參數(shù),可以利用case條件結(jié)構(gòu)將下行數(shù)據(jù)的發(fā)送代碼框起來,如圖111-56所示。

圖111-56:TCP下行數(shù)據(jù)的發(fā)送代碼

? ? ? ? 為了讓上位機(jī)PC(服務(wù)器端)能夠控制下位機(jī)FPGA(客戶端)里面的采樣率和信號(hào)采集的啟動(dòng)和停止,我們將上位機(jī)前面板上的U32類型的“采樣率(20ns)”控件通過“強(qiáng)制類型轉(zhuǎn)換”函數(shù)變成字節(jié)數(shù)組;再把前面板上的布爾型“開始/停止采集”按鈕轉(zhuǎn)成U8類型的0或者1;然后再把預(yù)留的一個(gè)參數(shù)“size_read_I32”控件通過“強(qiáng)制類型轉(zhuǎn)換”變成字節(jié)數(shù)組;最后將這3個(gè)轉(zhuǎn)換后的數(shù)據(jù)進(jìn)行數(shù)組拼接(實(shí)際上就是字節(jié)數(shù)組),賦給“寫入TCP數(shù)據(jù).vi”,如圖111-57所示。這樣就可以將上位機(jī)服務(wù)器端的數(shù)據(jù)通過TCP下發(fā)給FPGA客戶端。

圖111-57:將上位機(jī)的指令和參數(shù)轉(zhuǎn)換成字節(jié)數(shù)組后通過TCP寫函數(shù)下發(fā)給FPGA

? ? ? ? 8)下面,我們?cè)賮砜纯瓷衔粰C(jī)PC服務(wù)器端是如何把FPGA采集上傳的數(shù)據(jù)通過TCP函數(shù)讀取出來的。為了提高TCP讀取效率或者為了方便定長數(shù)據(jù)的解析,我們可以給“TCP讀取數(shù)據(jù).vi”函數(shù)設(shè)置一個(gè)長度閾值,只有當(dāng)上位機(jī)PC端的TCP緩沖區(qū)里面接收到指定長度的字節(jié)數(shù)之后,再把這些字節(jié)數(shù)組一次性讀取出來。因?yàn)門CP傳輸?shù)臄?shù)據(jù)都是以字節(jié)為單位,所以如果用戶希望讀取的數(shù)據(jù)位寬是字節(jié)的倍數(shù),比如后續(xù)16位或者24位ADC網(wǎng)絡(luò)數(shù)采卡實(shí)驗(yàn),下位機(jī)FPGA上傳的數(shù)據(jù)是U16類型的ADC數(shù)據(jù),正好就是2個(gè)字節(jié),那么在判斷之前,我們需要將前面板讀取點(diǎn)數(shù)×2,再做比較判斷,這樣讀取出來的數(shù)據(jù)點(diǎn)數(shù)才能被正確解析恢復(fù)出來。

?????? ?LabVIEW里面自帶的“TCP讀取數(shù)據(jù).vi”這個(gè)函數(shù)非常強(qiáng)大,它提供了4種內(nèi)在讀取模式,分別是Standard、Buffered、CRLF、Immediate這4種模式:

表1:LabVIEW TCP函數(shù)4種讀取方法

?????? ?這里很多用戶經(jīng)常搞不清楚這些模式的含義以及用法,這個(gè)屬于基本功問題了。下面我們簡單講解一下這4種模式。

1Standard標(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ù)量少于指定讀取的長度,那么該VI就是有多少讀取多少,并且產(chǎn)生超時(shí)錯(cuò)誤,雖然產(chǎn)生了超時(shí)錯(cuò)誤,但是讀出來的數(shù)據(jù)都是有效的,并不妨礙數(shù)據(jù)本身,只是我們可以通過是否超時(shí)來判斷讀取的數(shù)據(jù)長度是否達(dá)到我們指定的長度。這種模式內(nèi)部存在阻塞機(jī)制,直到發(fā)生超時(shí)退出為止。

2Buffered緩沖模式,這種模式相比于標(biāo)準(zhǔn)模式,它的優(yōu)勢更明顯,那就是當(dāng)緩沖區(qū)里面的字節(jié)數(shù)據(jù)沒有達(dá)到指定讀取的長度,那么這個(gè)VI讀出來的數(shù)據(jù)是無效的,TCP數(shù)據(jù)依然很好的保留在TCP緩沖區(qū)里面,通過超時(shí)錯(cuò)誤告知用戶,當(dāng)前返回的數(shù)據(jù)可以直接忽略。

3CRLF回車換行模式,這個(gè)模式帶有一定的協(xié)議分段功能在里面,特別適合不定長數(shù)據(jù)的讀取和解析,比如下位機(jī)每次發(fā)送的TCP數(shù)據(jù)有效內(nèi)容長度不固定,那么可以在TCP發(fā)送每包有效數(shù)據(jù)的尾巴加上CR(回車)LF(換行)結(jié)束符,這樣,TCP對(duì)等端只需要將讀取長度設(shè)置為一個(gè)超級(jí)大的數(shù),該函數(shù)內(nèi)部自己輪詢TCP緩沖區(qū)收到的字節(jié)數(shù)據(jù),一旦發(fā)現(xiàn)有CRLF結(jié)束符,立刻輸出當(dāng)前有效內(nèi)容,可以看出,這個(gè)模式非常適合不定長數(shù)據(jù)和自定義協(xié)議解析等應(yīng)用。

4Immediate立即模式,這個(gè)模式是所有模式里面讀取效率最高的,如果用戶將超時(shí)設(shè)置為0的話,那么實(shí)際效果就是,每次執(zhí)行這個(gè)TCP讀取VI的話,緩沖區(qū)有多少字節(jié)數(shù)據(jù),就會(huì)立刻讀取出來,不管有沒有超時(shí)產(chǎn)生,讀出來的數(shù)據(jù)都是有效的,這個(gè)模式配上LabVIEW里面自帶的隊(duì)列函數(shù),可以快速構(gòu)建出來一個(gè)“生產(chǎn)者-消費(fèi)者”模式,將TCP報(bào)文通過隊(duì)列存放到計(jì)算機(jī)內(nèi)存中。

?????? ?總結(jié):如果想要實(shí)現(xiàn)上面指定長度字節(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)然了,如果想要測試TCP傳輸?shù)臉O限吞吐率,應(yīng)該選擇Immediate立即模式,同時(shí)還要關(guān)閉所有影響CPU效率的代碼,比如波形圖顯示。

?????? ?基于以上分析,編寫的上位機(jī)服務(wù)器端TCP讀取程序框圖,如圖111-58所示。

圖111-58:利用Buffered緩沖模式讀取下位機(jī)FPGA發(fā)送的TCP報(bào)文數(shù)據(jù)(指定讀取長度)

? ? ? ??9)一般情況下,如果下位機(jī)FPGA發(fā)送的TCP數(shù)據(jù)吞吐率很高,那么上位機(jī)讀取的頻率和每次讀取的字節(jié)長度(size_read_I32)要滿足一定的范圍才能保證所有的數(shù)據(jù)不會(huì)丟失,如果每次讀取的字節(jié)長度很短,那么需要讀取的速度就要很快,這樣不僅會(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發(fā)送的斜坡信號(hào)數(shù)據(jù)類型也是U8,程序如圖111-59所示;在后續(xù)很多實(shí)驗(yàn)里面,我們會(huì)通過“強(qiáng)制類型轉(zhuǎn)換vi”將原始字節(jié)數(shù)組轉(zhuǎn)成實(shí)際指定的物理數(shù)據(jù),比如16位8通道AD7606以太網(wǎng)TCP采集實(shí)驗(yàn)。

圖111-59:利用“強(qiáng)制類型轉(zhuǎn)換”VI將字節(jié)數(shù)組轉(zhuǎn)成實(shí)際物理意義的數(shù)據(jù)

? ? ? ? 11)當(dāng)斜坡信號(hào)讀到之后,我們可以在前面板上放置一個(gè)波形圖顯示控件,將FPGA客戶端發(fā)送上來的數(shù)據(jù)以波形的方式呈現(xiàn)出來,但是考慮到實(shí)際應(yīng)用中,如果波形圖控件里面每次顯示的點(diǎn)數(shù)過大的話,會(huì)導(dǎo)致電腦CPU、內(nèi)存和顯卡壓力過大,CPU運(yùn)行速度會(huì)降低,這樣不利于TCP快速讀取數(shù)據(jù),因此,我們?cè)赥CP-讀線程里面加了兩個(gè)控制按鈕,可以人為控制讀取出來的波形是否進(jìn)行拼接以及是否開啟波形顯示功能,如圖111-60所示。關(guān)于這幾個(gè)功能的演示,我們?cè)诤罄m(xù)的實(shí)驗(yàn)演示環(huán)節(jié)里面再給用戶做詳細(xì)的介紹。

圖111-60:是否開啟波形顯示和波形首尾拼接功能

? ? ? ? 12)當(dāng)用戶需要將這個(gè)程序停止運(yùn)行的時(shí)候,可以通過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)存泄漏,如圖111-61所示。

圖111-61:上位機(jī)程序停止之前給FPGA下發(fā)停止指令再關(guān)閉TCP網(wǎng)絡(luò)引用句柄

? ? ? ??注意:細(xì)心的用戶發(fā)現(xiàn)了我們的“TCP-讀線程”while循環(huán)里面有一個(gè)禁用結(jié)構(gòu),里面是ms倍數(shù)延時(shí),如圖111-62。這個(gè)延時(shí)的作用是什么呢?這個(gè)ms倍數(shù)延時(shí)函數(shù)主要是用來控制我們的while循環(huán)讀取頻率,可以釋放CPU資源。假設(shè),當(dāng)FPGA采樣率很低的時(shí)候,也就意味著上位機(jī)PC端接收到的數(shù)據(jù)吞吐率低,那么我們就沒有必要讓“TCP-讀線程”跑的太快,這樣會(huì)極大消耗CPU資源,如果主程序里面還有其他的事情要處理,那么CPU會(huì)顯得吃力;如果下位機(jī)FPGA采樣率很高的時(shí)候,為了避免TCP緩沖區(qū)溢出,我們需要以最快的速度將里面的數(shù)據(jù)全部讀取出來,這時(shí)我們可以給ms倍數(shù)延時(shí)函數(shù)賦值0或者直接將這延時(shí)函數(shù)禁用掉,這樣“TCP-讀線程”這個(gè)while循環(huán)就會(huì)全速運(yùn)行。

圖111-62:控制TCP讀取速度的ms倍數(shù)延時(shí)函數(shù)

? ? ? ? 13)最后,再來介紹一下這個(gè)上位機(jī)PC TCP服務(wù)器端通信程序前面板上的控件有哪些功能和注意事項(xiàng),完整的上位機(jī)程序前面板,如圖111-63所示。

圖111-63:上位機(jī)PC TCP服務(wù)器端通信程序前面板

? ? ? ? 上位機(jī)程序運(yùn)行之后,一旦偵聽到下位機(jī)FPGA客戶端發(fā)來的連接請(qǐng)求后,成功建立連接之后,前面板上的“Running_W”和“Running_R”兩個(gè)顯示控制里面的數(shù)值就會(huì)快速遞增;然后用戶就可以通過“采樣率(20ns)”控件里面的數(shù)值參數(shù)控制下位機(jī)FPGA里面的采樣率,比如當(dāng)我們?cè)O(shè)置為50,換算一下也就是50*20ns=1000ns=1us<=>1MS/s采樣率,換算成字節(jié)為單位的采樣率的話,也就是1MByte/s,這個(gè)采樣率算是很低的了;所以我們可以將前面板上的“開始/停止采集”和“顯示波形?”兩個(gè)按鈕全部點(diǎn)亮,前者是用來通知FPGA啟動(dòng)采集發(fā)送數(shù)據(jù),后者是把上位機(jī)接收到的波形數(shù)據(jù)在波形圖控件中顯示出來;然后可以在“size_read_I32”控件里面輸入一個(gè)點(diǎn)數(shù),比如128000,也就是128K個(gè)U8(因?yàn)楸竟?jié)實(shí)驗(yàn)下位機(jī)FPGA里面模擬的是U8的斜坡信號(hào)采集)點(diǎn);最后,當(dāng)我們點(diǎn)擊一下“Send”按鈕之后,上位機(jī)PC就會(huì)把指令和參數(shù)通過TCP下發(fā)給FPGA,然后就能看到波形圖里面立刻出現(xiàn)一個(gè)長度為128K個(gè)點(diǎn)的斜坡信號(hào)。整個(gè)過程可以很好地反應(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é)再給用戶講解。

?????? ?需要注意的是:如果用戶提高了FPGA采樣率,比如,把“采樣率(20ns)”這個(gè)參數(shù)設(shè)置為1,也就是20ns,相當(dāng)于50MS/s,換算成字節(jié)單位就是50MB/s,對(duì)于我們封裝的ComBlock TCP IP核來說,可以完全勝任;不過對(duì)于性能很差的電腦,建議用戶最好把前面板上的“顯示波形?”熄滅關(guān)掉,這樣可以節(jié)省CPU資源,加快LabVIEW應(yīng)用程序讀取速度,減少上位機(jī)的TCP緩沖區(qū)溢出造成的數(shù)據(jù)丟失。

????? ?7、實(shí)驗(yàn)操作

?? ?7.1、準(zhǔn)備工作

?????? ?1)接好硬件設(shè)備。利用一根CAT5+或者CAT6類網(wǎng)線,一頭接到黑金AX7103開發(fā)板第2路網(wǎng)口里面(ETH2),另外一頭接到電腦的網(wǎng)口里面;要想實(shí)現(xiàn)FPGA VI在線下載和在線前面板交互式運(yùn)行,必須使用Xilinx JTAG下載器(不能使用任何第三方Digilent HS系列下載器,比如黑金的紅色下載器本質(zhì)上就是高仿的Digilent HS1下載器),將JTAG線纜一頭插到黑金AX7103開發(fā)板上的JTAG下載口,USB一頭接到電腦上(注意:如果用戶使用的是不帶RJ45網(wǎng)口的超薄筆記本電腦的話,可以在網(wǎng)上買一個(gè)雷電轉(zhuǎn)千兆網(wǎng)口擴(kuò)展塢,相當(dāng)于給筆記本擴(kuò)展了一個(gè)RJ45千兆網(wǎng)口,這樣上位機(jī)PC(服務(wù)器)和下位機(jī)FPGA(客戶端)之間的TCP網(wǎng)絡(luò)通信實(shí)驗(yàn)就可以在一臺(tái)筆記本上完成了,更方便);此時(shí),筆記本的設(shè)備管理器里面識(shí)別出來一個(gè)Xilinx JTAG下載器設(shè)備,如圖111-64所示。關(guān)于Xilinx下載器驅(qū)動(dòng)安裝方法在前面,我們已經(jīng)給用戶介紹過了,這里不再贅述。實(shí)際AX7103 FPGA開發(fā)板跟電腦之間的接線實(shí)物圖,可參考圖111-65所示。

圖111-64:識(shí)別出來的Xilinx JTAG下載器(DCL9或者DCL10)
圖111-65:AX7103與JTAG下載器通過網(wǎng)線與筆記本電腦之間的接線實(shí)物圖


?? ?7.2、手動(dòng)下載bit文件(傳統(tǒng)手動(dòng)下載方式,效率低,不推薦,跳過,直接看7.3節(jié))

?

?? ?7.3、自動(dòng)下載bit文件(支持在線前面板交互式運(yùn)行和調(diào)試,效率高,更方便,推薦)

?????? ?接下來,就是見證奇跡的時(shí)刻了,大家屏住呼吸哈

?????? ?硬件接好之后,給FPGA開發(fā)板上電,然后再點(diǎn)擊一下編譯過的“實(shí)驗(yàn)111-TCP客戶端-Slope-U8-可變采樣率-異步模擬ADC需要大緩存-FPGA.vi”FPGA VI前面板左上角的運(yùn)行箭頭,此時(shí),LabVIEW會(huì)在后臺(tái)自動(dòng)將編譯好的bit文件下載到FPGA芯片里面,幾秒之后,奇跡發(fā)生了,可以看到就像我們開發(fā)的LabVIEW STM32工具包那樣,LabVIEW前面板成功地進(jìn)入了FPGA在線交互式運(yùn)行模式,如圖111-85所示。

圖111-85:“實(shí)驗(yàn)111-TCP客戶端-Slope-U8-可變采樣率-異步模擬ADC需要大緩存-FPGA.vi”FPGA VI前面板自動(dòng)進(jìn)入了在線交互式運(yùn)行

? ? ? ? 幾秒之后,可以看到上位機(jī)“控制面板\網(wǎng)絡(luò)和Internet\網(wǎng)絡(luò)連接”里面的網(wǎng)卡由斷開狀態(tài)變成了連接狀態(tài),如圖111-86所示。說明,上位機(jī)識(shí)別到了下位機(jī)FPGA網(wǎng)絡(luò)。

圖111-86:上位機(jī)網(wǎng)卡由斷開狀態(tài)變成了連接狀態(tài)


?? ?7.4、觀察現(xiàn)象(運(yùn)行上位機(jī)TCP服務(wù)器網(wǎng)絡(luò)通信測試程序)

?????? ?1)首先,需要根據(jù)下位機(jī)FPGA Client VI里面設(shè)置的遠(yuǎn)程服務(wù)器端IP地址和端口,把對(duì)等端上位機(jī)的網(wǎng)絡(luò)地址也做相應(yīng)的設(shè)置,如圖111-87所示。這里,上位機(jī)服務(wù)器端IP是192.168.1.10,端口是1024.

圖111-87(a):根據(jù)下位機(jī)FPGA Client程序的參數(shù)來對(duì)上位機(jī)網(wǎng)絡(luò)做相應(yīng)的設(shè)置
圖111-87(b):根據(jù)下位機(jī)FPGA Client程序的參數(shù)來對(duì)上位機(jī)網(wǎng)絡(luò)做相應(yīng)的設(shè)置

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

圖111-88:將上位機(jī)網(wǎng)卡屬性里面的傳輸和接收緩沖區(qū)深度改到最大值2048

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

圖111-89:利用ping指令測試下位機(jī)FPGA網(wǎng)絡(luò)ARP協(xié)議是否運(yùn)行正常

? ? ? ??4)為了驗(yàn)證下位機(jī)FPGA Client客戶端程序的功能是否符合前面的預(yù)期設(shè)計(jì),需要一個(gè)對(duì)等端,比如本節(jié)實(shí)驗(yàn)需要一個(gè)上位機(jī)作為服務(wù)器端來與下位機(jī)FPGA進(jìn)行通信測試。?????? ?為此,我們準(zhǔn)備了3種上位機(jī)測試軟件,分別是:網(wǎng)絡(luò)調(diào)試助手、基于C生成的TCPTool.exe、基于LabVIEW編寫的測試VI。其中,讀取效率最低的就是網(wǎng)絡(luò)調(diào)試助手,壓根就跟不上我們下位機(jī)FPGA TCP發(fā)送數(shù)據(jù)的速度,因此,我們才單獨(dú)用C寫了一個(gè)只讀取不做任何處理的exe小程序,最后是我們最強(qiáng)大的LabVIEW TCP上位機(jī)Demo程序,無論是執(zhí)行效率還是靈活性還是可閱讀性都是最強(qiáng)的。下面我們分別進(jìn)行演示。

?????? ?7.4.1、利用“網(wǎng)絡(luò)調(diào)試助手”測試下位機(jī)FPGA Client網(wǎng)絡(luò)通信

?????? ?1)首先,我們利用大家最為熟悉的“網(wǎng)絡(luò)調(diào)試助手”來測試一下下位機(jī)FPGA Client,大家都可以自行在網(wǎng)上搜索下載一下,也可以聯(lián)系我們提供。雙擊打開安裝好的“網(wǎng)絡(luò)調(diào)試助手”,將“協(xié)議類型”選擇為TCP Server,因?yàn)橄挛粰C(jī)FPGA跑的是Client客戶端程序,所以上位機(jī)就是服務(wù)器端了;然后將本地IP地址設(shè)置為192.168.1.10,端口設(shè)置為1024;點(diǎn)擊“連接”按鈕,可以看到按鈕點(diǎn)亮了,如圖111-90所示。同時(shí),下位機(jī)FPGA VI前面板上的“connect_status”指示燈點(diǎn)亮了,如圖111-91所示,說明,上位機(jī)網(wǎng)絡(luò)助手已經(jīng)成功的偵聽到了下位機(jī)FPGA發(fā)起的連接并且成功建立起網(wǎng)絡(luò)通信了。并且,“data_req_en”數(shù)據(jù)請(qǐng)求指示燈也點(diǎn)亮了,說明下位機(jī)FPGA準(zhǔn)備好了,隨時(shí)可以將數(shù)據(jù)發(fā)送給服務(wù)器端。

圖111-90:網(wǎng)絡(luò)調(diào)試助手參數(shù)設(shè)置
圖111-91:下位機(jī)FPGA Client客戶端成功與上位機(jī)服務(wù)器建立起連接

? ? ? ? 2)由于網(wǎng)絡(luò)調(diào)試助手下發(fā)16進(jìn)制字符串比較麻煩不直觀,但是好在我們的下位機(jī)FPGA VI支持在線前面板運(yùn)行,因此,即使上位機(jī)不下發(fā)任何指令控制下位機(jī)FPGA VI,我們也能通過手動(dòng)來控制下位機(jī)FPGA VI上的按鈕發(fā)送數(shù)據(jù)給上位機(jī)。當(dāng)然,再看完后續(xù)我們的LabVIEW上位機(jī)TCP Demo程序之后,也可以把LabVIEW強(qiáng)制類型轉(zhuǎn)換出來的16進(jìn)制字符串拷貝到網(wǎng)絡(luò)調(diào)試助手里面下發(fā),這個(gè)留給用戶自己測試。

?????? ?3)將下位機(jī)FPGA VI前面板上的分頻系數(shù)“Count(20nSec)”設(shè)置為500,也就是下位機(jī)發(fā)送的數(shù)據(jù)吞吐率是50MB/500=100KB/s,然后按下“開始/停止”發(fā)送按鈕,如圖111-92所示。同時(shí)上位機(jī)“網(wǎng)絡(luò)調(diào)試助手”里面快速收到了很多數(shù)據(jù),為了提高調(diào)試助手的讀取速度,勾選“暫停接收顯示”,如圖111-93所示。由于這個(gè)網(wǎng)絡(luò)調(diào)試助手沒有內(nèi)置網(wǎng)絡(luò)傳輸速度的計(jì)算功能,為此,我們可以打開Windows任務(wù)管理器,找到以太網(wǎng)通信頁面,如圖111-94,可以看出,當(dāng)前條件下的網(wǎng)絡(luò)上行和下行吞吐率,如果是win7系統(tǒng)的話,只能看到一個(gè)總的網(wǎng)絡(luò)使用率,win10系統(tǒng)單獨(dú)給出了接收和發(fā)送速率。

圖111-92:將下位機(jī)FPGA分頻系數(shù)設(shè)置位500(實(shí)際上行速度100KB/s)
圖111-93:“網(wǎng)絡(luò)調(diào)試助手”里面接收的斜坡16進(jìn)制數(shù)據(jù)(亂碼)

? ? ? ??提醒:如果不關(guān)閉接收顯示的話,“網(wǎng)絡(luò)調(diào)試助手”一會(huì)就會(huì)卡死崩潰,這是因?yàn)榻邮盏臄?shù)據(jù)太多了,緩沖區(qū)快爆了,同時(shí)也會(huì)影響網(wǎng)絡(luò)助手的運(yùn)行速度。

圖111-94:Windows任務(wù)管理器里面顯示以太網(wǎng)接收和發(fā)送數(shù)據(jù)包速度(吞吐率)

? ? ? ? 雖然,我們下位機(jī)FPGA(客戶端)只發(fā)送數(shù)據(jù)給上位機(jī)(服務(wù)器),但是圖111-94里面的發(fā)送速度(下發(fā))依然有16Kbps,也就是2KB/s,這是因?yàn)門CP屬于握手類通信協(xié)議,客戶端發(fā)送任何數(shù)據(jù),服務(wù)器端都需要Ack響應(yīng),否則客戶端底層會(huì)自動(dòng)重發(fā)TCP數(shù)據(jù)包。這一點(diǎn)與UDP不一樣,UDP是單方面通信,不存在Ack數(shù)據(jù)包。

?????? ?上位機(jī)任務(wù)管理器的以太網(wǎng)接收速度是840Kbps,換算成Byte字節(jié)就是840Kbps/8=105KB/s,很接近FPGA實(shí)際發(fā)送數(shù)據(jù)的100KB/s,為啥還會(huì)多出來5KB/s,這是因?yàn)門CP除了我們的100KB/s斜坡數(shù)據(jù),還存在包頭、MAC地址、IP地址、端口和CRC校驗(yàn)位等額外的參數(shù),因此,網(wǎng)卡實(shí)際每秒接收到的數(shù)據(jù)一定會(huì)大于TCP數(shù)據(jù)包里面的有效數(shù)據(jù)吞吐率。

?????? ?4)接下來,減小下位機(jī)FPGA VI前面板上的分頻系數(shù)“Count(20nSec)”,將其設(shè)置為50,等效提高下位機(jī)FPGA發(fā)送數(shù)據(jù)吞吐率(50MB/500=1MB/s),保持“開始/停止”發(fā)送按鈕常亮狀態(tài),如圖111-95所示;網(wǎng)絡(luò)調(diào)試助手右下角的“接收”字節(jié)數(shù)也在快速飆升,如圖111-96;同時(shí),Windows任務(wù)管理器的接收速度變成了8.4Mbps,相當(dāng)于提高了10倍(1.05MB/s),如圖111-97所示。

圖111-95:減小FPGA分頻系數(shù)提高下位機(jī)FPGA發(fā)送速度(1MB/s)
圖111-96:網(wǎng)絡(luò)調(diào)試助手接收速度明顯提高了
圖111-97:Windows任務(wù)管理器里面顯示的接收TCP數(shù)據(jù)包吞吐率(1.05MB/s)

? ? ? ?5)最后,我們將下位機(jī)FPGA VI前面板上的分頻系數(shù)“Count(20nSec)”進(jìn)一步降低為2,也就是等效的FPGA Client客戶端發(fā)送TCP有效數(shù)據(jù)速度為50MBps/2=25MB/s,如圖111-98所示;此時(shí),可以看到下位機(jī)FPGA VI前面板上的“溢出點(diǎn)數(shù)”顯示控件里面的數(shù)字不斷累加,說明下位機(jī)FPGA模擬ADC采集的異步FIFO出現(xiàn)了溢出,數(shù)據(jù)丟失了,同時(shí)“data_req_en”指示燈也由常亮變成了閃爍,這是因?yàn)閷?duì)等端上位機(jī)PC服務(wù)器(網(wǎng)絡(luò)調(diào)試助手)讀取速度跟不上下位機(jī)FPGA發(fā)送數(shù)據(jù)的速度了,理論上只要對(duì)等端讀取速度足夠快,TCP是可以達(dá)到極限傳輸帶寬的(800Mbps)。雖然下位機(jī)FPGA數(shù)據(jù)溢出了,但是上位機(jī)Windows任務(wù)管理器里面顯示的接收速度是209Mbps,等效為26.125MB/s,如圖111-99所示。

圖111-98:將下位機(jī)FPGA發(fā)送數(shù)據(jù)速度提高到25MB/s
圖111-99:Windows任務(wù)管理器里面顯示的TCP接收速度(209Mbps)

? ? ? ??結(jié)論:可以看出,“網(wǎng)絡(luò)調(diào)試助手”目前能夠讀取下位機(jī)FPGA發(fā)送TCP數(shù)據(jù)的最大速度不能超過25MB/s,因此,通過網(wǎng)絡(luò)調(diào)試助手是無法測試我們的FPGA TCP Client極限吞吐率的。但是不用擔(dān)心,下面兩種方式可以幫助我們測試下位機(jī)FPGA TCP傳輸速度。

?????? ?7.4.2、利用“TCPTool.exe”測試下位機(jī)FPGA Client網(wǎng)絡(luò)通信

?????? ?1)為了解決網(wǎng)絡(luò)調(diào)試助手的讀取效率問題,我們專門用C語言編寫了一個(gè)只讀不做任何處理的TCP專用工具.exe,感興趣的用戶可以聯(lián)系我們索取。雙擊打開桌面上的“TCPTool.exe”,將本地IP設(shè)置為192.168.1.10,本地端口設(shè)置為1024,點(diǎn)擊“開啟”按鈕,如圖111-100所示;此時(shí),下位機(jī)FPGA Client VI前面板上的兩個(gè)指示燈點(diǎn)亮了,說明下位機(jī)FPGA成功的連上了PC服務(wù)器,如圖111-101所示。

圖111-100:在上位機(jī)TCPTool.exe軟件里面設(shè)置本地服務(wù)器網(wǎng)絡(luò)參數(shù)
圖111-101:下位機(jī)FPGA VI指示燈點(diǎn)亮說明與上位機(jī)PC服務(wù)器連接成功

? ? ? ? 2)低速下的TCP傳輸測試,這里我們就不測試了,直接測試TCP高吞吐率。將下位機(jī)FPGA VI前面板上的分頻系數(shù)“Count(20nSec)”設(shè)置為2,等效的FPGA發(fā)送速度是25MB/s,按下“開始/停止”按鈕,如圖111-102所示;此時(shí),TCPTool.exe軟件界面里面顯示的接收速度為24MB/s左右,如圖111-103所示,低于下位機(jī)FPGA發(fā)送的TCP速度,這個(gè)不影響,這個(gè)軟件本身對(duì)測速這塊相對(duì)粗糙一些;更為準(zhǔn)確的TCP接收數(shù)據(jù)帶寬可以參考Windows任務(wù)管理器,如圖111-104所示,根據(jù)千兆網(wǎng)卡1Gbps和網(wǎng)絡(luò)使用率21.19%計(jì)算出當(dāng)前的TCP接收速度為1Gbps×21.19/100=211.9Mbps=26.48MB/s,符合我們的預(yù)期。

圖111-102:將下位機(jī)FPGA Client VI發(fā)送TCP數(shù)據(jù)速度提高到25MB/s
圖111-103:TCPTool.exe軟件界面上顯示的TCP數(shù)據(jù)接收速度(24MB/s左右,粗糙一些)
圖111-104:Windows任務(wù)管理器里面顯示的TCP千兆以太網(wǎng)傳輸速度(21.19%)

? ? ? ? 3)接下來,直接將下位機(jī)FPGA VI前面板上的分頻系數(shù)“Count(20nSec)”設(shè)置為1,也就是本節(jié)實(shí)驗(yàn)最大的FPGA發(fā)送速度50MB/s,“開始/停止”按鈕保持按下常亮狀態(tài),如圖111-105所示;即使FPGA處在50MB/s發(fā)送速度下,“溢出點(diǎn)數(shù)”顯示控件里面的數(shù)字依然是0,同時(shí)“data_req_en”指示燈常亮,始終高電平狀態(tài),說明上位機(jī)PC服務(wù)器端讀取的速度足夠快,下位機(jī)FPGA的TCP Client FIFO才沒有發(fā)生溢出;同時(shí),上位機(jī)TCPTool.exe軟件里面顯示的接收速度為48.30MB/s,如圖111-106所示;Windows任務(wù)管理器里面顯示的網(wǎng)絡(luò)使用率為41.96%,如圖111-107所示,換算一下就是1Gbps×41.96/100=419.6Mbps=52.45MB/s,說明我們封裝的TCP Client IP核非常成功,50MB/s的TCP網(wǎng)絡(luò)通信輕松拿下。

圖111-105:將下位機(jī)FPGA TCP發(fā)送速度提高到50MB/s(依然沒有溢出,很穩(wěn)定,牛)
圖111-106:TCPTool.exe軟件頁面顯示的TCP接收速度為48MB/s左右
圖111-107:Windows任務(wù)管理器顯示的網(wǎng)絡(luò)使用率(41.96%)

? ? ? ??提醒:一定要把上位機(jī)影響CPU和網(wǎng)絡(luò)性能的軟件全部關(guān)閉,特別是todesk、teamview、向日葵等。本節(jié)實(shí)驗(yàn)下位機(jī)FPGA我們?cè)O(shè)計(jì)的定時(shí)循環(huán)最快是50MHz,沒有體現(xiàn)出我們實(shí)際封裝的TCP FPGA Client IP核的極限傳輸帶寬,下一節(jié)實(shí)驗(yàn)112,我們會(huì)單獨(dú)利用125MHz時(shí)鐘域編寫一個(gè)125MB/s極限傳輸程序來驗(yàn)證我們封裝的FPGA TCP極限傳輸速度(108MB/s),盡請(qǐng)期待!

?????? ?7.4.3、利用“LabVIEW TCP Demo”測試下位機(jī)FPGA Client網(wǎng)絡(luò)通信

?????? ?1)打開運(yùn)行上位機(jī)TCP服務(wù)器端網(wǎng)絡(luò)測試程序,位于FPGA項(xiàng)目瀏覽器“我的電腦”下面的“實(shí)驗(yàn)111-TCP服務(wù)器端-通信程序-Slope-U8-PC.vi”,如圖111-108所示。

圖111-108:運(yùn)行上位機(jī)TCP服務(wù)器端網(wǎng)絡(luò)通信測試程序

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

圖111-109:運(yùn)行上位機(jī)TCP服務(wù)器端程序之后,下位機(jī)FPGA VI指示燈點(diǎn)亮(建立連接)

? ? ? ? 3)在上位機(jī)前面板上的控件“采樣率(20nSec)”里面輸入5,相當(dāng)于模擬ADC采集的等效采樣率是5×20ns=100ns<=>10MS/s<=>80Mbps;按下“波形顯示?”按鈕,這樣后面就能在波形圖里面看到每次讀取的斜坡信號(hào)了;再在輸入控件“size_read_I32”里面輸入每次從PC端TCP網(wǎng)絡(luò)緩沖區(qū)里面需要讀取的數(shù)據(jù)長度(以帶阻塞的Buffered方式讀?。捎谇懊嫖覀?cè)O(shè)置的采樣率不高,所以這里輸入的讀取長度相對(duì)自由一些,比如我們?cè)O(shè)置128000,也就是128K個(gè)點(diǎn),單位是U8,換算成字節(jié)的話,就是每次讀取128K個(gè)Byte;最后再按下點(diǎn)亮“開始/停止采集”這個(gè)按鈕。

?????? ?當(dāng)一切設(shè)置就緒后,點(diǎn)擊一下前面板上的“Send”發(fā)送按鈕(這是一個(gè)觸發(fā)型的控件),每點(diǎn)擊一次,上位機(jī)(服務(wù)器)都會(huì)把前面板上設(shè)置的這些參數(shù)轉(zhuǎn)換成字節(jié)數(shù)組通過TCP寫通道發(fā)送給下位機(jī)FPGA(客戶端),當(dāng)FPGA接收完成并解析出來指令和參數(shù)后,會(huì)立刻把采集到的斜坡信號(hào)通過TCP Client上行通道源源不斷的發(fā)送給上位機(jī)PC服務(wù)器。

?????? ?實(shí)際觀察到的情況是:每隔12.8ms,上位機(jī)TCP網(wǎng)絡(luò)緩沖區(qū)會(huì)清空一次,同時(shí),波形圖里面的曲線會(huì)刷新一次,這是因?yàn)橄挛粰C(jī)FPGA的采樣率是10MB/s,上位機(jī)LabVIEW程序每次批量讀取128KB數(shù)據(jù),所以刷新周期就是12.8ms。

?????? ?此時(shí),上位機(jī)PC服務(wù)器端的LabVIEW TCP程序前面板上的波形圖里面出現(xiàn)了鋸齒波(周期性的斜坡信號(hào)),如圖111-110所示;如果下位機(jī)FPGA TCP Client VI程序沒有發(fā)生溢出丟點(diǎn)的話,上位機(jī)接收到的斜坡信號(hào)就是一個(gè)穩(wěn)定的從0開始的信號(hào),如果因?yàn)樯衔粰C(jī)抖動(dòng)或者截圖操作會(huì)阻塞CPU導(dǎo)致下位機(jī)FPGA溢出,那么上位機(jī)還原的鋸齒波波形會(huì)發(fā)生偏移。

圖111-110:開啟波形顯示功能,禁用波形首尾拼接(采樣率:10MS/s)

? ? ? ? 實(shí)際上,當(dāng)下位機(jī)FPGA接收到上位機(jī)通過TCP下發(fā)的指令和參數(shù)后,也可以在下位機(jī)FPGA Client VI前面板上看到這些控件參數(shù)自動(dòng)發(fā)生更新了,并且下位機(jī)FPGA VI前面板上的“溢出點(diǎn)數(shù)”始終為0,說明原始的ADC FIFO沒有數(shù)據(jù)溢出,也就不存在丟點(diǎn),非常好,如圖111-111所示;同時(shí),Windows任務(wù)管理器里面顯示的網(wǎng)絡(luò)使用率是8.52%,如圖111-112所示,換算一下就是1Gbps×8.52/100=85.2Mbps=10.65MB/s,符合預(yù)期。

圖111-111:下位機(jī)FPGA Client VI前面板上顯示沒有數(shù)據(jù)溢出(說明10MB/s傳輸速度下,TCP沒有丟包)
圖111-112:上位機(jī)Windows任務(wù)管理器顯示的網(wǎng)絡(luò)使用率(8.52%:10.65MB/s)

? ? ? ??注意:如果用戶按下上位機(jī)VI前面板上的“拼接”按鈕,可以將TCP讀取的所有波形進(jìn)行收尾拼接相連,但是如果讓這個(gè)LabVIEW上位機(jī)程序一直運(yùn)行著,過一會(huì)會(huì)彈出一個(gè)錯(cuò)誤提示:系統(tǒng)內(nèi)存不足,請(qǐng)釋放內(nèi)存空間。這是因?yàn)槲覀冊(cè)诔绦蚩驁D里面開啟了波形首尾拼接功能,隨著時(shí)間的延長,程序框圖里面的數(shù)組長度和波形里面的數(shù)據(jù)量越來越大,一旦超越了LabVIEW軟件本身的承受能力,就會(huì)導(dǎo)致LabVIEW報(bào)警甚至卡死崩潰。所以,一般情況下,我們都是人為控制一下程序框圖里面的數(shù)組長度以及波形控件里的數(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ù)流盤和無損回放。

?

?????? ?4)下面我們來提高一下FPGA采樣率,看看會(huì)有什么情況發(fā)生:首先,將輸入控件“采樣率(20nSec)”里面的5改成2,相當(dāng)于等效的采樣率提高了2.5倍:2×20ns = 40ns <=> 25MS/s <=> 200Mbps(位寬是8位U8);按下“波形顯示?”按鈕,這樣后面就能在波形圖里面看到每次讀取的斜坡信號(hào)了,熄滅“拼接?”按鈕;其他參數(shù)保存不變,比如,輸入控件“size_read_I32”里面還是輸入128000,也就是128K個(gè)點(diǎn),單位是U8,換算成字節(jié)的話,就是每次讀取128K個(gè)Byte;“開始/停止采集”這個(gè)按鈕要一直點(diǎn)亮。

?????? ?設(shè)置完成后,再點(diǎn)擊一下前面板上的“Send”發(fā)送按鈕(這是一個(gè)觸發(fā)型的控件),每點(diǎn)擊一次,上位機(jī)都會(huì)把前面板上設(shè)置的這些參數(shù)轉(zhuǎn)換成字節(jié)數(shù)組通過TCP寫通道發(fā)送給下位機(jī)FPGA,當(dāng)FPGA接收完成并解析出來指令和參數(shù)后,會(huì)立刻把采集到的斜坡信號(hào)通過TCP Client上行通道源源不斷的發(fā)送給上位機(jī)PC服務(wù)器端。

?????? ?此時(shí),下位機(jī)FPGA Client VI前面板上的“Count(20nSec)”分頻系數(shù)變成了2,如圖111-113所示,說明上位機(jī)下發(fā)的TCP參數(shù)和指令成功了,并且“溢出點(diǎn)數(shù)”始終為0,說明下位機(jī)FPGA TCP上行通道即使在25MB/s傳輸速度下,依然穩(wěn)健,沒有發(fā)生數(shù)據(jù)丟失。

圖111-113:下位機(jī)FPGA Client VI接收上位機(jī)下發(fā)的參數(shù)更新之后(25MB/s)

? ? ? ? 同時(shí),上位機(jī)PC服務(wù)器端程序前面板上的波形圖里面出現(xiàn)了從0開始的周期性斜坡信號(hào),如圖111-114所示,這是因?yàn)橄挛粰C(jī)FPGA Client VI只要沒有發(fā)生溢出,并且上位機(jī)讀取的長度始終是下位機(jī)斜坡信號(hào)的整數(shù)倍,波形圖里面的波形就不會(huì)出現(xiàn)亂跳或者左右滑動(dòng)效果。

圖111-114:上位機(jī)PC服務(wù)器端接收的FPGA上傳的周期性斜坡信號(hào)(25MB/s完美)

? ? ? ? 通過打開Windows任務(wù)管理器,可以看到當(dāng)前時(shí)刻的以太網(wǎng)傳輸速度,如圖111-115所示,其中網(wǎng)絡(luò)使用率為21.12%,換算一下就是1Gbps×21.12/100=211.2Mbps=26.4MB/s,算上TCP包頭、MAC、IP地址和CRC等信息,大于有效數(shù)據(jù)的25MB/s完全合理。

圖111-115:通過Windows任務(wù)管理器查看當(dāng)前網(wǎng)絡(luò)傳輸速度(26.4MB/s)

? ? ? ? 5)最后,我們直接一步到位將FPGA采樣率提升到本節(jié)實(shí)驗(yàn)最大值50MS/s,看看會(huì)有什么情況發(fā)生:先將輸入控件“采樣率(10ns)”里面的2改成1,等效采樣率:1×20ns = 20ns <=> 50MS/s <=>400Mbps(位寬是8位U8);其他保持不變,比如,“波形顯示?”按鈕處于點(diǎn)亮狀態(tài),這樣后面就能在波形圖里面看到每次讀取的斜坡信號(hào)了;“拼接?”按鈕依然設(shè)置為熄滅狀態(tài),防止內(nèi)存溢出;輸入控件“size_read_I32”里面的256000,也就是256K個(gè)點(diǎn)保持不變,單位是U8,換算成字節(jié)的話,還是每次讀取256K個(gè)Byte;“開始/停止采集”這個(gè)按鈕要一直點(diǎn)亮。

?????? ?設(shè)置完成后,再點(diǎn)擊一下前面板上的“Send”發(fā)送按鈕(這是一個(gè)觸發(fā)型的控件),每點(diǎn)擊一次,上位機(jī)都會(huì)把前面板上設(shè)置的這些參數(shù)轉(zhuǎn)換成字節(jié)數(shù)組通過TCP寫通道發(fā)送給下位機(jī)FPGA,當(dāng)FPGA接收完成并解析出來指令和參數(shù)后,會(huì)立刻更新前面板上的控件值,如圖111-116所示,可喜的是,“溢出點(diǎn)數(shù)”依然是0,說明下位機(jī)FPGA模擬的ADC采集信號(hào)FIFO沒有溢出丟點(diǎn);同時(shí)會(huì)將采集到的斜坡信號(hào)通過TCP上行通道發(fā)送給上位機(jī)PC服務(wù)器端,此時(shí),上位機(jī)前面板中的波形圖里面顯示出來連續(xù)多個(gè)周期性斜坡信號(hào),并且起點(diǎn)也是從0開始的,如圖111-117所示。并且,Windows任務(wù)管理器里面的網(wǎng)絡(luò)使用率也變成了42%左右,換算一下就是1Gbps×42/100=420Mbps=52.5MB/s,如圖111-118所示。

圖111-116:下位機(jī)FPGA Client VI接收上位機(jī)下發(fā)的參數(shù)更新之后(50MB/s)
圖111-117:上位機(jī)PC服務(wù)器端接收的FPGA上傳的周期性斜坡信號(hào)(50MB/s完美)
圖111-118:通過Windows任務(wù)管理器查看當(dāng)前網(wǎng)絡(luò)傳輸速度(52.5MB/s)

? ? ? ? 有些用戶的反饋,TCP傳輸帶寬還遠(yuǎn)沒有達(dá)到我們預(yù)期的最大105MB/s時(shí),就出現(xiàn)了數(shù)據(jù)丟失呢?這是因?yàn)樯衔粰C(jī)LabVIEW應(yīng)用程序“TCP-讀線程”循環(huán)運(yùn)行太慢了(雖然讀線程里面的延時(shí)已經(jīng)禁用了),導(dǎo)致了上位機(jī)沒有及時(shí)從TCP網(wǎng)絡(luò)緩沖區(qū)里面把數(shù)據(jù)取走導(dǎo)致的。

?????? ?那么下面我們就要把影響這個(gè)“TCP-讀線程”讀取速度的原因找出來,通過仔細(xì)分析發(fā)現(xiàn):程序框圖里面有兩個(gè)因素會(huì)導(dǎo)致while循環(huán)變慢,一是“強(qiáng)制類型轉(zhuǎn)換”函數(shù),二是前面板上的波形圖顯示功能。于是,我們先把前面板上的“顯示波形?”按鈕關(guān)閉,如果數(shù)據(jù)依然丟失,再把“強(qiáng)制類型轉(zhuǎn)換”函數(shù)也禁用掉,因?yàn)檫@個(gè)強(qiáng)制類型轉(zhuǎn)換時(shí)間過長也會(huì)導(dǎo)致TCP讀取變慢,在轉(zhuǎn)換過程中,該VI函數(shù)也會(huì)占據(jù)大量的CPU電腦資源。

?????? ?于是,我們先點(diǎn)擊一下前面板上的“停止”按鈕,把上位機(jī)程序停下來,然后切換到程序框圖,直接將程序框圖里面的“強(qiáng)制類型轉(zhuǎn)換”和“波形顯示”代碼全部禁用掉,如圖111-119所示。然后據(jù)此才能真正測到我們的TCP極限傳輸吞吐率。

圖111-119:將所有影響TCP讀取速度的代碼暫時(shí)禁用掉(目的是測試極限傳輸帶寬)

? ? ? ? 實(shí)際上,無論是在Xillybus官網(wǎng)上還是NI官網(wǎng)上,所有測試任何總線(USB、千兆以太網(wǎng)、PCIe等)極限傳輸帶寬吞吐率時(shí),都需要排除一切干擾因素,否則無法真正測到極限傳輸速度。

?? ?7.5、實(shí)驗(yàn)分析(至關(guān)重要)

?????? ?1)如果某些用戶的電腦性能一般,可以將上位機(jī)PC程序前面板上的“波形顯示”功能關(guān)閉掉,這樣可以進(jìn)一步提高上位機(jī)的TCP讀取效率,以保證下位機(jī)FPGA Client的模擬的ADC數(shù)據(jù)不會(huì)溢出丟失。

?????? ?2)重要結(jié)論:只要上位機(jī)TCP讀線程足夠快,就不會(huì)發(fā)生下位機(jī)FPGA FIFO溢出,所有采集的數(shù)據(jù)都可以通過TCP網(wǎng)絡(luò)傳輸?shù)接?jì)算機(jī)內(nèi)存里面來;在后續(xù)的實(shí)驗(yàn)112極限測試中發(fā)現(xiàn):當(dāng)FPGA采樣率設(shè)置為100MB/s,也就是800Mbps,TCP傳輸都是正常的,因?yàn)槲覀兎庋b的FPGA TCP IP核底層協(xié)議支持的吞吐率最大可以到1Gbps千兆模式。

?????? ?3)有些細(xì)心的用戶發(fā)現(xiàn)了,如果上位機(jī)每次讀取長度不是256的整數(shù)倍時(shí),上位機(jī)波形圖里面的鋸齒波就會(huì)出現(xiàn)左右滑動(dòng),而不是一個(gè)穩(wěn)定狀態(tài),這個(gè)跟示波器原理類似,因?yàn)橄挛粰C(jī)FPGA里面模擬的斜坡信號(hào)周期點(diǎn)數(shù)是256,上位機(jī)要想穩(wěn)定的顯示出來,每次從TCP網(wǎng)絡(luò)緩沖區(qū)里面讀取的點(diǎn)數(shù)就需要滿足整除。

?????? ?4)一定要把上位機(jī)影響CPU和網(wǎng)絡(luò)性能的軟件全部關(guān)閉,特別是todesk、teamview、向日葵等。本節(jié)實(shí)驗(yàn)下位機(jī)FPGA我們?cè)O(shè)計(jì)的定時(shí)循環(huán)最快是50MHz,沒有體現(xiàn)出我們封裝的TCP FPGA Client IP核的真實(shí)極限傳輸帶寬,下一節(jié)實(shí)驗(yàn)112,我們會(huì)單獨(dú)利用125MHz時(shí)鐘域編寫一個(gè)125MB/s極限傳輸程序來驗(yàn)證我們封裝的FPGA TCP極限傳輸速度,盡請(qǐng)期待!

????? ?8、手動(dòng)固化FPGA VI程序(傳統(tǒng)手動(dòng)固化方式,效率低,不推薦,跳過,直接看第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)行批量部署了,也就是把編譯出來的FPGA原始bit文件轉(zhuǎn)成mcs或者bin文件固化到FPGA開發(fā)板上的Flash芯片里面。

?????? ?前面第8節(jié)我們向大家介紹了可以通過Vivado手動(dòng)將FPGA bit文件固化到Flash芯片里面,但是那個(gè)方法過于復(fù)雜,操作起來非常不方便!感興趣的用戶可以自行了解一下即可,無須深入學(xué)習(xí)第8節(jié),除非是一種特殊的情況,那就是你設(shè)計(jì)的FPGA產(chǎn)品賣給了你的用戶,當(dāng)你的FPGA bit文件升級(jí)了,你把最新的bit文件發(fā)給遠(yuǎn)在其他城市的客戶,需要將這個(gè)bit文件重新固化到你的FPGA板子里面去,但是你的客戶又不懂LabVIEW,此時(shí),你可以教他如何利用Vivado進(jìn)行手動(dòng)下載和固化。

?

?????? ?為了讓我們的LabVIEW My FPGA工具包,跟NI FPGA硬件開發(fā)有著相同的用戶體驗(yàn),我們將整個(gè)FPGA bit文件到mcs/bin文件格式的轉(zhuǎn)換、下載器速度的設(shè)置以及各種Flash芯片的選擇,全部在后臺(tái)自動(dòng)完成,極大的方便了用戶的使用!??

?????? 需要注意的是:有些廠家做的FPGA板子為了降低硬件成本,實(shí)際焊接的Flash芯片跟其提供的說明書有時(shí)候?qū)Σ簧?,?dǎo)致固化總是不成功,此時(shí),保險(xiǎn)起見,最好用眼睛實(shí)際觀察一下FPGA板子上Flash芯片的具體型號(hào)和廠家,這種情況時(shí)有發(fā)生!經(jīng)驗(yàn)之談、少走彎路!

?????? ?下面進(jìn)入實(shí)戰(zhàn)操作:將“實(shí)驗(yàn)111-TCP客戶端-Slope-U8-可變采樣率-異步模擬ADC需要大緩存-FPGA.vi”FPGA VI固化到黑金FPGA開發(fā)板的Flash芯片里面。

?????? ?1)首先根據(jù)黑金提供的FPGA開發(fā)板原理圖找到上面的Flash芯片具體型號(hào),比如黑金AX7103開發(fā)板上的Flash芯片都是N25Q128,如圖111-130所示??梢钥闯?,這款Flash容量是128Mbit,換成大B就是16MByte。

圖111-130:黑金AX7103 FPGA開發(fā)板上的Flash芯片型號(hào)

? ? ? ? 2)然后找到黑金FPGA開發(fā)板AX7103對(duì)應(yīng)的終端模板文件所在的路徑,如圖111-131所示。到這個(gè)文件夾里面找到xdc約束文件,打開xdc文件,發(fā)現(xiàn)里面定義了這句話:set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design],如圖111-132所示,那就意味著FPGA VI編譯生成的bit文件內(nèi)部將讀寫位寬設(shè)置的是x4模式。也就是當(dāng)FPGA上電從Flash里面可以通過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固化頁面的下拉列表里面選擇對(duì)應(yīng)的類型即可。右擊該終端下編譯過的“實(shí)驗(yàn)111-TCP客戶端-Slope-U8-可變采樣率-異步模擬ADC需要大緩存-FPGA.vi”FPGA VI名稱,選擇菜單里面的“Download Bit to Flash”,如圖111-133所示;然后在彈出來的頁面里面,F(xiàn)lash芯片型號(hào)選擇N25Q128;容量設(shè)置為16MByte;SPI數(shù)據(jù)讀寫位寬選擇x4模式,如圖111-134所示。

圖111-133:右擊編譯過的“實(shí)驗(yàn)111-TCP客戶端-Slope-U8-可變采樣率-異步模擬ADC需要大緩存-FPGA.vi”FPGA VI名稱選擇Download固化菜單項(xiàng)
圖111-134:根據(jù)黑金AX7103 FPGA開發(fā)板上的Flash型號(hào)和xdc約束文件選擇SPI x4 mode

? ? ? ? 4)最后,點(diǎn)擊頁面“Download”下載按鈕,出現(xiàn)一個(gè)bit文件下載進(jìn)度條,如圖111-135所示;大約等待幾十秒,會(huì)彈出Flash燒寫成功提示框,如圖111-136所示。然后將黑金FPGA開發(fā)板重新上電,就能看到先前我們編寫的“實(shí)驗(yàn)111-TCP客戶端-Slope-U8-可變采樣率-異步模擬ADC需要大緩存-FPGA.vi”FPGA VI程序成功的被加載和運(yùn)行了。

????? ?10、總結(jié)

?????? ?本節(jié)實(shí)驗(yàn)內(nèi)容寫的非常細(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ò)通信開發(fā)的。

?????? ?本節(jié)實(shí)驗(yàn)重點(diǎn)需要理解和掌握TCP Client網(wǎng)絡(luò)通信過程、原理;學(xué)會(huì)我們封裝的下位機(jī)FPGA TCP Client Socket CLIP里面的讀寫通道的調(diào)用及其注意事項(xiàng);學(xué)習(xí)模擬斜坡信號(hào)采集的用戶線程編寫;掌握控制FPGA采樣率的編程方法;學(xué)會(huì)接收并解析上位機(jī)下發(fā)的指令和參數(shù);熟練使用FIFO四線握手制編程方式;最后就是學(xué)習(xí)和掌握LabVIEW上位機(jī)軟件自帶的TCP函數(shù)選板里面的所有函數(shù)(VI)的功能和注意事項(xiàng),做到熟練使用。

?????? ?雖然本節(jié)實(shí)驗(yàn)我們只是模擬了一個(gè)正數(shù)8位位寬(U8)的斜坡信號(hào)采集,并且在后續(xù)的實(shí)驗(yàn)當(dāng)中,我們還會(huì)繼續(xù)教用戶如何模擬一個(gè)帶有正負(fù)號(hào)的Sine信號(hào)采集;等到這些實(shí)驗(yàn)全部學(xué)習(xí)完成后,我們?cè)侔驯緯懊嬲鎸?shí)的AD采集模塊和攝像頭模塊對(duì)應(yīng)的采集線程跟本章的TCP通信融合到一起,實(shí)現(xiàn)一個(gè)真正的基于FPGA的TCP以太網(wǎng)數(shù)據(jù)采集卡或者Gige圖像采集卡。


實(shí)驗(yàn)111-下位機(jī)FPGA TCP客戶端-可變采樣率-異步模擬ADC需要大緩存的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
丹阳市| 西峡县| 固原市| 竹山县| 茂名市| 电白县| 九江市| 祁连县| 侯马市| 阿尔山市| 宣城市| 蓝山县| 荣昌县| 昭觉县| 新源县| 长春市| 思茅市| 册亨县| 南京市| 大石桥市| 遵义市| 丰台区| 古田县| 陆川县| 美姑县| 清水河县| 石门县| 航空| 搜索| 宣威市| 灯塔市| 玉溪市| 阳高县| 台中市| 新邵县| 古浪县| 海林市| 昌乐县| 沙坪坝区| 渝北区| 泗水县|