2.13 信號(hào)發(fā)生器和DA轉(zhuǎn)換-明德?lián)P至簡(jiǎn)設(shè)計(jì)法原理與應(yīng)用
本文的文檔編號(hào):000400000024
需要看對(duì)應(yīng)的視頻,請(qǐng)點(diǎn)擊視頻編號(hào):002400000450
1、本文檔講述FPGA產(chǎn)生正弦波數(shù)據(jù),通過(guò)DA轉(zhuǎn)換,然后傳到示波器進(jìn)行觀察
2、801開(kāi)發(fā)板使用
1項(xiàng)目背景
1.1信號(hào)發(fā)生器?
? ? ? ?
信號(hào)發(fā)生器又稱(chēng)信號(hào)源或振蕩器,是一種能提供各種頻率、波形和輸出電平電信號(hào)的設(shè)備,在測(cè)量各種電信系統(tǒng)或電信設(shè)備的振幅特性、頻率特性、傳輸特性及其它電參數(shù)時(shí),以及測(cè)量元器件的特性與參數(shù)時(shí),用作測(cè)試的信號(hào)源或激勵(lì)源,在生產(chǎn)實(shí)踐和科技領(lǐng)域中有著廣泛的應(yīng)用。 直接數(shù)字式頻率合成器(DDS)是將先進(jìn)的數(shù)字處理理論與方法引入頻率合成的一項(xiàng)新技術(shù),它把一系列數(shù)字量形式的信號(hào)通過(guò)數(shù)/模轉(zhuǎn)換器轉(zhuǎn)換成模擬量形式的信號(hào)。?

圖483
上圖是一個(gè)典型的DDS工程。DDS一般可分為相位累加器、信號(hào)轉(zhuǎn)換器和DAC。
DDS的輸入是頻率控制字,它用來(lái)控制相位累加器每次增加的相位值,相當(dāng)于一個(gè)步進(jìn)值。
相位累加器:每來(lái)一個(gè)時(shí)鐘脈沖,就會(huì)在原來(lái)相位值的基礎(chǔ)上,加上頻率控制字的值,得到最新的相位值,將相位值將輸出給信號(hào)轉(zhuǎn)換器。
信號(hào)轉(zhuǎn)換器:一般轉(zhuǎn)換器內(nèi)部有一片ROM,事先保存了要產(chǎn)生波形的幅度值。根據(jù)輸入的的相位值,就能輸出該相位值所對(duì)應(yīng)的信號(hào)幅度值。例如將一個(gè)完整周期的正弦波等距離分成128份,并保存到轉(zhuǎn)換器的ROM當(dāng)中。當(dāng)相位值為0時(shí),就輸出相位為0所應(yīng)對(duì)的幅度值;當(dāng)相位為100時(shí),就輸出相位為100所對(duì)應(yīng)的幅度值。
具體的工作過(guò)程是由N位相位累加器、N位加法器和N位累加寄存器組成。每來(lái)一個(gè)時(shí)鐘脈沖,N位加法器將頻率控制字K與N位累加寄存器輸出的累加相位數(shù)據(jù)相加,并把相加后的結(jié)果送至累加寄存器的輸入端。累加寄存器一方面將上一時(shí)鐘周期作用后所產(chǎn)生的新的相位數(shù)據(jù)反饋到加法器的輸入端,使加法器在下一時(shí)鐘的作用下繼續(xù)與頻率控制字K相加;另一方面將這個(gè)值作為取樣地址送入幅度/相位轉(zhuǎn)換電路,幅度/相位轉(zhuǎn)換電路根據(jù)這個(gè)地址輸出相應(yīng)的波形數(shù)據(jù)。最后經(jīng)D/A轉(zhuǎn)換器和 LPF將波形數(shù)據(jù)轉(zhuǎn)換成所需要的模擬波形。
1.2DA轉(zhuǎn)換
明德?lián)P教學(xué)板板載雙通道、125MHz轉(zhuǎn)換速率、8bi的高速DA芯片,滿(mǎn)足常用信號(hào)發(fā)生器、濾波信號(hào)輸出等需求。實(shí)際位置如下所示:

圖484
芯片型號(hào)是AD9709,AD9709是一款雙端口、高速、雙通道、8位CMOS DAC,其中集成兩個(gè)高品質(zhì)8位TxDAC+?內(nèi)核、一個(gè)基準(zhǔn)電壓源和數(shù)字接口電路,采用48引腳小型LQFP封裝。它提供出色的交流和直流性能,同時(shí)支持最高125 MSPS的更新速率。

