校園網(wǎng)站規(guī)劃與建設(shè)工具大全
1、實(shí)驗(yàn)內(nèi)容
現(xiàn)在很多電腦PC或者工控機(jī)主板上面都集成了PCIe插座,可以直接插入PCIe板卡,優(yōu)點(diǎn)是卡槽標(biāo)準(zhǔn),插拔簡單,傳輸速度極快。對(duì)于高速采集測試測量領(lǐng)域,PCIe用途非常廣泛,最大極限帶寬可以到6.6GB/s,這個(gè)速度可以直接用來做高速示波器卡、數(shù)字化儀、RF射頻板卡和視頻采集卡了。
本節(jié)實(shí)驗(yàn)我們準(zhǔn)備采用黑金提供的AN108模塊(AD9280),上面有一顆8位高速ADC芯片,結(jié)合PCIe總線實(shí)現(xiàn)一個(gè)采樣率(最大32MS/s)可調(diào)節(jié)的PCIe數(shù)據(jù)采集卡,直接插到PC或者工控機(jī)或者工業(yè)樹莓派上使用。
下面我們先來回顧一下PCIe接口和AN108硬件模塊等相關(guān)內(nèi)容。
黑金設(shè)計(jì)的ARTIX7-100T FPGA開發(fā)板(AX7103)上已經(jīng)把PCIe接口引出來了,做成了X4接口模式,如圖61-1所示。
圖61-1:帶PCIe X4接口的Aritx7 FPGA開發(fā)板(黑金AX7103)
用戶可以直接將這個(gè)開發(fā)板插到工控機(jī)或者電腦主板上的PCIe母座里面,由于PCIe不支持熱插拔,所以用戶接入的時(shí)候,一定把機(jī)箱電源關(guān)掉,防止燒壞板卡;當(dāng)然,如果用戶閑PCIe插拔比較麻煩,還可以到淘寶上買一根PCIe延長線,將機(jī)箱里面的PCIe母座引出來,方便做實(shí)驗(yàn)。
由于我們已經(jīng)把復(fù)雜的PCIe DMA通信協(xié)議封裝成了LabVIEW FPGA下的Socket CLIP,用戶只需要根據(jù)四線握手協(xié)議來調(diào)用對(duì)應(yīng)的CLIP端口就可以了。 這部分我們?cè)谇懊鎺坠?jié)里面已經(jīng)介紹過了。
本節(jié)PCIe DMA通信實(shí)驗(yàn)重點(diǎn)向大家講解以下8個(gè)方面的內(nèi)容:
- PCIe DMA通信下位機(jī)(FPGA)應(yīng)用程序開發(fā)。
- PCIe 硬件驅(qū)動(dòng)加載與識(shí)別(INF文件)。
- PCIe DMA通信上位機(jī)(PC)應(yīng)用程序開發(fā)。
- FPGA內(nèi)部多線程之間的數(shù)據(jù)交互與數(shù)據(jù)緩沖:FIFO。
- FPGA內(nèi)部不同速率之間的匹配機(jī)制:四線握手。
- PCIe DMA通信IP核全雙工通信的讀寫機(jī)制。
- PCIe DMA通信數(shù)據(jù)格式和類型轉(zhuǎn)換(大小端與字節(jié)數(shù)組)(下行和上行都是小端)。
- 8位ADC芯片的數(shù)據(jù)讀取方法(參考本書前面的“實(shí)驗(yàn)14:8位ADC數(shù)據(jù)采集實(shí)驗(yàn)-AD9280”)
關(guān)于PCIe DMA下位機(jī)(FPGA)通信應(yīng)用程序開發(fā),指的是FPGA芯片中的代碼編寫。譬如,本節(jié)實(shí)驗(yàn)我們準(zhǔn)備開發(fā)一個(gè)基于PCIe 傳輸?shù)母咚俨杉?,將ADC采集到的數(shù)據(jù)通過PCIe DMA實(shí)時(shí)發(fā)送到PC上,這段代碼我們可以利用圖形化的LabVIEW編程語言來開發(fā),替代傳統(tǒng)的VHDL/Verilog語言,這里我們稱之為下位機(jī)LabVIEW FPGA編程。本節(jié)實(shí)驗(yàn)下位機(jī)FPGA程序里面的用戶線程,我們會(huì)利用AD9280芯片(8位)采集外部真實(shí)的Sine正弦信號(hào),然后發(fā)送到上位機(jī)進(jìn)行顯示或者流盤。
關(guān)于PCIe 硬件驅(qū)動(dòng)加載與識(shí)別,可以參考前面7.3.2節(jié)里面的內(nèi)容,不熟悉的用戶一定要看一下,因?yàn)檫@個(gè)起到承上啟下的作用。
關(guān)于PCIe DMA通信上位機(jī)(PC端)應(yīng)用程序開發(fā),指的是運(yùn)行在windows或者linux系統(tǒng)中的LabVIEW上位機(jī)程序,用戶可以通過LabVIEW調(diào)用我們封裝好的FPGA PCIe lvlib庫里面的多態(tài)VI與下位機(jī)FPGA進(jìn)行PCIe DMA通信交互。我們把上位機(jī)收發(fā)線程分成兩個(gè)獨(dú)立的while循環(huán)來處理,這樣調(diào)試起來方便一些。當(dāng)然,如果有些用戶不會(huì)LabVIEW,也可以使用C\C++\C#\Python來調(diào)用我們封裝好的DLL驅(qū)動(dòng)進(jìn)行上位機(jī)程序開發(fā)。
關(guān)于FIFO的概念和操作,可以參考前面的“實(shí)驗(yàn)4-串口通信”,里面有詳細(xì)的介紹和演示過程。
關(guān)于四線握手制的工作過程和原理,也可以參考前面的“實(shí)驗(yàn)4-串口通信”,這里不再贅述。
關(guān)于PCIe DMA通信IP核全雙工通信機(jī)制,我們會(huì)通過兩個(gè)獨(dú)立的收發(fā)線程來演示。發(fā)送和接收可以同時(shí)并行執(zhí)行,而且是8個(gè)上行和8個(gè)下行同時(shí)全雙工工作。
最后一個(gè)需要注意的問題是,PCIe DMA下位機(jī)跟上位機(jī)之間的通信數(shù)據(jù)格式和數(shù)據(jù)類型,需要匹配上才能正確解析,因?yàn)閄illybus底層IP核走的是小端格式,而上位機(jī)LabVIEW里面默認(rèn)是大端格式,因此,在前面7.4節(jié)里面,強(qiáng)調(diào)了FPGA里面數(shù)據(jù)格式轉(zhuǎn)換的重要性;另外,模擬或者采集的AD波形,對(duì)應(yīng)的數(shù)據(jù)類型跟PCIe內(nèi)部的字節(jié)數(shù)組之間需要通過“強(qiáng)制類型轉(zhuǎn)換”函數(shù)轉(zhuǎn)換一下才能看到正確的波形曲線。
下面帶著大家一起,利用LabVIEW編寫符合標(biāo)準(zhǔn)四線握手制的PCIe DMA總線收發(fā)FPGA程序,來實(shí)現(xiàn)一個(gè)基于FPGA的PCIe 8位數(shù)據(jù)采集卡(最大采樣率32MS/s,采集電壓范圍±5V),采集外部真實(shí)的Sine正弦信號(hào),通過PCIe總線發(fā)送給上位機(jī)PC,同時(shí)還能接收上位機(jī)PC下發(fā)的指令和參數(shù)對(duì)FPGA板卡進(jìn)行采樣率和使能采集等控制。
2、硬件資源
2.1、先回顧一下PCIe總線接口方面的硬件知識(shí)
黑金設(shè)計(jì)的帶PCIe接口的ARTIX7開發(fā)板,內(nèi)部走線連接示意圖如圖61-2所示。可以看出,PCIe時(shí)鐘走線是經(jīng)過AC耦合的。一共使用了4對(duì)差分收發(fā)總線,所以最大位寬支持X4模式。
圖61-2:Aritx7 FPGA開發(fā)板內(nèi)部的PCIe走線連接示意圖
打開本書配套的光盤/云盤里面1號(hào)文件夾里面的AX7103底板原理圖,然后找到PCIe接口這部分原理圖,如圖61-3所示。
圖61-3:打開PCIe底板原理圖,找到PCIe總線互聯(lián)的3大類引腳
這些引腳其實(shí)可以分成3類:PCIe總線復(fù)位引腳;PCIe總線差分時(shí)鐘輸入引腳;PCIe總線不同位寬的差分?jǐn)?shù)據(jù)引腳。這3類引腳在前面圖7-52里面都定義過了,如果用戶自己畫的板子或者網(wǎng)上買的其他家的板子引腳定義不一樣,那么照葫蘆畫瓢對(duì)應(yīng)修改一下就可以了。
然后,打開插在AX7103開發(fā)板上的核心板AC7100原理圖,找到PCIe復(fù)位引腳,就是J20,如圖61-4所示。接著需要尋找一下PCIe的差分時(shí)鐘引腳,這個(gè)引腳非常重要,如果找不到或者設(shè)置不對(duì),那么PCIe總線肯定初始化不了;在核心板原理圖上可以看到有兩個(gè)MGT_CLK信號(hào),但是實(shí)際接到PCIe插槽的是MGT_CLK1,也就是F10,如圖61-5所示。
圖61-4:在AC7100核心板上找到PCIe復(fù)位引腳:J20
圖61-5:在核心板AC7100原理圖上找到PCIe差分時(shí)鐘輸入引腳:F10
但是細(xì)心的用戶可能發(fā)現(xiàn)了,黑金的AC7100核心板在畫板子布局布線的時(shí)候,將PCIe X4模式下的數(shù)據(jù)收發(fā)差分對(duì)引腳0和1弄反了,2和3是對(duì)的,如圖61-6所示。這個(gè)細(xì)節(jié)導(dǎo)致無數(shù)用戶付出了慘痛代價(jià)。很多用傳統(tǒng)Verilog開發(fā)FPGA的用戶,看原理圖不仔細(xì),或者說黑金太隨意了,為了自己的布局方便,把0跟1故意調(diào)換了一下,那么在Vivado里面默認(rèn)的PCIe引腳就不對(duì)了,必須要人為調(diào)整才行。
圖61-6:仔細(xì)檢查一下PCIe X4或者X8數(shù)據(jù)差分對(duì)順序是否正確
為了方便我們廣大LabVIEW FPGA用戶開發(fā),我們特地在頂層xdc里面將PCIe X4全部引腳定義拉出來,用戶只要自己根據(jù)實(shí)際情況修改就行,而無需在網(wǎng)表里面定義,簡化了編程的繁瑣,也避免了一些不必要的錯(cuò)誤。希望這一點(diǎn)能夠引起開發(fā)者的注意?。?!重要的事情說三遍,0跟1互換了,所以引腳定義也要變,如圖61-7所示。
圖61-7:PCIe數(shù)據(jù)差分對(duì)引腳要跟原理圖保持一致
2.2、再回顧一下8位高速ADC芯片AD9280相關(guān)的硬件內(nèi)容
本節(jié)實(shí)驗(yàn)需要用到的ADC采集模塊是黑金設(shè)計(jì)的AN108高速AD/DA模塊,這款模塊上面同時(shí)集成了AD和DA芯片,可以直接插到AX7103開發(fā)板的擴(kuò)展口上面,簡單易用。
本節(jié)實(shí)驗(yàn)我們開發(fā)的是PCIe采集卡,所以會(huì)用到AN108模塊上的AD芯片9280,另外一塊DA芯片我們?cè)诤罄m(xù)的PCIe函數(shù)信號(hào)發(fā)生器板卡實(shí)驗(yàn)里面會(huì)用到。
AD9280芯片位于AN108的左下角,如圖61-8所示。精度不高,只有8位,但是采樣率很高,最高可以達(dá)到32MS/s。
圖61-8:AN108模塊上的AD9280芯片實(shí)物圖
AD9280這款芯片的內(nèi)部結(jié)構(gòu)圖,如圖61-9所示。可以看出,芯片內(nèi)部有個(gè)1V的基準(zhǔn)參考電壓,所以這款芯片的輸入范圍是02V。對(duì)用戶來說,只要給定一個(gè)CLK采樣時(shí)鐘信號(hào),然后直接讀取Data0Data7引腳上的數(shù)據(jù)就可以了。
圖61-9:AD9280芯片內(nèi)部結(jié)構(gòu)圖
打開本書配套的光盤/云盤1號(hào)文件夾里面的AN108模塊原理圖,找到AD9280芯片這部分接線原理圖,如圖61-10所示。
圖61-10:AD9280電路原理圖
AD9280芯片上的AIN輸入范圍比較小,只有0~2V,很難滿足實(shí)際應(yīng)用,所以我們還需要在信號(hào)進(jìn)入AD芯片之前,加上一片AD8065芯片構(gòu)建前端衰減電路,如圖61-11所示。
圖61-11:AD8065衰減電路原理圖
AD8065芯片可以將AN108模塊BNC接口的實(shí)際輸入電壓范圍-5V-+5V(10Vpp)衰減后變成滿足 AD9280芯片所能接受的輸入電壓范圍(0~2V)。二者之間的轉(zhuǎn)換公式如下。
? 當(dāng)AN108模塊BNC端的輸入電壓Vin=5(V)的時(shí)候,衰減后到AD的信號(hào)Vad=2(V)。
? 當(dāng)AN108模塊BNC端的輸入電壓Vin=-5(V)的時(shí)候,衰減后到AD的信號(hào)Vad=0(V)。
黑金在設(shè)計(jì)AN108這個(gè)模塊的時(shí)候,1腳和2腳分別表示GND和VCC,所以在把這個(gè)模塊插入到AX7103開發(fā)板右上角的40針擴(kuò)展口(J11)上,模塊的Pin1腳和開發(fā)板擴(kuò)展口的 Pin1 腳要對(duì)齊,如圖61-12所示。
圖61-12:AN108模塊的1腳和2腳必須與主板一致
通過查看AN108模塊與AX7103擴(kuò)展口之間的線序關(guān)系,可以發(fā)現(xiàn)AD9280的8位數(shù)據(jù)引腳和轉(zhuǎn)換時(shí)鐘CLK引腳分別占用的是擴(kuò)展口J11的21~29號(hào)引腳,如圖61-13所示。
圖61-13:AN108模塊上的AD芯片9280占用的擴(kuò)展口引腳序號(hào)
然后在AX7103主板原理圖里面找到擴(kuò)展口J11上面的這些引腳序號(hào),如圖61-14所示。通過與FPGA芯片引腳逐一對(duì)比可以找到二者之間的映射關(guān)系,如圖61-15所示。
圖61-14:FPGA開發(fā)板上的擴(kuò)展口引腳序號(hào)圖
圖61-15:AD9280芯片與FPGA引腳映射關(guān)系
3、FPGA PCIe DMA下位機(jī)ADC采集程序開發(fā)(AD9280)
下面,我們帶著用戶一起利用LabVIEW開發(fā)一個(gè)FPGA PCIe DMA下位機(jī)FPGA數(shù)據(jù)采集應(yīng)用程序,這個(gè)程序可以下載到FPGA芯片里面運(yùn)行,為了更加全面形象的展示PCIe總線通信的魅力,我們模擬一個(gè)PCIe高速數(shù)據(jù)采集卡,將8位AD芯片采集到的Sine正弦信號(hào)通過64位位寬的PCIe DMA上行通道ch0發(fā)送到上位機(jī)進(jìn)行顯示,上位機(jī)通過8位位寬的下行通道ch4下發(fā)不同的指令參數(shù)來控制FPGA開始采集、停止采集和調(diào)整采集頻率。以此向大家展示FPGA與PC之間通過PCIe總線進(jìn)行雙向高速通信的過程。
提醒:之所以使用64位位寬的ch0作為ADC數(shù)據(jù)上行通道,而沒有選擇位寬剛好是8位的ch4/5/6/7,是因?yàn)槲覀兲峁┑腂版本PCIE Data CLIP模板里面,ch4/5/6/7通道的吞吐率比較低,只有幾MB/s,而AD9280芯片的最大采樣率可以到32MS/s,換算成字節(jié)為單位,也就是32MB/s;當(dāng)然我們可以在Xillybus官網(wǎng)上重新修改每個(gè)通道的帶寬,但是需要重新編譯。為此,這里我們給用戶演示另外一種實(shí)現(xiàn)方式,就是并轉(zhuǎn)串,將ADC每個(gè)采樣周期讀取的8位數(shù)據(jù)(U8)按照小端格式(因?yàn)镻CIe CLIP通道默認(rèn)是小端格式)拼接成64位(U64),再經(jīng)過ch0發(fā)送到上位機(jī)PC,因?yàn)閏h0的帶寬是720MB/s,可以完全勝任AD9280的極限采樣率。
3.1、LabVIEW FPGA項(xiàng)目創(chuàng)建
1)啟動(dòng)LabVIEW 2015 SP1軟件,用戶可以點(diǎn)擊左上角的“文件>>新建”或者直接點(diǎn)擊“新建”下方的“項(xiàng)目”選項(xiàng)。這里我們也可以直接打開前面實(shí)驗(yàn)里面已經(jīng)創(chuàng)建好的“My_FPGA_Starter_Board_Artix7_AX7103.lvproj”這個(gè)項(xiàng)目,如圖61-16所示。
圖61-16:打開前面創(chuàng)建過的LabVIEW項(xiàng)目
由于本章我們引入了PCIe總線通信,之前創(chuàng)建的FPGA終端里面沒有添加PCIe Socket CLIP,所以,我們需要先右擊“我的電腦”選擇新建“終端和設(shè)備”,如圖61-17所示;然后再在彈出來的FPGA終端選擇列表里面,選擇一個(gè)帶PCIe X4接口8通道的ARTIX7-100T FPGA終端設(shè)備,如圖61-18所示。其中,B版本的PCIe總線帶寬要比A版本的高一倍,也就是800MB/s,本書我們選擇B版本進(jìn)行測試,A版本感興趣的用戶可以自行測試。點(diǎn)擊“確定”按鈕后,創(chuàng)建好的ARTIX7 PCIe FPGA終端設(shè)備如圖61-19所示。
提醒:新建含有FPGA PCIe Socket CLIP的過程,在前面實(shí)驗(yàn)54里面已經(jīng)創(chuàng)建過了,所以這里可以忽略,如果是用戶自己新建的項(xiàng)目,那么參考上面的步驟走一遍就可以了。
圖61-17:右擊我的電腦選擇新建“終端和設(shè)備”
圖61-18:選擇一個(gè)PCIe X4 8通道的B版本ARTIX7-100T FPGA終端
圖61-19:創(chuàng)建成功后的ARTIX7 FPGA PCIe終端設(shè)備
2)右擊FPGA終端,選擇“新建>>虛擬文件夾”,如圖61-20所示。將添加到FPGA終端里面的虛擬文件夾,重命名為“實(shí)驗(yàn)61-PCIe DMA+8位ADC(模擬數(shù)據(jù)采集卡)”,如圖61-21所示。
圖61-20:右擊FPGA終端,新建一個(gè)虛擬文件夾
圖61-21:將虛擬文件夾重命名為“實(shí)驗(yàn)61-PCIe DMA+8位ADC(模擬數(shù)據(jù)采集卡)”
3.2、LabVIEW FPGA EIO節(jié)點(diǎn)與FIFO創(chuàng)建
1) 新建按鍵KEY和LED燈的EIO節(jié)點(diǎn)
(1)由于本節(jié)所有的PCIe通信實(shí)驗(yàn)里面都會(huì)用到LED指示燈和按鍵KEY等EIO資源,所以,我們可以在FPGA終端上面右擊,選擇“新建>>FPGA I/O”,如圖61-22所示。然后在彈出來的I/O資源選擇對(duì)話框里面,找到AX7103 FPGA開發(fā)板上的LED和KEY對(duì)應(yīng)的管腳資源,如圖61-23所示。單擊對(duì)話框中間的“向右箭頭”按鈕,將這些引腳對(duì)應(yīng)的EIO節(jié)點(diǎn)添加到右側(cè)的FPGA資源列表里面,如圖61-24所示。
提醒:實(shí)際上LED燈和按鍵KEY的EIO節(jié)點(diǎn)在前面實(shí)驗(yàn)54里面已經(jīng)創(chuàng)建過了,所以這里可以忽略,如果是用戶自己新建的項(xiàng)目,那么參考上面的步驟做一遍就可以了。
圖61-22:新建FPGA I/O EIO節(jié)點(diǎn)
圖61-23:找到AX7103開發(fā)板上LED指示燈和KEY按鍵對(duì)應(yīng)的EIO節(jié)點(diǎn)
圖61-24:將LED和KEY EIO節(jié)點(diǎn)全部添加到右側(cè)的可用列表中
點(diǎn)擊“確定”按鈕后,這些EIO節(jié)點(diǎn)會(huì)被添加到FPGA終端項(xiàng)目里面,如圖61-25所示。
圖61-25:LED燈和KEY按鍵的EIO節(jié)點(diǎn)被添加到FPGA終端項(xiàng)目里面
(在前面做實(shí)驗(yàn)54的時(shí)候已經(jīng)添加過了)
2) 新建AD9280芯片對(duì)應(yīng)的EIO節(jié)點(diǎn)
(1)右擊“FPGA終端 3”,選擇“新建>>FPGA I/O”,如圖61-26所示。然后在彈出來的I/O資源選擇對(duì)話框里面,找到AN108模塊上的AD9280芯片對(duì)應(yīng)到AX7103 FPGA開發(fā)板J11擴(kuò)展口關(guān)聯(lián)的管腳資源(10P~14P),如圖61-27所示。單擊對(duì)話框中間的“向右箭頭”按鈕,將這些引腳資源添加到右側(cè)的FPGA資源列表里面,如圖61-28所示。因?yàn)?,Vivado編譯器不支持同一個(gè)物理IO在xdc約束文件里面有多處定義,所以這里我們直接使用原始的擴(kuò)展口IO名稱。
圖61-26:新建FPGA I/O EIO節(jié)點(diǎn)
圖61-27:找到AD9280對(duì)應(yīng)FPGA(XC7A100T)芯片上的引腳EIO節(jié)點(diǎn)
圖61-28:將AD9280芯片的EIO節(jié)點(diǎn)添加到右側(cè)的可用列表中
點(diǎn)擊“確定”按鈕后,這些EIO節(jié)點(diǎn)被添加到FPGA終端項(xiàng)目里面,如圖61-29所示。
圖61-29:AD9280芯片EIO節(jié)點(diǎn)被添加到FPGA終端項(xiàng)目里面
3) 新建FIFO
我們可以將PCIE通信IP核看成一個(gè)獨(dú)立的功能模塊,類似MCU里面的子函數(shù)或者子VI,F(xiàn)PGA程序只需要關(guān)心如何將不同類型的數(shù)據(jù)(U64、U32、U16、U8)通過PCIe總線發(fā)送出去以及收到的數(shù)據(jù)怎么反饋給FPGA用戶程序,這個(gè)中間的橋梁,可以采用FIFO緩沖區(qū)來實(shí)現(xiàn)。FIFO非常適合在不同的線程之間傳遞數(shù)據(jù),而且設(shè)計(jì)合理的話,數(shù)據(jù)不會(huì)丟失或者被覆蓋。
注意:FPGA用戶線程相當(dāng)于生產(chǎn)者,PCIe DMA發(fā)送線程相當(dāng)于消費(fèi)者,所以,二者之間有個(gè)速率匹配的問題,生產(chǎn)者發(fā)送數(shù)據(jù)的速度不能快于消費(fèi)者。比如,本節(jié)實(shí)驗(yàn)里面,我們使用的8位AD9280芯片最大采樣率是32MS/s,需要的通道帶寬至少大于32MB/s的上行通道(默認(rèn)情況下,能滿足這個(gè)指標(biāo)的只有ch0和ch1)才能把下位機(jī)FPGA采集的數(shù)據(jù)無損的傳輸給上位機(jī)PC,否則會(huì)造成數(shù)據(jù)丟失。后面我們會(huì)根據(jù)具體程序進(jìn)一步分析二者之間的速度匹配問題。
(1)右擊FPGA終端項(xiàng)目,選擇新建一個(gè)子的“虛擬文件夾”,如圖61-30所示。然后重命名為“FIFO_ADC”,這個(gè)虛擬文件夾專門用來存放接下來我們創(chuàng)建的各種ADC芯片的FIFO緩沖區(qū)資源,如圖61-31所示。
圖61-30:新建一個(gè)子虛擬文件夾
圖61-31:將虛擬文件夾重命名為“FIFO_ADC”
(2)右擊子虛擬文件夾“FIFO_ADC”,選擇“新建>>FIFO”,如圖61-32所示。
提醒:考慮到后續(xù)我們需要將8個(gè)8位的AD92