LabVIEW FPGA番外篇:實(shí)驗(yàn)67-基于LabVIEW FPGA的DDS波形發(fā)生器原理與實(shí)現(xiàn)

1、概述
????????用于生成具有高精度頻率和相位可控的重復(fù)任意波形的一種常用方法是直接數(shù)字合成 (DDS)。本節(jié)實(shí)驗(yàn)向大家展示如何輕松地將DDS波形發(fā)生器添加到用戶自己的LabVIEW FPGA應(yīng)用程序中,并以mHz或更好的相對(duì)頻率控制以及多個(gè)波形之間的精確相位控制輸出波形。
????????通過(guò)在查找表中指定自己的參考波形,大家可以使用本節(jié)實(shí)驗(yàn)提供的DDS框架生成任意波形。這些波形是逐點(diǎn)生成的,只要是生成信號(hào)的硬件所允許范圍內(nèi)的任何形狀都行。另外,還可以在信號(hào)中加入毛刺、漂移、噪聲和其他異常,以便測(cè)試設(shè)備在不在受控環(huán)境中模擬可能遇到的真實(shí)條件。
????????本節(jié)實(shí)驗(yàn)我們會(huì)通過(guò)黑金的Spartan6/Artix7 FPGA開發(fā)板和AD9767 DAC高速模擬輸出模塊(最高更新率125MS/s),利用LabVIEW編寫FPGA程序產(chǎn)生多路相位和幅度可調(diào)的DDS信號(hào)。
2、DDS理論
????????DDS波形發(fā)生器的核心組件是累加器。累加器本質(zhì)上是一個(gè)實(shí)時(shí)計(jì)數(shù)器,用于存儲(chǔ)生成波形的當(dāng)前相位值。累加器更新的速率和累加器增量值決定了生成的波形頻率。
????????例如,如果累加器每秒更新360次且累加器增量為1度,則生成的波形頻率為1Hz(每秒360度)。當(dāng)累加器相位值達(dá)到最大值(360度)時(shí),它會(huì)翻轉(zhuǎn)并從0度重新開始。為了更準(zhǔn)確地表示相位值,累加器通常使用32位、48位或64位作為計(jì)數(shù)器。在32位累加器中,相位值的范圍為0到4294967295,代表波形的一個(gè)完整周期或0到360 度。
????????當(dāng)前累加器(相位)值用于在參考波形的查找表中執(zhí)行查找操作,以確定下一個(gè)輸出值。查找表包含了要生成的波形的一個(gè)完整周期,通常包含代表波形的1024到8192 個(gè)采樣點(diǎn)(量化點(diǎn)數(shù))。
????????由于累加器值通常比參考波形具有更高的分辨率,受樣本數(shù)量的限制,查找操作還可以在參考波形中的兩個(gè)樣本之間執(zhí)行內(nèi)插。這是基于累加器值中的額外分辨率完成的,并返回更準(zhǔn)確的更新值,從而使生成的信號(hào)具備更好的頻率控制和更少的諧波失真。
3、FPGA DDS實(shí)現(xiàn)
????????本節(jié)實(shí)驗(yàn)提供的LabVIEW FPGA項(xiàng)目包含了2個(gè)DDS信號(hào)生成器下位機(jī)FPGA和上位機(jī)PC端的程序,分別如圖1和圖2所示。其中,下位機(jī)FPGA里面兩個(gè)最為核心的兩個(gè)IP核VI內(nèi)部的查找表存儲(chǔ)的信號(hào)波形分別是正弦和三角。