圖485

圖486
與FPGA相連的信號(hào)有:DA_CLKA、DA_CLKB、DAC_DB7~0、DAC_DA7~0,DAC_MODE、DAC_SLEEP、DA_WRA和DA_WRB。

1.3AD9709的時(shí)序
AD9709的控制時(shí)序如下圖。

圖487
在雙通道模式中,通道A和通道B就如兩個(gè)獨(dú)立的DA芯片。其中DA_CLKA、DAC_DA7~0、DAC_WR_A用于控制通道A,DA_CLKB、DA_DB7~0、DA_WRB用于控制通道B。
以控制通道A為例,時(shí)序圖要求,要先將數(shù)據(jù)輸出到DAC_DA7~0,然后經(jīng)過(guò)ts時(shí)間后,將DAC_WRA和DA_CLKA變高,此時(shí)DAC就將數(shù)據(jù)鎖住,經(jīng)過(guò)一段時(shí)間后,就會(huì)輸出數(shù)據(jù)所對(duì)應(yīng)的電流,經(jīng)過(guò)電路轉(zhuǎn)換后就變成對(duì)應(yīng)電壓了。
時(shí)序圖中要注意幾點(diǎn)(數(shù)據(jù)手冊(cè)有詳細(xì)說(shuō)明)
1. DA_CLKA并且超前于或者同時(shí)與DA_WRA由0變1。
2.圖中tS(DAC_WRA上升沿前數(shù)據(jù)保持不變的時(shí)間)、tH(DAC_WRA上升沿后數(shù)據(jù)保值不變的時(shí)間)、tLPW(DAC_WRA的高電平時(shí)間)、tCPW(DAC_CLKA的高電平時(shí)間)等參數(shù),查詢(xún)數(shù)據(jù)手冊(cè),可以得到如下參數(shù)表。從表中可以看到tS的時(shí)間至少是2ns;tH時(shí)間至少是1.5ns;tLPW、tCPW時(shí)間至少是3.5ns。圖中規(guī)定了至少,只要大于要求都是可以的。

圖488
通道B的時(shí)序要求和通道A是相同的,僅是控制信號(hào)不同。
明德?lián)P教學(xué)板的AD9709的兩個(gè)通道,均支持0.48~2.2V的電壓輸出,這個(gè)輸出電壓與輸入數(shù)據(jù)的關(guān)系,可用下面的公式表示:
通道A的輸出電壓= -1.72 * (DAC_DA /255) + 2.2 V
通道B的輸出電壓= -1.72 * (DAC_DB/255) + 2.2 V

由公式可見(jiàn),輸出電壓與DAC_DA/B的值是成線性反比例關(guān)系,最低電壓為0.48V,最高為2.2V。需要指出的是,由于電路原理圖的原因才導(dǎo)致電壓在此范圍,不同電路實(shí)現(xiàn)是不相同的。
2設(shè)計(jì)目標(biāo)
本次案例將使用到采樣率大于100M的示波器。將示波器和教學(xué)板上的通道1連接,如下圖所示。

圖489
本案例是要讓DA輸出不同頻率的正弦波。共輸出方式如下:
1.連續(xù)輸出2個(gè)周期為6.25MHz的正弦波,其中每個(gè)正弦波輸出16個(gè)采樣點(diǎn);
2.連續(xù)輸出2個(gè)周期為3.125MHz的正弦波,其中每個(gè)正弦波輸出32個(gè)采樣點(diǎn);
3.連續(xù)輸出2個(gè)周期為1.5625MHz的正弦波,其中每個(gè)正弦波輸出128個(gè)采樣點(diǎn);
4.連續(xù)輸出2個(gè)周期為781250Hz的正弦波,其中每個(gè)正弦波輸出128個(gè)采樣點(diǎn);
5.連續(xù)輸出2個(gè)周期為390625Hz的正弦波,其中每個(gè)正弦波輸出128個(gè)采樣點(diǎn);
6.連續(xù)輸出2個(gè)周期為195312.5Hz的正弦波,其中每個(gè)正弦波輸出128個(gè)采樣點(diǎn)。
重復(fù)以上的1~7的步驟。
正弦波的最高電壓是2.2V,最低電壓是0.48V。
示波器的顯示結(jié)果如下圖

