本(běn)文(wén)的(de)文(wén)檔編号(hào):000400000027
需要(yào)看(kàn)对(duì)應(yìng)的(de)視頻,請點(diǎn)擊視頻編号(hào):002700000454
1、本(běn)文(wén)檔講述FPGA産生(shēng)正(zhèng)弦波(bō)數據(jù),由(yóu)DA輸出(chū),然後(hòu)再外(wài)部(bù)环(huán)回(huí)到(dào)AD接口(kǒu)進(jìn)行采集,可(kě)通(tòng)过(guò)在(zài)線(xiàn)調試工具進(jìn)行观察
2、801開(kāi)發(fà)板使用(yòng)
項目背景
1.1 AD轉(zhuǎn)換
轉(zhuǎn)換 轉(zhuǎn)換就(jiù)是(shì)模數轉(zhuǎn)換。顧名思(sī)義,就(jiù)是(shì)把模拟信(xìn)号(hào)轉(zhuǎn)換成(chéng)數字(zì)信(xìn)号(hào)。主(zhǔ)要(yào)包(bāo)括積分(fēn)型、逐次(cì)逼近(jìn)型、并行比較型串并行型、ΣΔ調制型、電(diàn)容阵(zhèn)列逐次(cì)比較型及(jí)壓頻變(biàn)換型。
A/D轉(zhuǎn)換器是(shì)用(yòng)来(lái)通(tòng)过(guò)一(yī)定(dìng)的(de)電(diàn)路(lù)将模拟量(liàng)轉(zhuǎn)變(biàn)为(wèi)數字(zì)量(liàng)。模拟量(liàng)可(kě)以(yǐ)是(shì)電(diàn)壓、電(diàn)流等電(diàn)信(xìn)号(hào),也(yě)可(kě)以(yǐ)是(shì)壓力、温(wēn)度(dù)、湿(shī)度(dù)、位移、聲音(yīn)等非(fēi)電(diàn)信(xìn)号(hào)。但在(zài)A/D轉(zhuǎn)換前(qián),輸入(rù)到(dào)A/D轉(zhuǎn)換器的(de)輸入(rù)信(xìn)号(hào)必須經(jīng)各(gè)種(zhǒng)傳感(gǎn)器把各(gè)種(zhǒng)物(wù)理量(liàng)轉(zhuǎn)換成(chéng)電(diàn)壓信(xìn)号(hào)。
AD轉(zhuǎn)換的(de)技術(shù)指标(biāo),一(yī)般有(yǒu)如(rú)下(xià)幾(jǐ)个(gè):
1. 分(fēn)辨率(Resolution) 指數字(zì)量(liàng)變(biàn)化(huà)一(yī)个(gè)最(zuì)小量(liàng)时(shí)模拟信(xìn)号(hào)的(de)變(biàn)化(huà)量(liàng),定(dìng)義为(wèi)滿刻度(dù)與(yǔ)2^n的(de)比值。分(fēn)辨率又稱精度(dù),通(tòng)常以(yǐ)數字(zì)信(xìn)号(hào)的(de)位數来(lái)表(biǎo)示。
2. 轉(zhuǎn)換速率(Conversion Rate)是(shì)指完成(chéng)一(yī)次(cì)從模拟轉(zhuǎn)換到(dào)數字(zì)的(de)AD轉(zhuǎn)換所(suǒ)需的(de)时(shí)間(jiān)的(de)倒數。積分(fēn)型AD的(de)轉(zhuǎn)換时(shí)間(jiān)是(shì)毫(háo)秒(miǎo)級屬低速AD,逐次(cì)比較型AD是(shì)微秒(miǎo)級屬中(zhōng)速AD,全(quán)并行/串并行型AD可(kě)达(dá)到(dào)納秒(miǎo)級。采樣(yàng)时(shí)間(jiān)則是(shì)另(lìng)外(wài)一(yī)个(gè)概念,是(shì)指两(liǎng)次(cì)轉(zhuǎn)換的(de)間(jiān)隔。为(wèi)了(le)保證轉(zhuǎn)換的(de)正(zhèng)确完成(chéng),采樣(yàng)速率 (Sample Rate)必須小于(yú)或(huò)等于(yú)轉(zhuǎn)換速率。因(yīn)此(cǐ)有(yǒu)人(rén)習慣上(shàng)将轉(zhuǎn)換速率在(zài)數值上(shàng)等同(tóng)于(yú)采樣(yàng)速率也(yě)是(shì)可(kě)以(yǐ)接受的(de)。常用(yòng)單位是(shì)ksps和(hé)Msps,表(biǎo) 示每秒(miǎo)采樣(yàng)千(qiān)/百(bǎi)万(wàn)次(cì)(kilo / Million Samples per Second)。
3. 量(liàng)化(huà)誤差 (Quantizing Error) 由(yóu)于(yú)AD的(de)有(yǒu)限分(fēn)辨率而(ér)引起的(de)誤差,即有(yǒu)限分(fēn)辨率AD的(de)階(jiē)梯(tī)狀轉(zhuǎn)移特(tè)性(xìng)曲(qū)線(xiàn)與(yǔ)无限分(fēn)辨率AD(理想(xiǎng)AD)的(de)轉(zhuǎn)移特(tè) 性(xìng)曲(qū)線(xiàn)(直(zhí)線(xiàn))之間(jiān)的(de)最(zuì)大偏差。通(tòng)常是(shì)1个(gè)或(huò)半个(gè)最(zuì)小數字(zì)量(liàng)的(de)模拟變(biàn)化(huà)量(liàng),表(biǎo)示为(wèi)1LSB、1/2LSB。
4. 偏移誤差(Offset Error) 輸入(rù)信(xìn)号(hào)为(wèi)零(líng)时(shí)輸出(chū)信(xìn)号(hào)不(bù)为(wèi)零(líng)的(de)值,可(kě)外(wài)接電(diàn)位器調至(zhì)最(zuì)小。
5. 滿刻度(dù)誤差(Full Scale Error) 滿度(dù)輸出(chū)时(shí)对(duì)應(yìng)的(de)輸入(rù)信(xìn)号(hào)與(yǔ)理想(xiǎng)輸入(rù)信(xìn)号(hào)值之差。
6. 線(xiàn)性(xìng)度(dù)(Linearity) 实際轉(zhuǎn)換器的(de)轉(zhuǎn)移函(hán)數與(yǔ)理想(xiǎng)直(zhí)線(xiàn)的(de)最(zuì)大偏移,不(bù)包(bāo)括以(yǐ)上(shàng)三(sān)種(zhǒng)誤差。
其他(tā)指标(biāo)還(huán)有(yǒu):絕对(duì)精度(dù)(Absolute Accuracy) ,相对(duì)精度(dù)(Relative Accuracy),微分(fēn)非(fēi)線(xiàn)性(xìng),單調性(xìng)和(hé)无錯碼,總(zǒng)諧波(bō)失真(zhēn)(Total Harmonic Distotortion縮写THD)和(hé)積分(fēn)非(fēi)線(xiàn)性(xìng)。
1.2 教学板AD原理图(tú)
明(míng)德揚教学板上(shàng)板载板载32Mhz 轉(zhuǎn)換速率、8bit高(gāo)速AD芯片(piàn)AD9280,滿足各(gè)種(zhǒng)信(xìn)号(hào)的(de)采集,滿足用(yòng)戶实現(xiàn)各(gè)種(zhǒng)常見(jiàn)濾波(bō)算法的(de)实現(xiàn)。实際位置如(rú)下(xià)所(suǒ)示:
图(tú) 599
图(tú) 600
上(shàng)面(miàn)是(shì)AD9280的(de)原理图(tú)。與(yǔ)FPGA相連(lián)的(de)信(xìn)号(hào)有(yǒu):AD_D0~7、AD_OTR、AD_CLK。
AD9280管(guǎn)脚
原理图(tú)信(xìn)号(hào)
FPGA管(guǎn)脚
作用(yòng)
CLK
AD_CLK
AD9280的(de)工作时(shí)鐘(zhōng),最(zuì)大是(shì)32MHz。
OTR
AD_OTR
超过(guò)電(diàn)壓範圍指示信(xìn)号(hào)
D7
AD_D7
AD轉(zhuǎn)換後(hòu)的(de)數字(zì)值。
D6
AD_D6
D5
AD_D5
D4
AD_D4
D3
AD_D3
D2
AD_D2
D1
AD_D1
D0
AD_D0
1.3 AD9280的(de)控制时(shí)序
AD9280的(de)控制时(shí)序如(rú)下(xià)图(tú)。
图(tú) 601
图(tú) 602
图(tú) 603
由(yóu)时(shí)鐘(zhōng)图(tú)可(kě)以(yǐ)看(kàn)出(chū),每个(gè)时(shí)鐘(zhōng)就(jiù)可(kě)以(yǐ)做AD轉(zhuǎn)換一(yī)次(cì),但会(huì)延遲3个(gè)时(shí)鐘(zhōng)才輸出(chū)。例如(rú)时(shí)序图(tú)中(zhōng)第(dì)一(yī)个(gè)时(shí)鐘(zhōng)采集到(dào)S1,并对(duì)S1進(jìn)行模數轉(zhuǎn)換,經(jīng)过(guò)3个(gè)时(shí)鐘(zhōng)後(hòu),輸出(chū)DATA1,这(zhè)个(gè)DATA1就(jiù)是(shì)S1所(suǒ)應(yìng)对(duì)的(de)數字(zì)值。
由(yóu)參數时(shí)序可(kě)以(yǐ)看(kàn)出(chū),时(shí)鐘(zhōng)最(zuì)大是(shì)32MHz。
由(yóu)上(shàng)面(miàn)时(shí)序可(kě)以(yǐ)看(kàn)出(chū),控制AD9280非(fēi)常簡單,只(zhī)要(yào)給(gěi)出(chū)不(bù)超过(guò)32MHz的(de)时(shí)鐘(zhōng),然後(hòu)对(duì)其采集就(jiù)行了(le)。
2 設計(jì)目标(biāo)
本(běn)次(cì)案(àn)例将使用(yòng)到(dào)AD9709和(hé)AD9280。其連(lián)接示意(yì)如(rú)下(xià)图(tú)所(suǒ)示。
图(tú) 604
其中(zhōng)跳帽(mào)就(jiù)設置成(chéng)XXX,設置後(hòu),AD9709的(de)通(tòng)道(dào)A輸出(chū),就(jiù)会(huì)环(huán)回(huí)給(gěi)AD9280。
本(běn)案(àn)例是(shì)FPGA先(xiān)産生(shēng)正(zhèng)弦信(xìn)号(hào),这(zhè)个(gè)正(zhèng)弦信(xìn)号(hào)輸出(chū)給(gěi)DA通(tòng)道(dào)A,經(jīng)过(guò)环(huán)回(huí)後(hòu),給(gěi)回(huí)AD9280的(de)輸入(rù)端,FPGA再采集AD9280的(de)數據(jù),最(zuì)後(hòu)使用(yòng)signaltap采集數字(zì)信(xìn)号(hào)。
图(tú) 605
正(zhèng)弦信(xìn)号(hào)的(de)産生(shēng)方(fāng)式,與(yǔ)“FIR濾波(bō)器的(de)設計(jì)”案(àn)例一(yī)致(zhì)。正(zhèng)弦信(xìn)号(hào)的(de)頻率受開(kāi)發(fà)板上(shàng)的(de)3个(gè)撥碼開(kāi)關(guān)控制,用(yòng)3位信(xìn)号(hào)key表(biǎo)示,一(yī)共(gòng)可(kě)以(yǐ)産生(shēng)8種(zhǒng)頻率。
正(zhèng)弦信(xìn)号(hào)的(de)頻率 約等于(yú): 100KHz * (key+1)。
例如(rú),當key等于(yú)0时(shí),産生(shēng)約100KHz的(de)正(zhèng)弦信(xìn)号(hào);
當key等于(yú)1时(shí),産生(shēng)約200KHz的(de)正(zhèng)弦波(bō);
當key等于(yú)7时(shí),産生(shēng)約800KHz的(de)正(zhèng)弦波(bō)。
FPGA産生(shēng)25MHz的(de)时(shí)鐘(zhōng)給(gěi)AD9280,也(yě)就(jiù)是(shì)采樣(yàng)率为(wèi)25M。用(yòng)这(zhè)个(gè)时(shí)鐘(zhōng)作为(wèi)SIGNALTAP的(de)采樣(yàng)时(shí)鐘(zhōng),观察AD9280过(guò)来(lái)的(de)數據(jù)波(bō)形。
上(shàng)板效果(guǒ)图(tú)如(rú)下(xià)图(tú)所(suǒ)示。(用(yòng)signaltap抓取(qǔ)波(bō)形)
图(tú) 606
3 設計(jì)实現(xiàn)
3.1 頂层信(xìn)号(hào)
新建目录(lù):D:mdy_bookd_prj。在(zài)該目录(lù)中(zhōng),新建一(yī)个(gè)名为(wèi)ad_prj.v的(de)文(wén)件(jiàn),并用(yòng)GVIM打(dǎ)開(kāi),開(kāi)始編写代(dài)碼。
我(wǒ)们(men)要(yào)实現(xiàn)的(de)功能(néng),概括起来(lái)就(jiù)是(shì)FPGA産生(shēng)控制AD9709,讓其中(zhōng)的(de)通(tòng)道(dào)A産生(shēng)正(zhèng)弦波(bō)所(suǒ)对(duì)應(yìng)的(de)電(diàn)壓,同(tóng)时(shí)采集AD9280的(de)數據(jù)并观察。为(wèi)了(le)控制AD9709的(de)通(tòng)道(dào)A,就(jiù)需要(yào)控制AD9709的(de)MODE、SLEEP、CLK1、WRT1、DB7~0P1管(guǎn)脚。为(wèi)了(le)采集AD9280,那(nà)麼(me)就(jiù)需要(yào)控制AD9280的(de)CLK、D0~D7管(guǎn)脚。根(gēn)據(jù)設計(jì)目标(biāo)的(de)要(yào)求,整个(gè)工程需要(yào)以(yǐ)下(xià)信(xìn)号(hào):
1. 使用(yòng)clk連(lián)接到(dào)晶振,表(biǎo)示50M时(shí)鐘(zhōng)的(de)輸入(rù)。
2. 使用(yòng)rst_n連(lián)接到(dào)按鍵,表(biǎo)示複位信(xìn)号(hào)。
3. 使用(yòng)3位信(xìn)号(hào)key,表(biǎo)示三(sān)位撥碼開(kāi)關(guān)。
4. 使用(yòng)dac_mode信(xìn)号(hào)連(lián)接到(dào)AD9709的(de)MODE管(guǎn)脚,用(yòng)来(lái)控制其工作模式。
5. 使用(yòng)dac_sleep信(xìn)号(hào)連(lián)接到(dào)AD9709的(de)SLEEP管(guǎn)脚,用(yòng)来(lái)控制其睡眠模式。
6. 使用(yòng)dac_clka信(xìn)号(hào)連(lián)接到(dào)AD9709的(de)CLK1管(guǎn)脚,用(yòng)来(lái)控制通(tòng)道(dào)A的(de)时(shí)鐘(zhōng)。
7. 使用(yòng)dac_wra信(xìn)号(hào)連(lián)接到(dào)AD9709的(de)WRT1管(guǎn)脚,用(yòng)来(lái)控制通(tòng)道(dào)A的(de)写使能(néng)。
8. 使用(yòng)8位信(xìn)号(hào)dac_da連(lián)接到(dào)AD9709的(de)DB7~0P1管(guǎn)脚,用(yòng)来(lái)控制通(tòng)道(dào)A的(de)写數據(jù)。
9. 使用(yòng)ad_clk信(xìn)号(hào)連(lián)接到(dào)AD9280的(de)CLK管(guǎn)脚,用(yòng)来(lái)作来(lái)采樣(yàng)时(shí)鐘(zhōng)。
10. 使用(yòng)8位ad_in信(xìn)号(hào)連(lián)接到(dào)AD9280的(de)D7~0管(guǎn)脚,用(yòng)来(lái)采集數據(jù)。
綜上(shàng)所(suǒ)述,我(wǒ)们(men)这(zhè)个(gè)工程需要(yào)10个(gè)信(xìn)号(hào),时(shí)鐘(zhōng)clk,複位rst_n,dac_mode、dac_sleep、dac_clka、dac_wra、dac_da、ad_clk和(hé)ad_in,其中(zhōng)dac_da 、ad_in是(shì)8位信(xìn)号(hào),key是(shì)3位信(xìn)号(hào),其他(tā)都是(shì)1位信(xìn)号(hào)。
|
器件(jiàn) |
AD9709管(guǎn)脚 |
AD9280管(guǎn)脚 |
原理图(tú)信(xìn)号(hào) |
FPGA管(guǎn)脚 |
FPGA工程信(xìn)号(hào) |
|
U8 |
MODE |
|
DAC_MODE |
Y4 |
dac_mode |
|
SLEEP |
|
DAC_SLEEP |
H2 |
dac_sleep |
|
|
CLK1 |
|
DA_CLKA |
R2 |
dac_clka |
|
|
WRT1 |
|
DA_WRA |
U1 |
dac_wra |
|
|
DB7P1 |
|
DAC_DA7 |
AA1 |
dac_da[7] |
|
|
DB6P1 |
|
DAC_DA6 |
Y2 |
dac_da[6] |
|
|
DB5P1 |
|
DAC_DA5 |
Y1 |
dac_da[5] |
|
|
DB4P1 |
|
DAC_DA4 |
W2 |
dac_da[4] |
|
|
DB3P1 |
|
DAC_DA3 |
W1 |
dac_da[3] |
|
|
DB2P1 |
|
DAC_DA2 |
V2 |
dac_da[2] |
|
|
DB1P1 |
|
DAC_DA1 |
V1 |
dac_da[1] |
|
|
DB0P1 |
|
DAC_DA0 |
U2 |
dac_da[0] |
|
|
U1 |
|
CLK |
AD_CLK |
L6 |
ad_clk |
|
|
D7 |
AD_D7 |
N5 |
ad_in[7] |
|
|
|
D6 |
AD_D6 |
M4 |
ad_in[6] |
|
|
|
D5 |
AD_D5 |
M5 |
ad_in[5] |
|
|
|
D4 |
AD_D4 |
R6 |
ad_in[4] |
|
|
|
D3 |
AD_D3 |
T5 |
ad_in[3] |
|
|
|
D2 |
AD_D2 |
U7 |
ad_in[2] |
|
|
|
D1 |
AD_D1 |
V5 |
ad_in[1] |
|
|
|
D0 |
AD_D0 |
V6 |
ad_in[0] |
|
|
X1 |
|
|
SYS_CLK |
G1 |
clk |
|
K1 |
|
|
SYS_RST |
AB12 |
rst_n |
|
sw0 |
|
|
SW_D0 |
AA3 |
key[2] |
|
sw1 |
|
|
SW_D1 |
AB3 |
key[1] |
|
sw2 |
|
|
SW_D2 |
AB5 |
key[0] |
将module的(de)名稱定(dìng)義为(wèi)ad_prj,代(dài)碼如(rú)下(xià):
|
1 2 3 4 5 6 7 8 9 |
module ad_prj( clk , rst_n , key , dac_mode , dac_clka , dac_da , dac_wra , dac_sleep, ad_clk , ad_in ); |
其中(zhōng)clk、rst_n是(shì)1位的(de)輸入(rù)信(xìn)号(hào),dac_da是(shì)8位的(de)輸出(chū)信(xìn)号(hào),dac_mode,dac_clka,dac_wra,dac_sleep是(shì)1位輸出(chū)信(xìn)号(hào),ad_clk是(shì)1位輸出(chū)信(xìn)号(hào),ad_in是(shì)8位輸入(rù)信(xìn)号(hào),key是(shì)3位輸入(rù)信(xìn)号(hào)。
|
1 2 3 4 5 6 7 |
input clk ; input rst_n ; input [ 3-1:0] key ; output dac_mode ; output dac_clka ; output [ 8-1:0] dac_da ; output dac_wra ; output dac_sleep ; output ad_clk ; input [8-1:0] ad_in ; |
3.2 信(xìn)号(hào)設計(jì)
由(yóu)于(yú)正(zhèng)弦信(xìn)号(hào)的(de)産生(shēng)要(yào)求,與(yǔ)“FIR濾波(bō)器設計(jì)”相同(tóng),所(suǒ)以(yǐ)不(bù)再詳细(xì)描述原因(yīn)。現(xiàn)在(zài)把相關(guān)代(dài)碼整理如(rú)下(xià)。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
always @(*)begin case(addr) 0: sin_data = 8'h7F; 1: sin_data = 8'h85; 2: sin_data = 8'h8C; 3: sin_data = 8'h92; 4: sin_data = 8'h98; 5: sin_data = 8'h9E; 6: sin_data = 8'hA4; 7: sin_data = 8'hAA; 8: sin_data = 8'hB0; 9: sin_data = 8'hB6; 10: sin_data = 8'hBC; 11: sin_data = 8'hC1; 12: sin_data = 8'hC6; 13: sin_data = 8'hCB; 14: sin_data = 8'hD0; 15: sin_data = 8'hD5; 16: sin_data = 8'hDA; 17: sin_data = 8'hDE; 18: sin_data = 8'hE2; 19: sin_data = 8'hE6; 20: sin_data = 8'hEA; 21: sin_data = 8'hED; 22: sin_data = 8'hF0; 23: sin_data = 8'hF3; 24: sin_data = 8'hF5; 25: sin_data = 8'hF7; 26: sin_data = 8'hF9; 27: sin_data = 8'hFB; 28: sin_data = 8'hFC; 29: sin_data = 8'hFD; 30: sin_data = 8'hFE; 31: sin_data = 8'hFE; 32: sin_data = 8'hFE; 33: sin_data = 8'hFE; 34: sin_data = 8'hFE; 35: sin_data = 8'hFD; 36: sin_data = 8'hFC; 37: sin_data = 8'hFA; 38: sin_data = 8'hF8; 39: sin_data = 8'hF6; 40: sin_data = 8'hF4; 41: sin_data = 8'hF1; 42: sin_data = 8'hEF; 43: sin_data = 8'hEB; 44: sin_data = 8'hE8; 45: sin_data = 8'hE4; 46: sin_data = 8'hE0; 47: sin_data = 8'hDC; 48: sin_data = 8'hD8; 49: sin_data = 8'hD3; 50: sin_data = 8'hCE; 51: sin_data = 8'hC9; 52: sin_data = 8'hC4; 53: sin_data = 8'hBE; 54: sin_data = 8'hB9; 55: sin_data = 8'hB3; 56: sin_data = 8'hAD; 57: sin_data = 8'hA7; 58: sin_data = 8'hA1; 59: sin_data = 8'h9B; 60: sin_data = 8'h95; 61: sin_data = 8'h8F; 62: sin_data = 8'h89; 63: sin_data = 8'h82; 64: sin_data = 8'h7D; 65: sin_data = 8'h77; 66: sin_data = 8'h70; 67: sin_data = 8'h6A; 68: sin_data = 8'h64; 69: sin_data = 8'h5E; 70: sin_data = 8'h58; 71: sin_data = 8'h52; 72: sin_data = 8'h4C; 73: sin_data = 8'h46; 74: sin_data = 8'h41; 75: sin_data = 8'h3C; 76: sin_data = 8'h36; 77: sin_data = 8'h31; 78: sin_data = 8'h2C; 79: sin_data = 8'h28; 80: sin_data = 8'h23; 81: sin_data = 8'h1F; 82: sin_data = 8'h1B; 83: sin_data = 8'h17; 84: sin_data = 8'h14; 85: sin_data = 8'h11; 86: sin_data = 8'hE ; 87: sin_data = 8'hB ; 88: sin_data = 8'h9 ; 89: sin_data = 8'h7 ; 90: sin_data = 8'h5 ; 91: sin_data = 8'h3 ; 92: sin_data = 8'h2 ; 93: sin_data = 8'h1 ; 94: sin_data = 8'h1 ; 95: sin_data = 8'h1 ; 96: sin_data = 8'h1 ; 97: sin_data = 8'h1 ; 98: sin_data = 8'h2 ; 99: sin_data = 8'h3 ; 100: sin_data = 8'h4 ; 101: sin_data = 8'h6 ; 102: sin_data = 8'h7 ; 103: sin_data = 8'hA ; 104: sin_data = 8'hC ; 105: sin_data = 8'hF ; 106: sin_data = 8'h12; 107: sin_data = 8'h15; 108: sin_data = 8'h19; 109: sin_data = 8'h1D; 110: sin_data = 8'h21; 111: sin_data = 8'h25; 112: sin_data = 8'h2A; 113: sin_data = 8'h2E; 114: sin_data = 8'h33; 115: sin_data = 8'h38; 116: sin_data = 8'h3E; 117: sin_data = 8'h43; 118: sin_data = 8'h49; 119: sin_data = 8'h4E; 120: sin_data = 8'h54; 121: sin_data = 8'h5A; 122: sin_data = 8'h60; 123: sin_data = 8'h67; 124: sin_data = 8'h6D; 125: sin_data = 8'h73; 126: sin_data = 8'h79; 127: sin_data = 8'h7F; endcase end
always @(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin addr_tmp <= 0; end else if(key==0) begin addr_tmp <= addr_tmp + 262; end else if(key==1) begin addr_tmp <= addr_tmp + 524; end else if(key==2) begin addr_tmp <= addr_tmp + 786; end else if(key==3) begin addr_tmp <= addr_tmp + 1029; end else if(key==4) begin addr_tmp <= addr_tmp + 1311; end else if(key==5) begin addr_tmp <= addr_tmp + 1573; end else if(key==6) begin addr_tmp <= addr_tmp + 1835; end else begin addr_tmp <= addr_tmp + 2097; end end
assign addr = addr_tmp >>10 ;
always @(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin dac_da <= 0; end else begin dac_da <= 255 - sin_data; end end
assign dac_sleep = 0 ; assign dac_wra = dac_clka ; assign dac_clka = ~clk ; |
還(huán)有(yǒu)最(zuì)後(hòu)一(yī)个(gè)信(xìn)号(hào)要(yào)設計(jì):ad_clk。由(yóu)設計(jì)目标(biāo)可(kě)知,要(yào)求是(shì)25MHz的(de)时(shí)鐘(zhōng)。为(wèi)了(le)産生(shēng)时(shí)鐘(zhōng),我(wǒ)们(men)就(jiù)要(yào)用(yòng)到(dào)PLL。
3.3 生(shēng)成(chéng)PLL IP核
1.打(dǎ)開(kāi)IP核管(guǎn)理工具
打(dǎ)開(kāi)quartus软(ruǎn)件(jiàn),然後(hòu)選擇Tools ->IPcatalog,在(zài)右(yòu)側弹出(chū)如(rú)下(xià)界面(miàn)
图(tú) 607
在(zài)搜索框中(zhōng),填下(xià)ALTPLL,就(jiù)会(huì)出(chū)現(xiàn)如(rú)下(xià)界面(miàn)。
图(tú) 608
ALTPLL就(jiù)是(shì)我(wǒ)们(men)需要(yào)使用(yòng)的(de)PLL IP核。双(shuāng)擊ALTPLL,在(zài)弹出(chū)的(de)对(duì)話(huà)框中(zhōng)起个(gè)文(wén)件(jiàn)名,如(rú)vga_pll,記(jì)得選擇verilog。然後(hòu)點(diǎn)OK就(jiù)可(kě)以(yǐ)開(kāi)始設置參數了(le)。
图(tú) 609
2.設置IP參數
图(tú) 610
上(shàng)图(tú)中(zhōng),主(zhǔ)要(yào)是(shì)設置輸入(rù)的(de)时(shí)鐘(zhōng)頻率,明(míng)德揚開(kāi)發(fà)板輸入(rù)时(shí)鐘(zhōng)是(shì)固定(dìng)的(de)50MHz,因(yīn)此(cǐ)可(kě)填写50,注意(yì)旁邊(biān)的(de)單位是(shì)選擇MHz。其他(tā)默認,按next。
图(tú) 611
上(shàng)图(tú)的(de)option inputs中(zhōng),全(quán)部(bù)取(qǔ)消勾選,不(bù)需要(yào)産生(shēng)複位信(xìn)号(hào)。上(shàng)图(tú)中(zhōng)的(de)lock output,全(quán)部(bù)取(qǔ)消勾選,不(bù)需要(yào)産生(shēng)locked指示信(xìn)号(hào)。然後(hòu)選Next。
图(tú) 612
不(bù)用(yòng)做任何更(gèng)改,直(zhí)接Next。
图(tú) 613
不(bù)用(yòng)做任何更(gèng)改,直(zhí)接Next。
图(tú) 614
增加輸入(rù)时(shí)鐘(zhōng),由(yóu)于(yú)我(wǒ)们(men)只(zhī)有(yǒu)一(yī)个(gè)輸入(rù)时(shí)鐘(zhōng),所(suǒ)以(yǐ)只(zhī)用(yòng)inclk0即可(kě),无需增加。直(zhí)接Next。
图(tú) 615
不(bù)用(yòng)做任何更(gèng)改,直(zhí)接Next。
图(tú) 616
設置c0的(de)輸出(chū)頻率。我(wǒ)们(men)選擇Enter output clock frequest中(zhōng),直(zhí)接填入(rù)25,單位選擇MHz,就(jiù)是(shì)表(biǎo)示要(yào)産生(shēng)25MHz的(de)时(shí)鐘(zhōng)。然後(hòu)點(diǎn)擊Finish,弹出(chū)如(rú)下(xià)窗(chuāng)口(kǒu)。
图(tú) 617
取(qǔ)消my_pll_bb.v的(de)勾選,然後(hòu)選擇Finish。QUARTUS就(jiù)会(huì)産生(shēng)PLL IP的(de)代(dài)碼了(le)。
稍等片(piàn)刻,到(dào)工程目录(lù) D:mdy_bookd_prj,可(kě)以(yǐ)看(kàn)到(dào)生(shēng)成(chéng)一(yī)个(gè)my_pll.v文(wén)件(jiàn),用(yòng)GVIM打(dǎ)開(kāi)後(hòu),可(kě)以(yǐ)看(kàn)到(dào)PLL模块(kuài)的(de)模块(kuài)輸入(rù)輸出(chū)接口(kǒu)。其中(zhōng)inclk0是(shì)50MHz輸入(rù)时(shí)鐘(zhōng),c0是(shì)25MHz的(de)輸出(chū)时(shí)鐘(zhōng)。頂层模块(kuài)直(zhí)接例化(huà)就(jiù)可(kě)以(yǐ)使用(yòng)了(le)。
图(tú) 618
|
1 2 3 4 |
my_pll u_my_pll( .inclk0(clk ) , .c0 (ad_clk ) ); |
至(zhì)此(cǐ),主(zhǔ)體(tǐ)程序已經(jīng)完成(chéng)。接下(xià)来(lái)是(shì)将module補充完整。
3.4 信(xìn)号(hào)定(dìng)義
接下(xià)来(lái)定(dìng)義信(xìn)号(hào)類(lèi)型。
在(zài)“FIR濾波(bō)器案(àn)例”中(zhōng)已經(jīng)说(shuō)明(míng)了(le)部(bù)分(fēn)信(xìn)号(hào)的(de)说(shuō)明(míng),現(xiàn)補充如(rú)下(xià)。
|
1 2 3 4 |
wire [6:0] addr ; reg [7:0] sin_data ;
reg [7:0] dac_da ; wire dac_sleep ; wire dac_wra ; wire dac_clka ; wire dac_mode ; reg [16:0] addr_tmp ; |
ad_clk是(shì)由(yóu)例化(huà)模块(kuài)輸出(chū)信(xìn)号(hào),非(fēi)always産生(shēng),可(kě)以(yǐ)定(dìng)義为(wèi)wire型,只(zhī)有(yǒu)1位。
|
1 |
wire ad_clk ; |
4 綜合與(yǔ)上(shàng)板
4.1 添加文(wén)件(jiàn)到(dào)工程
图(tú) 619
1.前(qián)面(miàn)已經(jīng)介紹了(le)新建工程。現(xiàn)在(zài)打(dǎ)開(kāi)quartus,在(zài)Project菜單中(zhōng)選擇Add/Remove File to Project,弹出(chū)文(wén)件(jiàn)窗(chuāng)口(kǒu)。
图(tú) 620
點(diǎn)擊右(yòu)上(shàng)角(jiǎo)的(de)
,在(zài)弹出(chū)来(lái)的(de)窗(chuāng)口(kǒu)中(zhōng),双(shuāng)擊選擇D:mdy_bookd_prj目录(lù)下(xià)的(de)ad_prj.v文(wén)件(jiàn)。然後(hòu)記(jì)得要(yào)點(diǎn)Add,才算正(zhèng)式加到(dào)工程。
图(tú) 621
點(diǎn)OK關(guān)閉本(běn)窗(chuāng)口(kǒu)。
4.2 綜合
1.點(diǎn)擊右(yòu)上(shàng)角(jiǎo)藍(lán)色(sè)三(sān)角(jiǎo)鍵進(jìn)行編譯
图(tú) 622
之後(hòu)等待編譯成(chéng)功
4.3 配置管(guǎn)脚
图(tú) 623
在(zài)菜單欄中(zhōng),選中(zhōng)Assignments,然後(hòu)選擇Pin Planner,就(jiù)会(huì)弹出(chū)配置管(guǎn)脚的(de)窗(chuāng)口(kǒu)。
图(tú) 624
在(zài)配置窗(chuāng)口(kǒu)中(zhōng)的(de)location一(yī)列,可(kě)以(yǐ)填写每个(gè)管(guǎn)脚所(suǒ)对(duì)應(yìng)的(de)FPGA管(guǎn)脚号(hào)。
|
器件(jiàn) |
AD9709管(guǎn)脚 |
AD9280管(guǎn)脚 |
原理图(tú)信(xìn)号(hào) |
FPGA管(guǎn)脚 |
FPGA工程信(xìn)号(hào) |
|
U8 |
MODE |
|
DAC_MODE |
Y4 |
dac_mode |
|
SLEEP |
|
DAC_SLEEP |
H2 |
dac_sleep |
|
|
CLK1 |
|
DA_CLKA |
R2 |
dac_clka |
|
|
WRT1 |
|
DA_WRA |
U1 |
dac_wra |
|
|
DB7P1 |
|
DAC_DA7 |
AA1 |
dac_da[7] |
|
|
DB6P1 |
|
DAC_DA6 |
Y2 |
dac_da[6] |
|
|
DB5P1 |
|
DAC_DA5 |
Y1 |
dac_da[5] |
|
|
DB4P1 |
|
DAC_DA4 |
W2 |
dac_da[4] |
|
|
DB3P1 |
|
DAC_DA3 |
W1 |
dac_da[3] |
|
|
DB2P1 |
|
DAC_DA2 |
V2 |
dac_da[2] |
|
|
DB1P1 |
|
DAC_DA1 |
V1 |
dac_da[1] |
|
|
DB0P1 |
|
DAC_DA0 |
U2 |
dac_da[0] |
|
|
U1 |
|
CLK |
AD_CLK |
L6 |
ad_clk |
|
|
D7 |
AD_D7 |
N5 |
ad_in[7] |
|
|
|
D6 |
AD_D6 |
M4 |
ad_in[6] |
|
|
|
D5 |
AD_D5 |
M5 |
ad_in[5] |
|
|
|
D4 |
AD_D4 |
R6 |
ad_in[4] |
|
|
|
D3 |
AD_D3 |
T5 |
ad_in[3] |
|
|
|
D2 |
AD_D2 |
U7 |
ad_in[2] |
|
|
|
D1 |
AD_D1 |
V5 |
ad_in[1] |
|
|
|
D0 |
AD_D0 |
V6 |
ad_in[0] |
|
|
X1 |
|
|
SYS_CLK |
G1 |
clk |
|
K1 |
|
|
SYS_RST |
AB12 |
rst_n |
|
sw0 |
|
|
SW_D0 |
AA3 |
key[2] |
|
sw1 |
|
|
SW_D1 |
AB3 |
key[1] |
|
sw2 |
|
|
SW_D2 |
AB5 |
key[0] |
按上(shàng)面(miàn)配置好(hǎo)每个(gè)信(xìn)号(hào)的(de)管(guǎn)脚,其最(zuì)終(zhōng)效果(guǒ)如(rú)下(xià)图(tú)。
图(tú) 625
關(guān)閉Pin Planner,软(ruǎn)件(jiàn)自(zì)動(dòng)会(huì)保存管(guǎn)脚配置信(xìn)息。
4.4 再次(cì)綜合
图(tú) 626
在(zài)菜單欄中(zhōng),選中(zhōng)Processing,然後(hòu)選擇Start Compilation,再次(cì)对(duì)整个(gè)工程進(jìn)行編譯和(hé)綜合。
图(tú) 627
出(chū)現(xiàn)上(shàng)面(miàn)的(de)界面(miàn),就(jiù)说(shuō)明(míng)編譯綜合成(chéng)功。
4.5 連(lián)接開(kāi)發(fà)板
图(tú) 628
連(lián)接示意(yì)如(rú)上(shàng)图(tú)所(suǒ)示。将電(diàn)源接上(shàng)開(kāi)發(fà)板;USB BLASTER一(yī)端連(lián)接到(dào)JTAG插口(kǒu),另(lìng)一(yī)端連(lián)到(dào)PC的(de)USB接口(kǒu);将開(kāi)發(fà)板上(shàng)的(de)P7接口(kǒu)和(hé)P11與(yǔ)示波(bō)器的(de)两(liǎng)个(gè)通(tòng)道(dào)相連(lián)。最(zuì)後(hòu)再将電(diàn)源打(dǎ)開(kāi)。
4.6 設置SIGNALTAP
4.7 用(yòng)SIGNALTAP观察