????????下位機(jī)FPGA DDS VI無(wú)需更改即可在用戶自己的FPGA應(yīng)用程序中重復(fù)使用,也可以根據(jù)項(xiàng)目需求進(jìn)行調(diào)整。 其中,F(xiàn)PGA DDS生成器VI(FPGA DDS SineGen IP.vi、FPGA DDS TriangleGen IP.vi)最為核心的是累加器和波形查找兩個(gè)功能。
4.1、累加器
????????DDS發(fā)生器中的累加器是一個(gè)32位計(jì)數(shù)器。每次調(diào)用DDG生成器VI時(shí),累加器都會(huì)將當(dāng)前累加器相位值增加指定的累加器增量。“Saturation Add”函數(shù)會(huì)自動(dòng)回繞,以便當(dāng)達(dá)到最大相位值時(shí),累加器值返回到0,如圖3所示。另外,DDS生成器VI還有一個(gè)重置輸入,用于重新初始化累加器值。這可用于同步同一應(yīng)用程序 VI中使用的多個(gè) DDS 生成器。

4.2、波形查找
????????DDS發(fā)生器的波形查找部分使用當(dāng)前累加器相位值從參考波形查找表返回當(dāng)前波形值。使用可配置的LabVIEW FPGA查找表功能可以輕松存儲(chǔ)參考波形。雙擊查找表Express VI,然后在彈出來(lái)的查找表配置對(duì)話框定義樣本波形的大小和波形值,如圖4所示。本節(jié)實(shí)驗(yàn)我們使用了2048個(gè)樣本的參考波形,作為重復(fù)波形的一個(gè)周期。

????????執(zhí)行查找操作的第一步,是從累加器值應(yīng)用可選的相位偏移。這就允許我們可以精確控制多個(gè)DDS同步發(fā)生器之間的相位偏移,程序框圖如圖5所示。

????????波形輸出的結(jié)果對(duì)應(yīng)當(dāng)前相位,寬度為32位值。本節(jié)實(shí)驗(yàn),我們使用了存儲(chǔ)在查找表中的2048個(gè)樣本作為參考波形。2048個(gè)樣本相當(dāng)于11位樣本分辨率 (2^11 = 2048)。?? ?因此,相位值的前11位確定將使用參考波形中的哪個(gè)樣本。邏輯移位(移位-5)和分割數(shù)函數(shù)將前11位作為一個(gè)值返回,將接下來(lái)的16位作為單獨(dú)的值返回。例如,前11位可能返回的樣本索引是420,如圖6所示。

????????如果要充分使用滿量程的16位相位值,我們可以通過(guò)內(nèi)插參考波形中的兩個(gè)相鄰點(diǎn)來(lái)更準(zhǔn)確地計(jì)算出輸出值。假設(shè)接下來(lái)的16位相位累加器包含值30609。在LabVIEW FPGA查找表函數(shù)中,我們使用的可能范圍為0到65535的16位整數(shù)表示參考波形的兩個(gè)相鄰樣本之間的范圍。在本節(jié)實(shí)驗(yàn)中,所需值 (30609)位于樣本 420到樣本421之間的比例大約是46%,如圖7所示。通過(guò)在參考波形的這兩個(gè)樣本點(diǎn)之間進(jìn)行插值,查找表函數(shù)會(huì)為DDS 返回更準(zhǔn)確的輸出值,從而生成的波形也更加精細(xì)。

????????內(nèi)插輸出值在這個(gè)VI內(nèi)部,可以完成信號(hào)幅度縮放。從查找表返回的值是一個(gè)范圍在-32768到32767之間的有符號(hào)整數(shù)。該值乘以返回I32整數(shù)的信號(hào)幅度,然后按-15 邏輯移位(除以32768)以返回-Signal Amplitude到+Signal Amplitude范圍內(nèi)的值。
????????縮放后的輸出值從FPGA DDS Generator VI輸出,然后傳遞給AO模擬輸出或在FPGA VI中作進(jìn)一步處理。
5、使用單個(gè)FPGA DDS生成器
????????FPGA DDS Generator VI作為子VI放置在用于生成波形信號(hào)的FPGA循環(huán)中。每次調(diào)用DDS發(fā)生器都會(huì)增加累加器并返回波形信號(hào)的下一個(gè)值。DDS生成器VI的輸出被傳遞到DAC模擬輸出節(jié)點(diǎn),或者在FPG上進(jìn)一步處理。
????????本節(jié)實(shí)驗(yàn)里面,DDS發(fā)生器的輸出在更新到模擬輸出之前通過(guò)一個(gè)移位寄存器,如圖8所示。這種流水線技術(shù)允許DDS發(fā)生器和AO模擬輸出(比如黑金的AD9767雙通道DAC模塊)并行運(yùn)行,可以實(shí)現(xiàn)更高的物理輸出更新率,當(dāng)然,還可以將DDS信號(hào)通過(guò)FIFO傳遞給其他定時(shí)循環(huán)使用!