圖490
上圖是整體效果圖,每種頻率的正弦波連續(xù)出現(xiàn)2次,并且正弦波的周期越來(lái)越大。
下圖是捕捉到的,頻率為6.25MHz的正弦波,最高電壓是2.2V,最低電壓是0.48V。
下圖是捕捉到的,頻率為3.125MHz的正弦波,最高電壓是2.2V,最低電壓是0.48V。
下圖是捕捉到的,頻率為1.5625MHz的正弦波,最高電壓是2.2V,最低電壓是0.48V。
下圖是捕捉到的,頻率為390625Hz的正弦波,最高電壓是2.2V,最低電壓是0.48V。
下圖是捕捉到的,頻率為195312.5Hz的正弦波,最高電壓是2.2V,最低電壓是0.48V。
3設(shè)計(jì)實(shí)現(xiàn)
3.1頂層接口
新建目錄:D:mdy_bookdds_da。在該目錄中,新建一個(gè)名為dds_da.v的文件,并用GVIM打開(kāi),開(kāi)始編寫(xiě)代碼。
我們要實(shí)現(xiàn)的功能,概括起來(lái)就是FPGA產(chǎn)生控制AD9709,讓其中的通道A產(chǎn)生正弦波所對(duì)應(yīng)的電壓。為了控制AD9709的通道A,就需要控制AD9709的MODE、SLEEP、CLK1、WRT1、DB7~0P1管腳。根據(jù)設(shè)計(jì)目標(biāo)的要求,整個(gè)工程需要以下信號(hào):
1.使用clk連接到晶振,表示50M時(shí)鐘的輸入。
2.使用rst_n連接到按鍵,表示復(fù)位信號(hào)。
3.使用dac_mode信號(hào)連接到AD9709的MODE管腳,用來(lái)控制其工作模式。
4.使用dac_sleep信號(hào)連接到AD9709的SLEEP管腳,用來(lái)控制其睡眠模式。
5.使用dac_clka信號(hào)連接到AD9709的CLK1管腳,用來(lái)控制通道A的時(shí)鐘。
6.使用dac_wra信號(hào)連接到AD9709的WRT1管腳,用來(lái)控制通道A的寫(xiě)使能。
7.使用8位信號(hào)dac_da連接到AD9709的DB7~0P1管腳,用來(lái)控制通道A的寫(xiě)數(shù)據(jù)。
綜上所述,我們這個(gè)工程需要7個(gè)信號(hào),時(shí)鐘clk,復(fù)位rst_n,dac_mode、dac_sleep、dac_clka、dac_wra和dac_da,其中dac_da是8位信號(hào),其他都是1位信號(hào)。下面表格表示了硬件電路圖的連接關(guān)系。

將module的名稱(chēng)定義為dds_da,代碼如下:

其中clk、rst_n是1位的輸入信號(hào),dac_da是8位的輸出信號(hào),dac_mode,dac_clka,dac_wra,dac_sleep是一位輸出信號(hào)。

3.2信號(hào)設(shè)計(jì)
我們先分析下DAC的輸出。以頻率為195312.5Hz的正弦波為例,如下圖。頻率為195312.5Hz,也就是一個(gè)正弦波的周期是5120ns。案例要求一個(gè)周期要輸出128個(gè)點(diǎn),那就是每隔5120/128=40ns要輸出一個(gè)點(diǎn)。考慮到工程輸入的時(shí)鐘是50MHz,周期是20ns,那就意味著每隔2個(gè)時(shí)鐘就要輸出一個(gè)點(diǎn)。
綜上所述,產(chǎn)生頻率頻率為195312.5Hz的正弦波,就是每隔2個(gè)時(shí)鐘輸出一個(gè)電壓值,一共輸出128個(gè)點(diǎn),組成一個(gè)正弦波。我們要連續(xù)產(chǎn)生2個(gè)正弦波。
現(xiàn)在進(jìn)一步分析下,這128個(gè)點(diǎn)所對(duì)應(yīng)電壓值是多少?由于教學(xué)板的輸出電壓在0.48~2.2V之間,最低值是0.48V,最高值是2.2V。
先將一個(gè)標(biāo)準(zhǔn)的正弦波向上平穩(wěn)1個(gè)單位,使得范圍變成0~2。然后等間隔取128個(gè)點(diǎn)(間隔為2*pi/128),獲取其幅度值。我們?cè)儆?位信號(hào)sin_data表示這些幅度值,其表示方式為:
sin_data = (sin(2*pi/128) + 1) * (255/2),i為0~127 ????(公式1)

通道A的輸出電壓 = -1.72 * (DAC /255) + 2.2 V
公式中可以看到,通道A的輸出電壓是與DAC_DA成線性反比例關(guān)系。為了讓通道A的電壓正確地展現(xiàn)出正弦波,我們還需要做如下調(diào)整。
DAC_DA = 255 - sin_data
上面的DAC_DA就是最終輸出給DA芯片的數(shù)據(jù)值,即dac_da信號(hào)。
綜上所述,產(chǎn)生頻率為195312.5Hz的正弦波,就是每隔2個(gè)時(shí)鐘輸出一個(gè)電壓值dac_da。先按表XX每隔1個(gè)選出sin_data,再用(255-sin_data)得到dac_da。一共輸出128個(gè)點(diǎn),組成一個(gè)正弦波,并且連續(xù)輸出2個(gè)正弦波。
以相同的分析方法,分析頻率為6.25MHz的正弦波。
頻率為6.25MHz,也就是一個(gè)正弦波的周期是160ns。案例要求一個(gè)周期要輸出8個(gè)點(diǎn),那就是每隔160/8=20ns要輸出一個(gè)點(diǎn)??紤]到工程輸入的時(shí)鐘是50MHz,周期是20ns,那就意味著每隔1個(gè)時(shí)鐘就要輸出一個(gè)點(diǎn)。
先將一個(gè)標(biāo)準(zhǔn)的正弦波向上平穩(wěn)1個(gè)單位,使得范圍變成0~2。然后等間隔取8個(gè)點(diǎn)(間隔為2*pi/8),獲取其幅度值。我們?cè)儆?位信號(hào)sin_data表示這些幅度值,其表示方式為:
sin_data = (sin(2*pi/8) + 1) * (255/2),i為0~7
= (sin(2*pi*16/128) + 1) * (255/2),i為0~7 ??(公式2)
對(duì)比公式1和公式2,發(fā)現(xiàn)同樣可以由表XX得到相應(yīng)的sin_data,只是此時(shí)間隔16個(gè)點(diǎn)取一個(gè)值,一共取8個(gè)。
綜上所述,產(chǎn)生頻率為6.25MHz的正弦波,就是每隔1個(gè)時(shí)鐘輸出一個(gè)電壓值dac_da,按表XX中每隔16個(gè)點(diǎn)輸出一個(gè)值,再用(255-sin_data)得到dac_da。一共輸出8個(gè)點(diǎn),組成一個(gè)正弦波,并且連續(xù)產(chǎn)生2個(gè)正弦波。
按同樣的分析方法,分析其他頻率。最終總結(jié)如下:
1.連續(xù)輸出2個(gè)周期為6.25MHz的正弦波,其中每個(gè)正弦波輸出8個(gè)采樣點(diǎn)。
等價(jià)于:每隔1個(gè)時(shí)鐘輸出一個(gè)電壓值dac_da,一共輸出8個(gè)點(diǎn),組成一個(gè)正弦波,連續(xù)產(chǎn)生2個(gè)正弦波。
dac_da的產(chǎn)生方式:表XXX每隔16個(gè)選出得到sin_data,通過(guò)(255-sin_data)得到dac_da。
2.連續(xù)輸出2個(gè)周期為3.125MHz的正弦波,其中每個(gè)正弦波輸出16個(gè)采樣點(diǎn)。
等價(jià)于:每隔1個(gè)時(shí)鐘輸出一個(gè)電壓值dac_da,一共輸出16個(gè),組成一個(gè)正弦波,連續(xù)產(chǎn)生2個(gè)正弦波。
dac_da的產(chǎn)生方式:表XXX每隔8個(gè)選出得到sin_data,通過(guò)(255-sin_data)得到dac_da。
3.連續(xù)輸出2個(gè)周期為1.5625MHz的正弦波,其中每個(gè)正弦波輸出32個(gè)采樣點(diǎn)。
等價(jià)于:每隔1個(gè)時(shí)鐘輸出一個(gè)電壓值dac_da,一共輸出32個(gè),組成一個(gè)正弦波,連續(xù)產(chǎn)生2個(gè)正弦波。
dac_da的產(chǎn)生方式:表XXX每隔4個(gè)選出得到sin_data,通過(guò)(255-sin_data)得到dac_da。
4.連續(xù)輸出2個(gè)周期為781250Hz的正弦波,其中每個(gè)正弦波輸出64個(gè)采樣點(diǎn)。
等價(jià)于:每隔1個(gè)時(shí)鐘輸出一個(gè)電壓值dac_da,一共輸出64個(gè)點(diǎn),組成一個(gè)正弦波,連續(xù)產(chǎn)生2個(gè)正弦波。
dac_da的產(chǎn)生方式:表XXX每隔2個(gè)選出得到sin_data,通過(guò)(255-sin_data)得到dac_da。
5.連續(xù)輸出2個(gè)周期為390625Hz的正弦波,其中每個(gè)正弦波輸出128個(gè)采樣點(diǎn)。
等價(jià)于:每隔1個(gè)時(shí)鐘輸出一個(gè)電壓值dac_da,一共輸出128個(gè)點(diǎn),組成一個(gè)正弦波,連續(xù)產(chǎn)生2個(gè)正弦波。
dac_da的產(chǎn)生方式:表XXX每隔1個(gè)選出得到sin_data,通過(guò)(255-sin_data)得到dac_da。
6.連續(xù)輸出2個(gè)周期為195312.5Hz的正弦波,其中每個(gè)正弦波輸出128個(gè)采樣點(diǎn)。
等價(jià)于:每隔2個(gè)時(shí)鐘輸出一個(gè)電壓值dac_da,一共輸出128個(gè)點(diǎn),組成一個(gè)正弦波,連續(xù)產(chǎn)生2個(gè)正弦波。
dac_da的產(chǎn)生方式:表XXX每隔1個(gè)選出得到sin_data,通過(guò)(255-sin_data)得到dac_da。
按照至簡(jiǎn)設(shè)計(jì)法中的變量法思想,那么可以概括上面的功能:每隔x個(gè)時(shí)鐘輸出一個(gè)電壓值,一共輸出y個(gè)點(diǎn),組成一個(gè)正弦波,每個(gè)要產(chǎn)生要連續(xù)產(chǎn)生2個(gè)正弦波。由于一共要產(chǎn)生6種不同頻率的正弦波,所以還需要一個(gè)計(jì)數(shù)器來(lái)數(shù)6個(gè)。
總結(jié)出上面的內(nèi)容后,我們開(kāi)始設(shè)計(jì)代碼。
“每隔x個(gè)時(shí)鐘輸出一個(gè)電壓值”,所以這需要一個(gè)計(jì)數(shù)器cnt0,加1條件是“1”,結(jié)束條件是數(shù)到x個(gè),可以得到cnt0的代碼。