6、同步多個(gè)DDS生成器
????????我們將FPGA DDS生成器VI配置成“可重入子VI”,這樣用戶就可以在一個(gè)FPGA VI里面放置多個(gè)DDS生成器。在一個(gè)程序中使用多個(gè)DDS發(fā)生器的一種常見應(yīng)用是生成大量具有可變幅度和相位偏移的同步波形信號(hào)。
????????在下面圖9所示的范例程序里面,分別給3路DDS信號(hào)設(shè)置了不同的頻率(累加器增量)、相移和信號(hào)幅度,然后將一個(gè)復(fù)位按鈕同時(shí)接到這3個(gè)DDS生成VI上,重置一下累加器標(biāo)志,即可使這3個(gè)DDS發(fā)生器同步生成具有指定相位偏移的信號(hào)。

7、DDS發(fā)生器主機(jī)接口(上位機(jī)PC控制)
????????為了更加靈活的控制下位機(jī)FPGA按照實(shí)際的項(xiàng)目需求產(chǎn)生指定的DDS信號(hào),這里有很多中間參數(shù)需要進(jìn)行計(jì)算和轉(zhuǎn)換,如果大家使用黑金的Spartan6開發(fā)板(AX516),可以直接在上位機(jī)通過(guò)FPGA Reference引用訪問(wèn)控件的方式來(lái)更新控制下位機(jī)FPGA VI;如果用戶使用的是ARTIX7或者KINTEX7開發(fā)板,可以將上位機(jī)PC端的參數(shù)通過(guò)串口、USB、網(wǎng)口或者PCIe下發(fā)給下位機(jī)FPGA。
????????下面給出了基于黑金超高性價(jià)比的Spartan6 FPGA開發(fā)板對(duì)應(yīng)的上位機(jī)PC端控制程序前面板,如圖10所示;對(duì)應(yīng)的程序框圖,如圖11所示。


????????為了計(jì)算累加器增量,我們將所需的波形頻率乘以累加器的范圍,等于每秒的總相位累積,再除以更新循環(huán)的頻率,即可得到我們每次更新需要的增量。
????????舉例說(shuō)明:假設(shè)我們需要產(chǎn)生頻率為20kHz的波形,首先計(jì)算出累加器需要每秒向上計(jì)數(shù)20000×(2^32)>>85899345920000,然后除以前面板上的1MHz更新率,就得到了累加器增量值:85899346。
????????相移作為一個(gè)完整周期的比率,可以看做是累加器的范圍。45度相移是一個(gè)周期 (45/360)的0.125,所以對(duì)于累加器相移,可以換算出結(jié)果: 0.125*(2^32)=536870912。
????????信號(hào)幅度與實(shí)際的AO模擬輸出范圍相關(guān),比如16位的DAC模擬輸出電壓如果是±10V,那么要想輸出5V電壓,對(duì)于的16進(jìn)制整形DAC數(shù)值就是16384。
????????以上計(jì)算過(guò)程可以通過(guò)下面的程序框圖12,一目了然!最后,我們給出基于黑金Spartan6開發(fā)板+AD9767雙通道高速DAC模塊的完整FPGA DDS程序框圖,如圖13所示。
?