“一共輸出y個(gè)點(diǎn)”,這同樣需要一個(gè)計(jì)數(shù)器cnt1。注意的是,由于每個(gè)點(diǎn)維持x個(gè)時(shí)鐘,也就是cnt1的加1條件是“數(shù)到x個(gè)時(shí)鐘”,即end_cnt0。結(jié)束條件是:數(shù)到y(tǒng)下??梢缘玫絚nt1的代碼。

“每個(gè)要產(chǎn)生要連續(xù)產(chǎn)生2個(gè)正弦波”,這也需要一個(gè)計(jì)數(shù)器cnt2。一個(gè)正弦波由y個(gè)點(diǎn)組成,所以cnt2的加1條件是“數(shù)到y(tǒng)個(gè)”,即end_cnt1,結(jié)束條件是“數(shù)到2個(gè)”??梢缘玫絚nt2的代碼:

由于一共要產(chǎn)生6種不同頻率的正弦波,所以還需要一個(gè)計(jì)數(shù)器cnt3來(lái)數(shù)6個(gè)。這個(gè)cnt3的加1條件是“產(chǎn)生完2個(gè)正弦波”,即end_cnt2,結(jié)束條件是“數(shù)到6個(gè)”。可以得到cnt3的代碼。

我們定義了變量x和y,其中x表示相隔的時(shí)鐘數(shù),y表示一個(gè)正弦波的采樣點(diǎn)數(shù)。具體的x和y是與正弦波的不同頻率相關(guān)的,也就是與cnt3相關(guān)。根據(jù)題意和至簡(jiǎn)設(shè)計(jì)法中的變量設(shè)計(jì)方法,可以得到x和y的代碼。

有了計(jì)數(shù)器之后,其他信號(hào)就可以根據(jù)計(jì)數(shù)器設(shè)計(jì)出來(lái)了。
首先看信號(hào)dac_da。dac_da都是按(255-sin_data)得到。那么可以寫(xiě)出dac_da的代碼。

接下來(lái)看sin_data信號(hào)。sin_data是從表XX中選擇出來(lái)的值,不同的頻率,選擇的方式不同。那么很自然是定義一個(gè)選擇信號(hào)addr。我們只要控制好addr,就能方便得到sin_data。

接下來(lái)設(shè)計(jì)信號(hào)addr。addr是用來(lái)控制選擇數(shù)據(jù)的地址,不同頻率的正弦波要求地址控制方式不同。頻率為6.25MHz(cnt3=0)是每隔16個(gè)選擇一個(gè);頻率為3.125MHz(cnt3=1)是每隔8個(gè)點(diǎn)選擇一個(gè);頻率為1.5625MHz(cnt3=2)是每隔4個(gè)點(diǎn)選擇一個(gè);頻率為781250Hz(cnt3=3)是每隔2個(gè)選擇一個(gè);頻率為390625Hz(cnt3=4)是每隔1個(gè)點(diǎn)選擇一個(gè);頻率為195312.5Hz(cnt3=5)是每隔1個(gè)選擇一個(gè),一共發(fā)送128個(gè)。
我們用cnt1表示發(fā)送的第幾個(gè)數(shù)。
cnt3==0時(shí),addr = cnt1*16;
cnt3==1時(shí),addr = cnt1*8;
cnt3==2時(shí),addr = cnt1*4;
cnt3==3時(shí),addr = cnt1*2;
cnt3==4時(shí),addr = cnt1*1;
cnt3==5時(shí),addr = cnt1*1。
因此,可以寫(xiě)得addr的代碼

接下來(lái)是信號(hào)dac_sleep,AD是一直工作的,所以要讓dac_sleep一直為0。
dac_clka為了滿(mǎn)足tS的時(shí)間要求,可以讓dac_clka = ~clk。
dac_wra可以與dac_clka相同。
dac_mode是控制AD9709的模式,當(dāng)為高電平時(shí),表示雙通道模式,此時(shí)通過(guò)DA、DB兩組信號(hào)分別獨(dú)立控制兩個(gè)通道。在能實(shí)現(xiàn)功能的前提下,越簡(jiǎn)單越好,就使用雙通道模式,因此令dac_mode一直為1。

至此,主體程序已經(jīng)完成。接下來(lái)是將module補(bǔ)充完整。
3.3信號(hào)定義
接下來(lái)定義信號(hào)類(lèi)型。
cnt0是用always產(chǎn)生的信號(hào),因此類(lèi)型為reg。cnt0計(jì)數(shù)的最大值為15,需要用5根線表示,即位寬是5位。add_cnt0和end_cnt0都是用assign方式設(shè)計(jì)的,因此類(lèi)型為wire。并且其值是0或者1,1個(gè)線表示即可。因此代碼如下:

cnt1是用always產(chǎn)生的信號(hào),因此類(lèi)型為reg。cnt1計(jì)數(shù)的最大值為127,需要用8根線表示,即位寬是8位。add_cnt1和end_cnt1都是用assign方式設(shè)計(jì)的,因此類(lèi)型為wire。并且其值是0或者1,1根線表示即可。因此代碼如下:

cnt2是用always產(chǎn)生的信號(hào),因此類(lèi)型為reg。cnt2計(jì)數(shù)的最大值為7,需要用3根線表示,即位寬是8位。add_cnt2和end_cnt2都是用assign方式設(shè)計(jì)的,因此類(lèi)型為wire。并且其值是0或者1,1根線表示即可。因此代碼如下:

cnt3是用always產(chǎn)生的信號(hào),因此類(lèi)型為reg。cnt3計(jì)數(shù)的最大值為5,需要用3根線表示,即位寬是3位。add_cnt3和end_cnt3都是用assign方式設(shè)計(jì)的,因此類(lèi)型為wire。并且其值是0或者1,1根線表示即可。因此代碼如下:

變量x,y是用always方式設(shè)計(jì)的,因此類(lèi)型為reg,x最大值為2,要有2位來(lái)表示,y最大值為128,要有8根線表示,即位寬為8,因此代碼如下,

addr是用always設(shè)計(jì)的,因此類(lèi)型為reg。其值最大為127,一共有7根線,位寬為7,故而代碼如下

sin_data是用always設(shè)計(jì)的,因此類(lèi)型為reg。其最大值為255,要有8根線表示,位寬為8,故而代碼如下

dac_da是用always設(shè)計(jì)的,因此類(lèi)型為reg。其位寬為8;dac_sleep是用assign設(shè)計(jì)的,因此類(lèi)型為wire,位寬為1;dac_wra是用assign設(shè)計(jì)的,因此類(lèi)型為wire,位寬為1;dac_clka是用assign設(shè)計(jì)的,因此類(lèi)型為wire,位寬為1;dac_mode是用assign設(shè)計(jì)的,因此類(lèi)型為wire,位寬為1。故而代碼如下

在代碼的最后一行寫(xiě)下endmodule

4綜合與上板
4.1新建工程

圖491
1.打開(kāi)quartus,點(diǎn)擊File在File菜單中選擇New Project Wizard....。

圖492
2.彈出Introduction界面選擇Next。

圖493
3.設(shè)置工程目錄,工程名,頂層模塊名
工程目錄設(shè)置為:D:mdy_bookdds_da
工程名:dds_da
頂層模塊名:dds_da
填寫(xiě)完畢后,點(diǎn)擊next之后進(jìn)入下一界面。

圖494
工程類(lèi)型界面,Project Type選擇Empty project,選擇空白工程。點(diǎn)Next進(jìn)入下一個(gè)界面。

圖495
4.在文件添加界面,點(diǎn)擊右上角的

,在彈出來(lái)的窗口中,雙擊選擇D:mdy_bookdds_da目錄下的dds_da.v文件。

圖496
點(diǎn)擊右上角的add按鍵

,將文件添加進(jìn)工程。

圖497
在主窗口中會(huì)顯示將dds_da.v加入了工程。點(diǎn)擊Next,進(jìn)入下一個(gè)界面。

圖498
4.器件選擇界面。在Device family這一項(xiàng)之中選擇Cyclone IV E;在下部的Available device選擇EP4CE6F23C8。完成后直接點(diǎn)擊Finish。
4.2綜合

圖499
在菜單欄中,選中Processing,然后選擇Start Compilation,開(kāi)始對(duì)整個(gè)工程進(jìn)行編譯和綜合。

圖500
出現(xiàn)上面的界面,就說(shuō)明編譯綜合成功。

4.3配置管腳

圖501
在菜單欄中,選中Assignments,然后選擇Pin Planner,就會(huì)彈出配置管腳的窗口。

圖502
在配置窗口中的location一列,可以填寫(xiě)每個(gè)管腳所對(duì)應(yīng)的FPGA管腳號(hào)。
按上面配置好每個(gè)信號(hào)的管腳,其最終效果如下圖。

圖503
關(guān)閉Pin Planner,軟件自動(dòng)會(huì)保存管腳配置信息。
4.4再次綜合

圖504
在菜單欄中,選中Processing,然后選擇Start Compilation,開(kāi)始對(duì)整個(gè)工程進(jìn)行編譯和綜合。

圖505
出現(xiàn)上面的界面,就說(shuō)明編譯綜合成功。
4.5連接開(kāi)發(fā)板

圖506
連接示意如上圖所示。將電源接上開(kāi)發(fā)板;USB BLASTER一端連接到JTAG插口,另一端連到PC的USB接口;將開(kāi)發(fā)板上的P7接口與示波器相連。最后再將電源打開(kāi)。
4.6上板

圖507
在quartus的Task窗口中,右鍵Program Device選擇Open進(jìn)入燒錄界面。

圖508
在上面的界面中,默認(rèn)會(huì)選中文件output/dds_da.sof,如果沒(méi)有生成請(qǐng)看XXXX。
在上面的界面中,Hardware Setup的旁邊會(huì)顯示:USB-Blaster。如果不是,請(qǐng)看XXXX。

圖509
點(diǎn)擊statr,在progress這一條顯示100%即表示成功,此時(shí)可以看FPGA輸出效果了。