官网(wǎng)連(lián)载的(de)內(nèi)容将出(chū)版成(chéng)图(tú)書(shū),并将录(lù)制視頻,免費公開(kāi)学習,欢迎大家(jiā)留意(yì)。本(běn)連(lián)载前(qián)面(miàn)是(shì)基礎部(bù)分(fēn),與(yǔ)一(yī)般教材无异(yì),後(hòu)面(miàn)是(shì)項目实踐,是(shì)本(běn)連(lián)载的(de)特(tè)色(sè)。如(rú)果(guǒ)你有(yǒu)一(yī)定(dìng)的(de)基礎(能(néng)看(kàn)懂verilog代(dài)碼即可(kě)),那(nà)麼(me)可(kě)跳过(guò)前(qián)面(miàn)部(bù)分(fēn),直(zhí)接学習後(hòu)面(miàn)的(de)項目实踐。項目实踐将有(yǒu)16个(gè),從基礎的(de)閃爍燈(dēng)開(kāi)始,到(dào)最(zuì)後(hòu)是(shì)信(xìn)号(hào)处理的(de)項目,如(rú)信(xìn)号(hào)發(fà)生(shēng)器、FIR濾波(bō)器、插值濾波(bō)器和(hé)AD采集等。
本(běn)連(lián)载学習效果(guǒ):不(bù)僅看(kàn)能(néng)懂代(dài)碼,還(huán)能(néng)知道(dào)每一(yī)行代(dài)碼怎麼(me)写,怎麼(me)設計(jì)。
第(dì)二(èr)階(jiē)段(duàn) 項目实踐
本(běn)文(wén)的(de)文(wén)檔編号(hào):000600000025
需要(yào)看(kàn)对(duì)應(yìng)的(de)視頻,請點(diǎn)擊視頻編号(hào):002700000452
1、本(běn)文(wén)檔講述FPGA産生(shēng)两(liǎng)路(lù)正(zhèng)弦波(bō)數據(jù),一(yī)路(lù)直(zhí)接由(yóu)DA輸出(chū),一(yī)路(lù)經(jīng)过(guò)FIR处理之後(hòu)輸出(chū),然後(hòu)傳到(dào)示波(bō)器進(jìn)行观察,從而(ér)了(le)解(jiě)FIR濾波(bō)器的(de)效果(guǒ)
2、801開(kāi)發(fà)板使用(yòng)
第(dì)十(shí)四(sì)章(zhāng) FIR濾波(bō)器設計(jì)
1 項目背景
1.1 FIR和(hé)IIR濾波(bō)器
FIR(Finite Impulse Response)Filter:有(yǒu)限沖激響應(yìng)濾波(bō)器,又稱为(wèi)非(fēi)遞歸線(xiàn)性(xìng)濾波(bō)器。
FIR濾波(bō)器,顧名思(sī)義,其脈沖響應(yìng)由(yóu)有(yǒu)限个(gè)采樣(yàng)值構成(chéng)。长度(dù)(抽头(tóu)數)为(wèi)N、階(jiē)數为(wèi)N?1的(de)FIR系(xì)統的(de)轉(zhuǎn)移函(hán)數、差分(fēn)方(fāng)程和(hé)單位沖激響應(yìng)分(fēn)别如(rú)下(xià)列三(sān)式所(suǒ)示。
图(tú) 510
IIR(Infinite Impulse Response)Filter:无限沖激響應(yìng)濾波(bō)器,又稱为(wèi)遞歸線(xiàn)性(xìng)濾波(bō)器。
FIR相对(duì)與(yǔ)IIR来(lái)说(shuō),具有(yǒu)如(rú)下(xià)的(de)优點(diǎn):
- 可(kě)以(yǐ)具備線(xiàn)性(xìng)相位特(tè)性(xìng)
線(xiàn)性(xìng)相位的(de)概念: 如(rú)果(guǒ)濾波(bō)器的(de)N个(gè)实值系(xì)數为(wèi)对(duì)稱或(huò)者(zhě)反(fǎn)对(duì)稱結構,該濾波(bō)器具有(yǒu)線(xiàn)性(xìng)相位。 W(n)=±W(N?1?n)W(n)=±W(N?1?n)
線(xiàn)性(xìng)相位的(de)特(tè)性(xìng):通(tòng)过(guò)線(xiàn)性(xìng)相位濾波(bō)器的(de)信(xìn)号(hào)的(de)所(suǒ)有(yǒu)頻率部(bù)分(fēn)具有(yǒu)相同(tóng)的(de)延遲量(liàng)。
- 易于(yú)設計(jì)
但FIR也(yě)有(yǒu)自(zì)身(shēn)的(de)缺點(diǎn):同(tóng)樣(yàng)指标(biāo)的(de)濾波(bō)器,FIR需要(yào)更(gèng)多(duō)的(de)參數,即实現(xiàn)时(shí)消耗更(gèng)多(duō)的(de)計(jì)算單元(yuán),産生(shēng)更(gèng)大的(de)延遲。
1.2 FIR濾波(bō)器的(de)原理
信(xìn)号(hào)通(tòng)过(guò)一(yī)个(gè)FIR濾波(bō)器其实就(jiù)是(shì)信(xìn)号(hào)與(yǔ)FIR濾波(bō)器的(de)系(xì)數進(jìn)行卷(juǎn)積(即乘累加)的(de)过(guò)程。我(wǒ)们(men)以(yǐ)一(yī)个(gè)簡單信(xìn)号(hào)模型为(wèi)例,了(le)解(jiě)一(yī)下(xià)FIR波(bō)形器的(de)原理。
現(xiàn)在(zài)有(yǒu)三(sān)組信(xìn)号(hào),分(fēn)别是(shì):
信(xìn)号(hào)1:低頻信(xìn)号(hào),即在(zài)时(shí)域上(shàng)變(biàn)化(huà)慢(màn)的(de)信(xìn)号(hào),其輸入(rù)先(xiān)後(hòu)为(wèi)1 1 1 1 2 2 2 2。
信(xìn)号(hào)2:直(zhí)流信(xìn)号(hào),其輸入(rù)先(xiān)後(hòu)为(wèi)1 1 1 1 1 1 1 。
信(xìn)号(hào)3:高(gāo)頻信(xìn)号(hào),即在(zài)时(shí)域上(shàng)變(biàn)化(huà)快(kuài)的(de)信(xìn)号(hào),其輸入(rù)先(xiān)後(hòu)为(wèi)1 2 1 2 1 2 1 2 。
簡單的(de)濾波(bō)器模型
低通(tòng)濾波(bō)器:1 1
信(xìn)号(hào)1與(yǔ)低通(tòng)濾波(bō)器進(jìn)行卷(juǎn)積運算,其結果(guǒ)再除以(yǐ)2,得到(dào)如(rú)下(xià)數據(jù):1 1 1 1.5 2 2 2。可(kě)以(yǐ)看(kàn)到(dào),低頻信(xìn)号(hào)經(jīng)过(guò)低通(tòng)濾波(bō)器後(hòu),各(gè)个(gè)點(diǎn)仍然保持(chí)了(le)其形狀,而(ér)且在(zài)1變(biàn)成(chéng)2时(shí),還(huán)變(biàn)平緩了(le)。
信(xìn)号(hào)2與(yǔ)低通(tòng)濾波(bō)器進(jìn)行卷(juǎn)積運算,其結果(guǒ)再除以(yǐ)2,得到(dào)如(rú)下(xià)數據(jù):1 1 1 1 1 1 1。可(kě)以(yǐ)看(kàn)到(dào),直(zhí)流信(xìn)号(hào)與(yǔ)輸入(rù)的(de)信(xìn)号(hào)完成(chéng)相同(tóng)。
信(xìn)号(hào)3與(yǔ)低通(tòng)濾波(bō)器進(jìn)行卷(juǎn)積運算,其結果(guǒ)再除以(yǐ)2,得到(dào)如(rú)下(xià)數據(jù):1.5 1.5 1.5 1.5 1.5 1.5 1.5。可(kě)以(yǐ)看(kàn)到(dào),高(gāo)頻信(xìn)号(hào)經(jīng)过(guò)低通(tòng)濾波(bō)器後(hòu),已經(jīng)完成(chéng)消去(qù)了(le)形狀,變(biàn)成(chéng)了(le)直(zhí)流信(xìn)号(hào)。
再考慮另(lìng)一(yī)種(zhǒng)濾波(bō)器模型,高(gāo)通(tòng)濾波(bō)器:1 -1
信(xìn)号(hào)1與(yǔ)高(gāo)通(tòng)濾波(bō)器進(jìn)行卷(juǎn)積運算,其結果(guǒ)再除以(yǐ)2,得到(dào)如(rú)下(xià)數據(jù):0 0 0 -0.5 0 0 0。可(kě)以(yǐ)看(kàn)到(dào),低頻信(xìn)号(hào)經(jīng)过(guò)高(gāo)通(tòng)濾波(bō)器後(hòu),信(xìn)号(hào)變(biàn)化(huà)基本(běn)上(shàng)消失。
信(xìn)号(hào)2與(yǔ)低通(tòng)濾波(bō)器進(jìn)行卷(juǎn)積運算,其結果(guǒ)再除以(yǐ)2,得到(dào)如(rú)下(xià)數據(jù):0 0 0 0 0 0 0。可(kě)以(yǐ)看(kàn)到(dào),直(zhí)流信(xìn)号(hào)仍然是(shì)沒(méi)有(yǒu)變(biàn)化(huà)。
信(xìn)号(hào)3與(yǔ)低通(tòng)濾波(bō)器進(jìn)行卷(juǎn)積運算,其結果(guǒ)再除以(yǐ)2,得到(dào)如(rú)下(xià)數據(jù):-0.5 0.5 -0.5 0.5 -0.5 0.5 -0.5 0.5。可(kě)以(yǐ)看(kàn)到(dào),高(gāo)頻信(xìn)号(hào)已經(jīng)仍然保持(chí)了(le)變(biàn)化(huà)的(de)形狀。
由(yóu)这(zhè)两(liǎng)个(gè)例子可(kě)以(yǐ)看(kàn)出(chū),FIR濾波(bō)器其实就(jiù)是(shì)信(xìn)号(hào)與(yǔ)FIR濾波(bō)器的(de)系(xì)數進(jìn)行卷(juǎn)積(即乘累加)的(de)过(guò)程。通(tòng)过(guò)調整濾波(bō)器系(xì)數、抽头(tóu)个(gè)數,就(jiù)可(kě)实現(xiàn)低通(tòng)、高(gāo)通(tòng)、带(dài)通(tòng)等濾波(bō)器。
1.3 FIR濾波(bō)器的(de)設計(jì)
1.3.1 matlab産生(shēng)濾波(bō)器系(xì)數
打(dǎ)開(kāi)matlab在(zài)其命令窗(chuāng)口(kǒu)輸入(rù)fdatool 按下(xià)回(huí)車
調出(chū)FIR濾波(bō)器的(de)設計(jì)界面(miàn)
图(tú) 511
在(zài)波(bō)形設計(jì)界面(miàn)中(zhōng),我(wǒ)们(men)重(zhòng)要(yào)關(guān)注以(yǐ)下(xià)選項。
Response Type:選擇可(kě)以(yǐ)選擇濾波(bō)器的(de)類(lèi)型,可(kě)選擇:lowpass低通(tòng)濾波(bō)器、Highpass高(gāo)通(tòng)濾波(bō)器、bandpass带(dài)通(tòng)濾波(bō)器、bandstop带(dài)阻濾波(bō)器。
Fs(采樣(yàng)頻率):
Fstop :信(xìn)号(hào)截止頻率
Fpass:
Filter Order:用(yòng)来(lái)設置濾波(bō)器的(de)抽头(tóu)个(gè)數。可(kě)以(yǐ)在(zài)specify order中(zhōng)輸入(rù)个(gè)數,也(yě)可(kě)以(yǐ)選擇Minimum order,讓系(xì)統計(jì)算滿足要(yào)求的(de)前(qián)提(tí)下(xià)的(de)最(zuì)小抽头(tóu)个(gè)數。
點(diǎn)擊Design Filter,就(jiù)可(kě)以(yǐ)計(jì)算出(chū)抽头(tóu)系(xì)數。
産生(shēng)系(xì)數後(hòu)點(diǎn)擊file 菜單里(lǐ)的(de)Export 将系(xì)數保存到(dào)工作區(qū)
图(tú) 512
點(diǎn)擊export
图(tú) 513
點(diǎn)擊之後(hòu)打(dǎ)開(kāi)工作區(qū)里(lǐ)的(de)Num
图(tú) 514
而(ér)後(hòu)将下(xià)图(tú)第(dì)一(yī)列的(de)數據(jù)複制粘贴到(dào)txt文(wén)件(jiàn)中(zhōng)
图(tú) 515
注意(yì)複制後(hòu)需在(zài)两(liǎng)个(gè)系(xì)數間(jiān)插入(rù)逗(dòu)号(hào)(英文(wén)輸入(rù)狀态下(xià)的(de)的(de)逗(dòu)号(hào))
图(tú) 516
这(zhè)樣(yàng)就(jiù)得到(dào)濾波(bō)器的(de)系(xì)數了(le)。
1.3.2 FPGA生(shēng)成(chéng)FIR IP核
打(dǎ)開(kāi)工程後(hòu),在(zài)IP catalog这(zhè)一(yī)界面(miàn)中(zhōng)選擇DSP下(xià)一(yī)目录(lù)中(zhōng)選擇Filter 在(zài)選擇選擇 FIR II
图(tú) 517
首先(xiān)在(zài)Fitter这(zhè)一(yī)界面(miàn)做如(rú)下(xià)操作
图(tú) 518
Filter Type
Interpolation Factor:
Decimation Factor:
Max Number of channels:
Clock rate:填写本(běn)IP核的(de)工作时(shí)鐘(zhōng)頻率。
clock slack:
Input sample rate (msps):采樣(yàng)率
點(diǎn)擊coefficients,進(jìn)入(rù)coefficients界面(miàn)。
这(zhè)一(yī)界面(miàn)點(diǎn)擊import from file ,弹出(chū)一(yī)下(xià)界面(miàn),找(zhǎo)出(chū)我(wǒ)们(men)之前(qián)用(yòng)matlab生(shēng)成(chéng)的(de)系(xì)數文(wén)件(jiàn),點(diǎn)擊import,導入(rù)成(chéng)功後(hòu)可(kě)以(yǐ)看(kàn)到(dào)下(xià)图(tú)的(de) frequency response界面(miàn)的(de)波(bō)形發(fà)生(shēng)變(biàn)化(huà)。
图(tú) 519
在(zài)coefficient界面(miàn),還(huán)可(kě)以(yǐ)設置系(xì)數的(de)格式、數據(jù)位宽(kuān)等。
图(tú) 520
其它(tā)選項不(bù)改按默認的(de)来(lái)點(diǎn)擊finish即可(kě)。
以(yǐ)上(shàng)就(jiù)是(shì)生(shēng)成(chéng) FIR濾波(bō)器的(de)主(zhǔ)要(yào)步驟。
2 設計(jì)目标(biāo)
本(běn)次(cì)案(àn)例将使用(yòng)到(dào)采樣(yàng)率大于(yú)100M的(de)双(shuāng)通(tòng)道(dào)的(de)示波(bō)器。将示波(bō)器的(de)两(liǎng)个(gè)通(tòng)道(dào),分(fēn)别與(yǔ)FPGA的(de)DA通(tòng)道(dào)1和(hé)DA通(tòng)道(dào)2相連(lián),观察两(liǎng)路(lù)DA的(de)輸出(chū)。其連(lián)接示意(yì)如(rú)下(xià)图(tú)所(suǒ)示。
图(tú) 521
本(běn)案(àn)例是(shì)FPGA內(nèi)部(bù)産生(shēng)正(zhèng)弦信(xìn)号(hào),这(zhè)个(gè)正(zhèng)弦信(xìn)号(hào)一(yī)路(lù)輸出(chū)給(gěi)DA通(tòng)道(dào)1,另(lìng)一(yī)路(lù)經(jīng)过(guò)FIR濾波(bō)器後(hòu),輸出(chū)給(gěi)DA通(tòng)道(dào)2。
图(tú) 522
正(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ō)。
FIR濾波(bō)器是(shì)低通(tòng)濾波(bō)器,其截止頻率是(shì)500KHz,这(zhè)樣(yàng)原則上(shàng)超过(guò)500KHz的(de)信(xìn)号(hào)就(jiù)会(huì)被(bèi)濾除。濾波(bō)器的(de)輸出(chū)給(gěi)通(tòng)道(dào)2。
下(xià)面(miàn)是(shì)示波(bō)器的(de)顯示效果(guǒ),其中(zhōng)黃色(sè)是(shì)通(tòng)道(dào)1輸出(chū)的(de)信(xìn)号(hào)(上(shàng)面(miàn)的(de)波(bō)形),下(xià)面(miàn)藍(lán)色(sè)是(shì)通(tòng)道(dào)2的(de)輸出(chū)信(xìn)号(hào)(下(xià)面(miàn)的(de)波(bō)形)。
下(xià)图(tú)是(shì)100KHz的(de)信(xìn)号(hào)图(tú)。
100KHz的(de)信(xìn)号(hào)图(tú)
下(xià)图(tú)是(shì)200KHz的(de)信(xìn)号(hào)图(tú)。

200KHz的(de)信(xìn)号(hào)图(tú)
下(xià)图(tú)是(shì)300KHz的(de)信(xìn)号(hào)图(tú)。
300KHz的(de)信(xìn)号(hào)图(tú)
下(xià)图(tú)是(shì)400KHz的(de)信(xìn)号(hào)图(tú),可(kě)以(yǐ)看(kàn)到(dào)已經(jīng)衰減了(le)。

400KHz的(de)信(xìn)号(hào)图(tú)
下(xià)图(tú)是(shì)500KHz的(de)信(xìn)号(hào)图(tú),可(kě)以(yǐ)看(kàn)到(dào)已經(jīng)衰減的(de)很小了(le)。

500KHz的(de)信(xìn)号(hào)图(tú)
下(xià)图(tú)是(shì)600KHz的(de)信(xìn)号(hào)图(tú),可(kě)以(yǐ)看(kàn)到(dào)通(tòng)道(dào)2已經(jīng)沒(méi)有(yǒu)波(bō)形。

600KHz的(de)信(xìn)号(hào)图(tú)
下(xià)图(tú)是(shì)700KHz的(de)信(xìn)号(hào)图(tú),可(kě)以(yǐ)看(kàn)到(dào)通(tòng)道(dào)2已經(jīng)沒(méi)有(yǒu)波(bō)形。

700KHz的(de)信(xìn)号(hào)图(tú)
下(xià)图(tú)是(shì)800KHz的(de)信(xìn)号(hào)图(tú),可(kě)以(yǐ)看(kàn)到(dào)通(tòng)道(dào)2已經(jīng)沒(méi)有(yǒu)波(bō)形。
800KHz的(de)信(xìn)号(hào)图(tú)
3 設計(jì)实現(xiàn)
3.1 頂层接口(kǒu)
新建目录(lù):D:mdy_bookir_prj。在(zài)該目录(lù)中(zhōng),新建一(yī)个(gè)名为(wèi)fir_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未濾波(bō)的(de)正(zhèng)弦信(xìn)号(hào),讓通(tòng)道(dào)B輸出(chū)濾波(bō)後(hòu)的(de)正(zhèng)弦信(xìn)号(hào)。为(wèi)了(le)控制AD9709的(de)工作模式,就(jiù)要(yào)控制AD9709的(de)MODE、SLEEP管(guǎn)脚;为(wèi)了(le)控制通(tòng)道(dào)A,就(jiù)需要(yào)控制AD9729的(de)CLK1、WRT1、DB7~0P1管(guǎn)脚;为(wèi)了(le)控制通(tòng)道(dào)B,就(jiù)需要(yào)控制AD9729的(de)CLK2、WRT2、DB7~0P2管(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)dac_clkb号(hào)連(lián)接到(dào)AD9709的(de)CLK2脚,用(yòng)来(lái)控制通(tòng)道(dào)B时(shí)鐘(zhōng)。
10. 使用(yòng)dac_wrb号(hào)連(lián)接到(dào)AD9709的(de)WRT2脚,用(yòng)来(lái)控制通(tòng)道(dào)B使能(néng)。
11. 使用(yòng)8位信(xìn)号(hào)dac_db接到(dào)AD9709的(de)DB7~0P2脚,用(yòng)来(lái)控制通(tòng)道(dào)B写數據(jù)。
綜上(shàng)所(suǒ)述,我(wǒ)们(men)这(zhè)个(gè)工程需要(yào)11个(gè)信(xìn)号(hào),时(shí)鐘(zhōng)clk,複位rst_n,撥碼開(kāi)關(guān)的(de)輸入(rù)key,dac_mode、dac_sleep、dac_clka、dac_wra、dac_da、dac_clkb、dac_wrb和(hé)dac_db信(xìn)号(hào),其中(zhōng)dac_da和(hé)dac_db是(shì)8位信(xìn)号(hào),其他(tā)都是(shì)1位信(xìn)号(hào)。下(xià)面(miàn)表(biǎo)格表(biǎo)示了(le)硬(yìng)件(jiàn)電(diàn)路(lù)图(tú)的(de)連(lián)接關(guān)系(xì)。
|
器件(jiàn) |
AD9709管(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] |
|
|
CLK2 |
DA_CLKB |
R1 |
dac_clkb |
|
|
WRT2 |
DA_WRB |
P2 |
dac_wrb |
|
|
DB7P2 |
DAC_DB7 |
P1 |
dac_db[7] |
|
|
DB6P2 |
DAC_DB6 |
N2 |
dac_db[6] |
|
|
DB5P2 |
DAC_DB5 |
N1 |
dac_db[5] |
|
|
DB4P2 |
DAC_DB4 |
M2 |
dac_db[4] |
|
|
DB3P2 |
DAC_DB3 |
M1 |
dac_db[3] |
|
|
DB2P2 |
DAC_DB2 |
J1 |
dac_db[2] |
|
|
DB1P2 |
DAC_DB1 |
J2 |
dac_db[1] |
|
|
DB0P2 |
DAC_DB0 |
H1 |
dac_db[0] |
|
|
X1 |
|
SYS_CLK |
G1 |
clk |
|
K1 |
|
SYS_RST |
AB12 |
rst_n |
将module的(de)名稱定(dìng)義为(wèi)fir_prj,代(dài)碼如(rú)下(xià):
|
1 2 3 4 5 6 7 8 9 |
module fir_prj( clk , rst_n , key , dac_mode , dac_sleep , dac_clka , dac_da , dac_wra , dac_clkb , dac_db , dac_wrb ); |
其中(zhōng)clk、rst_n是(shì)1位的(de)輸入(rù)信(xìn)号(hào),dac_da和(hé)dac_db是(shì)8位的(de)輸出(chū)信(xìn)号(hào),key是(shì)3位輸入(rù)信(xìn)号(hào),dac_mode,dac_clka,dac_wra,dac_sleep,dac_clkb,dac_wrb是(shì)一(yī)位輸出(chū)信(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 dac_clkb ; output [ 8-1:0] dac_db ; output dac_wrb ;
|
3.2 正(zhèng)弦信(xìn)号(hào)設計(jì)
假設産生(shēng)的(de)正(zhèng)弦信(xìn)号(hào)命名为(wèi)sin_data信(xìn)号(hào)。sin_data是(shì)從表(biǎo)XX中(zhōng)選擇出(chū)来(lái)的(de)值,該表(biǎo)一(yī)共(gòng)有(yǒu)128个(gè)點(diǎn)。該表(biǎo)的(de)産生(shēng)方(fāng)法,請看(kàn)案(àn)例“信(xìn)号(hào)發(fà)生(shēng)器和(hé)DA轉(zhuǎn)換”一(yī)章(zhāng)的(de)內(nèi)容。
采樣(yàng)點(diǎn)i
sin_data
(16進(jìn)制)
采樣(yàng)點(diǎn)i
sin_data
(16進(jìn)制)
采樣(yàng)點(diǎn)i
sin_data
(16進(jìn)制)
采樣(yàng)點(diǎn)i
sin_data
(16進(jìn)制)
0
7F
32
FE
64
7D
96
1
1
85
33
FE
65
77
97
1
2
8C
34
FE
66
70
98
2
3
92
35
FD
67
6A
99
3
4
98
36
FC
68
64
100
4
5
9E
37
FA
69
5E
101
6
6
A4
38
F8
70
58
102
7
7
AA
39
F6
71
52
103
A
8
B0
40
F4
72
4C
104
C
9
B6
41
F1
73
46
105
F
10
BC
42
EF
74
41
106
12
11
C1
43
EB
75
3C
107
15
12
C6
44
E8
76
36
108
19
13
CB
45
E4
77
31
109
1D
14
D0
46
E0
78
2C
110
21
15
D5
47
DC
79
28
111
25
16
DA
48
D8
80
23
112
2A
17
DE
49
D3
81
1F
113
2E
18
E2
50
CE
82
1B
114
33
19
E6
51
C9
83
17
115
38
20
EA
52
C4
84
14
116
3E
21
ED
53
BE
85
11
117
43
22
F0
54
B9
86
E
118
49
23
F3
55
B3
87
B
119
4E
24
F5
56
AD
88
9
120
54
25
F7
57
A7
89
7
121
5A
26
F9
58
A1
90
5
122
60
27
FB
59
9B
91
3
123
67
28
FC
60
95
92
2
124
6D
29
FD
61
8F
93
1
125
73
30
FE
62
89
94
1
126
79
31
FE
63
82
95
1
127
7F
很自(zì)然地(dì)定(dìng)義一(yī)个(gè)7位的(de)選擇信(xìn)号(hào)addr。我(wǒ)们(men)只(zhī)要(yào)控制好(hǎo)addr,就(jiù)能(néng)方(fāng)便得到(dào)sin_data。因(yīn)此(cǐ)可(kě)以(yǐ)写出(chū)下(xià)面(miàn)代(dài)碼。
|
1 2 3 4 5 6 7 8 9 |
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 |
接下(xià)来(lái)是(shì)設計(jì)信(xìn)号(hào)addr。
addr是(shì)用(yòng)来(lái)控制選擇數據(jù)的(de)地(dì)址,通(tòng)过(guò)控制addr的(de)增加值,就(jiù)能(néng)産生(shēng)多(duō)種(zhǒng)頻率的(de)正(zhèng)弦波(bō)。
以(yǐ)頻率为(wèi)100KHz的(de)正(zhèng)弦信(xìn)号(hào)为(wèi)例。該正(zhèng)弦信(xìn)号(hào)的(de)周期(qī)是(shì)10000ns。本(běn)工程的(de)工作时(shí)鐘(zhōng)是(shì)20ns,也(yě)就(jiù)是(shì)10000/20 = 500个(gè)时(shí)鐘(zhōng)輸出(chū)一(yī)个(gè)正(zhèng)弦信(xìn)号(hào),也(yě)就(jiù)是(shì)500个(gè)时(shí)鐘(zhōng)将上(shàng)表(biǎo)的(de)128个(gè)值輸出(chū)一(yī)遍(biàn)。因(yīn)此(cǐ)每个(gè)时(shí)鐘(zhōng)addr增加的(de)值:128/500 = 0.256。
按同(tóng)樣(yàng)的(de)分(fēn)析方(fāng)法,可(kě)以(yǐ)得到(dào)其他(tā)信(xìn)号(hào)頻率的(de)addr增加值,總(zǒng)結如(rú)下(xià)。
100KHz的(de)正(zhèng)弦信(xìn)号(hào),每个(gè)时(shí)鐘(zhōng)addr增加:128/250 = 0.256
200KHz的(de)正(zhèng)弦信(xìn)号(hào),每个(gè)时(shí)鐘(zhōng)addr增加:128/250 = 0.512
300KHz的(de)正(zhèng)弦信(xìn)号(hào),每个(gè)时(shí)鐘(zhōng)addr增加:128/166.6667 = 0.7679
400KHz的(de)正(zhèng)弦信(xìn)号(hào),每个(gè)时(shí)鐘(zhōng)addr增加:128/125 = 1.024
500KHz的(de)正(zhèng)弦信(xìn)号(hào),每个(gè)时(shí)鐘(zhōng)addr增加:128/100 = 1.28
600KHz的(de)正(zhèng)弦信(xìn)号(hào),每个(gè)时(shí)鐘(zhōng)addr增加:128/83.3333 = 1.5358
700KHz的(de)正(zhèng)弦信(xìn)号(hào),每个(gè)时(shí)鐘(zhōng)addr增加:128/71.4286 = 1.792
800KHz的(de)正(zhèng)弦信(xìn)号(hào),每个(gè)时(shí)鐘(zhōng)addr增加:128/62.5 = 2.048
由(yóu)于(yú)addr是(shì)表(biǎo)示0~127的(de)整數,而(ér)addr每次(cì)增加的(de)值包(bāo)含小數,而(ér)FPGA是(shì)沒(méi)有(yǒu)小數的(de)。为(wèi)此(cǐ),我(wǒ)们(men)将上(shàng)面(miàn)的(de)小數乘以(yǐ)1024,然後(hòu)取(qǔ)整,就(jiù)變(biàn)成(chéng)了(le)每次(cì)要(yào)增加的(de)整數,結果(guǒ)保存到(dào)addr_tmp中(zhōng)。即:
100KHz的(de)正(zhèng)弦信(xìn)号(hào),每个(gè)时(shí)鐘(zhōng)addr_tmp增加:0.256 *1024 = 262.144 ≈ 262
200KHz的(de)正(zhèng)弦信(xìn)号(hào),每个(gè)时(shí)鐘(zhōng)addr_tmp增加:0.512 *1024 = 524.288 ≈ 524
300KHz的(de)正(zhèng)弦信(xìn)号(hào),每个(gè)时(shí)鐘(zhōng)addr_tmp增加:0.7679 *1024 =786.3296 ≈ 786
400KHz的(de)正(zhèng)弦信(xìn)号(hào),每个(gè)时(shí)鐘(zhōng)addr_tmp增加:1.024 *1024 =1028.576 ≈ 1029
500KHz的(de)正(zhèng)弦信(xìn)号(hào),每个(gè)时(shí)鐘(zhōng)addr_tmp增加:1.28 *1024 =1310.72 ≈ 1311
600KHz的(de)正(zhèng)弦信(xìn)号(hào),每个(gè)时(shí)鐘(zhōng)addr_tmp增加:1.5358 *1024 =1572.6592 ≈1573
700KHz的(de)正(zhèng)弦信(xìn)号(hào),每个(gè)时(shí)鐘(zhōng)addr_tmp增加:1.792 *1024 =1835.008 ≈ 1835
800KHz的(de)正(zhèng)弦信(xìn)号(hào),每个(gè)时(shí)鐘(zhōng)addr_tmp增加: 2.048 *1024 =2097.152 ≈ 2097
而(ér)上(shàng)面(miàn)8種(zhǒng)頻率信(xìn)号(hào),是(shì)由(yóu)撥碼信(xìn)号(hào)key控制的(de)。因(yīn)此(cǐ),可(kě)以(yǐ)写出(chū)addr_tmp的(de)代(dài)碼。
|
1 2 3 |
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 |
|
1 |
assign addr = addr_tmp >>10 ; |
3.3 FIR濾波(bō)器設計(jì)
3.3.1 matlab生(shēng)成(chéng)FIR系(xì)數
打(dǎ)開(kāi)matlab,在(zài)其命令窗(chuāng)口(kǒu)輸入(rù)fdatool 按下(xià)回(huí)車調出(chū)波(bō)形設計(jì)界面(miàn)。
在(zài)波(bō)形設計(jì)界面(miàn)中(zhōng)
Response Type:案(àn)例要(yào)求濾波(bō)高(gāo)于(yú)500KHz的(de)信(xìn)号(hào),所(suǒ)以(yǐ)選擇lowpass低通(tòng)濾波(bō)器
Fstop: 截止頻率設为(wèi)600KHz
Fs:采樣(yàng)頻率: 12.5MHz(12500Khz)
图(tú) 526
其它(tā)選項默認點(diǎn)擊Design Filter
産生(shēng)系(xì)數後(hòu)點(diǎn)擊file 菜單里(lǐ)的(de)Export 将系(xì)數保存的(de)工作區(qū)
图(tú) 527
點(diǎn)擊export
图(tú) 528
點(diǎn)擊之後(hòu)打(dǎ)開(kāi)工作區(qū)里(lǐ)的(de)Num
图(tú) 529
而(ér)後(hòu)将下(xià)图(tú)第(dì)一(yī)列的(de)數據(jù)複制粘贴到(dào)txt文(wén)件(jiàn)中(zhōng)
图(tú) 530
注意(yì)複制後(hòu)需在(zài)两(liǎng)个(gè)系(xì)數間(jiān)插入(rù)逗(dòu)号(hào)(英文(wén)輸入(rù)狀态下(xià)的(de)的(de)逗(dòu)号(hào))
图(tú) 531
3.3.2 新建FPGA工程
图(tú) 532
1.打(dǎ)開(kāi)quartus,點(diǎn)擊File 在(zài)File菜單中(zhōng)選擇New Project Wizard.... 。
图(tú) 533
2.弹出(chū)Introduction界面(miàn)選擇Next。
图(tú) 534
3.設置工程目录(lù),工程名,頂层模块(kuài)名
工程目录(lù)設置为(wèi):D:mdy_bookir_prj
工程名:fir_prj
頂层模块(kuài)名:fir_prj
填写完畢後(hòu),點(diǎn)擊next之後(hòu)進(jìn)入(rù)下(xià)一(yī)界面(miàn)。
图(tú) 535
工程類(lèi)型界面(miàn),Project Type選擇Empty project,選擇空白工程。點(diǎn)Next進(jìn)入(rù)下(xià)一(yī)个(gè)界面(miàn)。
图(tú) 536
4.在(zài)文(wén)件(jiàn)添加界面(miàn),不(bù)選擇任何文(wén)件(jiàn)。點(diǎn)擊Next,進(jìn)入(rù)下(xià)一(yī)个(gè)界面(miàn)。
图(tú) 537
5.器件(jiàn)選擇界面(miàn)。在(zài)Device family这(zhè)一(yī)項之中(zhōng)選擇 Cyclone IV E;在(zài)下(xià)部(bù)的(de)Available device 選擇EP4CE6F23C8。完成(chéng)後(hòu)直(zhí)接點(diǎn)擊Finish。
3.3.3 FPGA生(shēng)成(chéng)FIR IP核
图(tú) 538
建立工程後(hòu),在(zài)quartus中(zhōng)IP catalog这(zhè)一(yī)界面(miàn)中(zhōng)選擇DSP下(xià)一(yī)目录(lù)中(zhōng)選擇Filter 再選擇 FIR II。
图(tú) 539
點(diǎn)擊後(hòu)進(jìn)入(rù)此(cǐ)界面(miàn)給(gěi)新生(shēng)成(chéng)的(de)fir濾波(bō)器ip核選擇如(rú)下(xià)路(lù)徑:D:mdy_bookir_prjmy_fir.v,IPvariation file name这(zhè)一(yī)項選擇verilog。點(diǎn)擊OK後(hòu),進(jìn)入(rù)FIR濾波(bō)器設置界面(miàn)。
图(tú) 540
在(zài)Fitter specification界面(miàn)按如(rú)下(xià)設置:
Filter Type:要(yào)選擇Single Rate,表(biǎo)示只(zhī)采用(yòng)一(yī)種(zhǒng)采樣(yàng)率。
Clock Rate:因(yīn)为(wèi)我(wǒ)们(men)工程使用(yòng)的(de)是(shì)50MHz时(shí)鐘(zhōng),所(suǒ)以(yǐ)此(cǐ)处要(yào)填写50MHz。
Input Sample Rate (PSPS):这(zhè)个(gè)是(shì)填采樣(yàng)率。和(hé)matlab相匹(pǐ)配,因(yīn)此(cǐ)要(yào)填12.5MHz。
其他(tā)參數默認。
然後(hòu)點(diǎn)擊coefficients選項卡(kǎ)。
图(tú) 541
單擊import from file ,在(zài)輸出(chū)的(de)界面(miàn)中(zhōng),找(zhǎo)出(chū)我(wǒ)们(men)用(yòng)MATLAB生(shēng)成(chéng)的(de)系(xì)數文(wén)件(jiàn):my_fir_coe.txt,點(diǎn)擊import導入(rù)。導入(rù)成(chéng)功後(hòu)可(kě)以(yǐ)看(kàn)到(dào)下(xià)图(tú)的(de) frequency response界面(miàn)的(de)波(bō)形發(fà)生(shēng)變(biàn)化(huà)。
在(zài)Coefficient Bit Width中(zhōng),填写16。表(biǎo)示每个(gè)系(xì)數用(yòng)16比特(tè)量(liàng)化(huà)。
图(tú) 543
如(rú)上(shàng)图(tú),在(zài)Input/Output Options選項卡(kǎ)中(zhōng),做如(rú)下(xià)設置。
Input Type:選擇Signed Binary,表(biǎo)示輸入(rù)的(de)數據(jù)是(shì)有(yǒu)符号(hào)數(補碼形式)。
Input Width:輸入(rù)8。表(biǎo)示輸入(rù)的(de)數據(jù)是(shì)8位位宽(kuān)。
Output Type:選擇Signed Binary,表(biǎo)示輸出(chū)的(de)數據(jù)是(shì)有(yǒu)符号(hào)數(補碼形式)。
MSB Rounding:選擇Truncation。表(biǎo)示輸出(chū)結果(guǒ)的(de)高(gāo)位要(yào)截斷。
MSB Bits to Remove:填写3。表(biǎo)示MSB要(yào)截取(qǔ)3个(gè)符号(hào)位。
LSB Rounding:選擇Truncation。表(biǎo)示輸出(chū)結果(guǒ)的(de)低位要(yào)截斷。
LSB Bits to Remove:填写19。表(biǎo)示LSB要(yào)截斷低19位。这(zhè)樣(yàng)最(zuì)終(zhōng)輸出(chū)的(de)結果(guǒ)就(jiù)是(shì)8位。
其他(tā)選項默認,點(diǎn)擊Finish,软(ruǎn)件(jiàn)就(jiù)会(huì)去(qù)生(shēng)成(chéng)FIR IP核。
图(tú) 544
出(chū)現(xiàn)上(shàng)面(miàn)的(de)提(tí)示,就(jiù)是(shì)生(shēng)成(chéng)成(chéng)功了(le)。
图(tú) 545
IP核生(shēng)成(chéng)後(hòu)弹出(chū)此(cǐ)对(duì)話(huà)框點(diǎn)擊yes 将此(cǐ)IP核添加進(jìn)工程。
3.3.4 例化(huà)FIR IP核
用(yòng)GVIM打(dǎ)開(kāi)D:mdy_bookir_prjmy_fir.v文(wén)件(jiàn),該文(wén)件(jiàn)就(jiù)是(shì)生(shēng)成(chéng)的(de)FIR IP核文(wén)件(jiàn)。
图(tú) 546
my_fir模块(kuài)的(de)各(gè)个(gè)信(xìn)号(hào)的(de)描述見(jiàn)下(xià)表(biǎo)。
信(xìn)号(hào)名
I/O
位宽(kuān)
作用(yòng)
clk
I
1
时(shí)鐘(zhōng)輸入(rù)信(xìn)号(hào)。在(zài)FIR設置时(shí),就(jiù)已經(jīng)填写了(le)50MHz,所(suǒ)以(yǐ)此(cǐ)时(shí)連(lián)接50MHz时(shí)鐘(zhōng)。
reset_n
I
1
複位信(xìn)号(hào),低電(diàn)平有(yǒu)效。
ast_sink_data
I
8
FIR濾波(bō)器輸入(rù)的(de)數據(jù)輸入(rù)。注意(yì),輸入(rù)的(de)是(shì)有(yǒu)符号(hào)數。
ast_sink_valid
I
1
FIR濾波(bō)器輸入(rù)的(de)數據(jù)有(yǒu)效指示信(xìn)号(hào)。
ast_sink_error
I
1
輸入(rù)數據(jù)錯誤指示信(xìn)号(hào)。实在(zài)想(xiǎng)不(bù)出(chū)有(yǒu)啥錯誤情(qíng)況,所(suǒ)以(yǐ)此(cǐ)处直(zhí)接填0。
ast_source_data
O
8
FIR濾波(bō)器的(de)輸出(chū)。注意(yì),是(shì)有(yǒu)符号(hào)數。
ast_source_valid
O
1
FIR濾波(bō)器輸出(chū)有(yǒu)效指示信(xìn)号(hào)。由(yóu)于(yú)輸入(rù)一(yī)直(zhí)有(yǒu)效,那(nà)麼(me)輸出(chū)也(yě)一(yī)直(zhí)有(yǒu)效,此(cǐ)信(xìn)号(hào)可(kě)以(yǐ)忽略不(bù)用(yòng),例化(huà)时(shí)不(bù)連(lián)接。
ast_source_error
O
2
FIR濾波(bō)器輸出(chū)錯誤指示信(xìn)号(hào)。由(yóu)于(yú)輸入(rù)沒(méi)錯誤,輸出(chū)也(yě)不(bù)会(huì)有(yǒu)錯誤,所(suǒ)以(yǐ)可(kě)以(yǐ)忽略該信(xìn)号(hào),例化(huà)时(shí)不(bù)連(lián)接。
特(tè)别注意(yì)的(de)是(shì),濾波(bō)器的(de)輸入(rù)數據(jù)和(hé)輸出(chū)數據(jù)都是(shì)有(yǒu)符号(hào)數(補碼的(de)形式,-128~127)。而(ér)我(wǒ)们(men)知道(dào),正(zhèng)弦信(xìn)sin_data是(shì)无符号(hào)數(0~255)。所(suǒ)以(yǐ)要(yào)将sin_data變(biàn)成(chéng)有(yǒu)符号(hào)數,再送給(gěi)FIR進(jìn)行濾波(bō)。假設轉(zhuǎn)換後(hòu)的(de)信(xìn)号(hào)为(wèi)fir_din,該信(xìn)号(hào)位宽(kuān)为(wèi)8位。
无符号(hào)數轉(zhuǎn)成(chéng)有(yǒu)符号(hào)數的(de)方(fāng)法很簡單:fir_din = sin_data - 128。读(dú)者(zhě)有(yǒu)興趣可(kě)以(yǐ)验(yàn)證一(yī)下(xià)。
生(shēng)成(chéng)FIR IP核後(hòu),我(wǒ)们(men)要(yào)对(duì)其進(jìn)行例化(huà),才行使用(yòng)上(shàng)这(zhè)个(gè)IP核,例化(huà)名起名u_my_fir,fir的(de)輸出(chū)數據(jù)信(xìn)号(hào)命名为(wèi)fir_dout。
|
1 2 3 4 5 6 7 8 |
assign fir_din = sin_data - 128;
my_fir u_my_fir( .clk (clk ) , .reset_n (rst_n ) , .ast_sink_data (fir_din ) , .ast_sink_valid (1 ) , .ast_sink_error (0 ) , .ast_source_data (fir_dout) , .ast_source_valid( ) , .ast_source_error( ) ); |
3.4 DA接口(kǒu)信(xìn)号(hào)設計(jì)
接下(xià)来(lái)是(shì)設計(jì)信(xìn)号(hào)dac_da。dac_da是(shì)直(zhí)接輸出(chū)正(zhèng)弦信(xìn)号(hào),但由(yóu)于(yú)DA的(de)輸出(chū)電(diàn)壓與(yǔ)dac_da是(shì)成(chéng)反(fǎn)比例線(xiàn)性(xìng)關(guān)系(xì),所(suǒ)以(yǐ)dac_da都是(shì)按(255-sin_data)得到(dào)。那(nà)麼(me)可(kě)以(yǐ)写出(chū)dac_da的(de)代(dài)碼。
|
1 2 3 4 5 6 7 8 |
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 |
接下(xià)来(lái)是(shì)設計(jì)信(xìn)号(hào)dac_sleep,AD是(shì)一(yī)直(zhí)工作的(de),所(suǒ)以(yǐ)要(yào)讓dac_sleep一(yī)直(zhí)为(wèi)0。
dac_clka为(wèi)了(le)滿足tS的(de)时(shí)間(jiān)要(yào)求,可(kě)以(yǐ)讓dac_clka = ~clk。
dac_wra可(kě)以(yǐ)與(yǔ)dac_clka相同(tóng)。
|
1 2 3 |
assign dac_sleep = 0 ; assign dac_wra = dac_clka ; assign dac_clka = ~clk ; |
接下(xià)来(lái)是(shì)設計(jì)信(xìn)号(hào)dac_db。dac_db是(shì)直(zhí)接輸出(chū)濾波(bō)後(hòu)的(de)信(xìn)号(hào)fir_dout。但要(yào)注意(yì)的(de)是(shì)fir_dout是(shì)有(yǒu)符号(hào)數(範圍是(shì)-128~127),所(suǒ)以(yǐ)要(yào)轉(zhuǎn)有(yǒu)无符号(hào)數(0~255)。假設轉(zhuǎn)換後(hòu)的(de)信(xìn)号(hào)为(wèi)fir_dout2,則fir_dout2 = fir_dout + 128。另(lìng)外(wài),由(yóu)于(yú)DA的(de)通(tòng)道(dào)2的(de)輸出(chū)電(diàn)壓與(yǔ)dac_db是(shì)成(chéng)反(fǎn)比例線(xiàn)性(xìng)關(guān)系(xì),所(suǒ)以(yǐ)dac_db都是(shì)按(255-fir_dout2)得到(dào)。那(nà)麼(me)可(kě)以(yǐ)写出(chū)dac_db的(de)代(dài)碼。
|
1 2 3 4 5 6 7 8 |
assign fir_dout2 = fir_dout + 128; always @(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin dac_db<= 0; end else begin dac_db<= 255 - fir_dout2; end end |
dac_clkb为(wèi)了(le)滿足tS的(de)时(shí)間(jiān)要(yào)求,可(kě)以(yǐ)讓dac_clkb = ~clk。
dac_wrb可(kě)以(yǐ)與(yǔ)dac_clkb相同(tóng)。
|
1 2 3 |
assign dac_wrb = dac_clkb ; assign dac_clkb = ~clk ; |
3.5 信(xìn)号(hào)定(dìng)義
至(zhì)此(cǐ),模块(kuài)主(zhǔ)體(tǐ)已經(jīng)完成(chéng)。接下(xià)来(lái)是(shì)将module補充完整。
addr是(shì)用(yòng)assign設計(jì)的(de),因(yīn)此(cǐ)類(lèi)型为(wèi)wire。其值最(zuì)大为(wèi)127,一(yī)共(gòng)有(yǒu)7根(gēn)線(xiàn),位宽(kuān)为(wèi)7,故而(ér)代(dài)碼如(rú)下(xià)
|
1 |
wire [6:0] addr ; |
addr_tmp是(shì)用(yòng)always設計(jì)的(de),因(yīn)此(cǐ)類(lèi)型为(wèi)reg。如(rú)前(qián)面(miàn)所(suǒ)述,該信(xìn)号(hào)的(de)位宽(kuān)是(shì)17,故而(ér)代(dài)碼如(rú)下(xià)
|
1 |
reg [16:0] addr_tmp ; |
sin_data是(shì)用(yòng)always設計(jì)的(de),因(yīn)此(cǐ)類(lèi)型为(wèi)reg。其最(zuì)大值为(wèi)255,要(yào)有(yǒu)8根(gēn)線(xiàn)表(biǎo)示,位宽(kuān)为(wèi)8,故而(ér)代(dài)碼如(rú)下(xià)
|
1 |
reg [7:0] sin_data ; |
fir_din是(shì)用(yòng)assign設計(jì)的(de),因(yīn)此(cǐ)類(lèi)型为(wèi)wire。其位宽(kuān)为(wèi)8,故而(ér)代(dài)碼如(rú)下(xià)
|
1 |
wire [7:0] fir_din ; |
fir_dout是(shì)用(yòng)例化(huà)模块(kuài)的(de)輸出(chū),非(fēi)always設計(jì)的(de),因(yīn)此(cǐ)類(lèi)型为(wèi)wire。其位宽(kuān)为(wèi)8,故而(ér)代(dài)碼如(rú)下(xià)
|
1 |
wire [7:0] fir_dout ; |
fir_dout2是(shì)用(yòng)assign設計(jì)的(de),非(fēi)always設計(jì)的(de),因(yīn)此(cǐ)類(lèi)型为(wèi)wire。其位宽(kuān)为(wèi)8,故而(ér)代(dài)碼如(rú)下(xià)
|
1 |
wire [7:0] fir_dout2 ; |
dac_da是(shì)用(yòng)always設計(jì)的(de),因(yīn)此(cǐ)類(lèi)型为(wèi)reg。其位宽(kuān)为(wèi)8;dac_sleep是(shì)用(yòng)assign設計(jì)的(de),因(yīn)此(cǐ)類(lèi)型为(wèi)wire,位宽(kuān)为(wèi)1;dac_wra是(shì)用(yòng)assign設計(jì)的(de),因(yīn)此(cǐ)類(lèi)型为(wèi)wire,位宽(kuān)为(wèi)1;dac_clka是(shì)用(yòng)assign設計(jì)的(de),因(yīn)此(cǐ)類(lèi)型为(wèi)wire,位宽(kuān)为(wèi)1;dac_mode是(shì)用(yòng)assign設計(jì)的(de),因(yīn)此(cǐ)類(lèi)型为(wèi)wire,位宽(kuān)为(wèi)1。故而(ér)代(dài)碼如(rú)下(xià)
|
1 |
reg [7:0] dac_da ; wire dac_sleep ; wire dac_wra ; wire dac_clka ; wire dac_mode ; |
dac_db是(shì)用(yòng)always設計(jì)的(de),因(yīn)此(cǐ)類(lèi)型为(wèi)reg。其位宽(kuān)为(wèi)8;dac_wrb是(shì)用(yòng)assign設計(jì)的(de),因(yīn)此(cǐ)類(lèi)型为(wèi)wire,位宽(kuān)为(wèi)1;dac_clkb是(shì)用(yòng)assign設計(jì)的(de),因(yīn)此(cǐ)類(lèi)型为(wèi)wire,位宽(kuān)为(wèi)1。故而(ér)代(dài)碼如(rú)下(xià)
|
1 |
reg [7:0] dac_db ; wire dac_wrb ; wire dac_clkb ; |
在(zài)代(dài)碼的(de)最(zuì)後(hòu)一(yī)行写下(xià)endmodule
|
1 |
endmodule |
至(zhì)此(cǐ),整个(gè)代(dài)碼的(de)設計(jì)工作已經(jīng)完成(chéng)。下(xià)一(yī)步是(shì)新建工程和(hé)上(shàng)板查看(kàn)現(xiàn)象(xiàng)。
4 綜合與(yǔ)上(shàng)板
4.1 添加文(wén)件(jiàn)到(dào)工程
图(tú) 547
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ú) 548
點(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_bookir_prj目录(lù)下(xià)的(de)fir_prj.v文(wén)件(jiàn)。然後(hòu)記(jì)得要(yào)點(diǎn)Add,才算正(zhèng)式加到(dào)工程。
图(tú) 549
點(diǎn)OK關(guān)閉本(běn)窗(chuāng)口(kǒu)。
4.2 綜合
图(tú) 550
在(zài)菜單欄中(zhōng),選中(zhōng)Processing,然後(hòu)選擇Start Compilation,開(kāi)始对(duì)整个(gè)工程進(jìn)行編譯和(hé)綜合。
图(tú) 551
出(chū)現(xiàn)上(shàng)面(miàn)的(de)界面(miàn),就(jiù)说(shuō)明(míng)編譯綜合成(chéng)功。
4.3 配置管(guǎn)脚
图(tú) 552
在(zài)菜單欄中(zhōng),選中(zhōng)Assignments,然後(hòu)選擇Pin Planner,就(jiù)会(huì)弹出(chū)配置管(guǎn)脚的(de)窗(chuāng)口(kǒu)。
图(tú) 553
在(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)脚 |
原理图(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] |
|
|
CLK2 |
DA_CLKB |
R1 |
dac_clkb |
|
|
WRT2 |
DA_WRB |
P2 |
dac_wrb |
|
|
DB7P2 |
DAC_DB7 |
P1 |
dac_db[7] |
|
|
DB6P2 |
DAC_DB6 |
N2 |
dac_db[6] |
|
|
DB5P2 |
DAC_DB5 |
N1 |
dac_db[5] |
|
|
DB4P2 |
DAC_DB4 |
M2 |
dac_db[4] |
|
|
DB3P2 |
DAC_DB3 |
M1 |
dac_db[3] |
|
|
DB2P2 |
DAC_DB2 |
J1 |
dac_db[2] |
|
|
DB1P2 |
DAC_DB1 |
J2 |
dac_db[1] |
|
|
DB0P2 |
DAC_DB0 |
H1 |
dac_db[0] |
|
|
X1 |
|
SYS_CLK |
G1 |
clk |
|
K1 |
|
SYS_RST |
AB12 |
rst_n |
按上(shàng)面(miàn)配置好(hǎo)每个(gè)信(xìn)号(hào)的(de)管(guǎn)脚,其最(zuì)終(zhōng)效果(guǒ)如(rú)下(xià)图(tú)。
图(tú) 554
關(guān)閉Pin Planner,软(ruǎn)件(jiàn)自(zì)動(dòng)会(huì)保存管(guǎn)脚配置信(xìn)息。
4.4 再次(cì)綜合
图(tú) 555
在(zài)菜單欄中(zhōng),選中(zhōng)Processing,然後(hòu)選擇Start Compilation,開(kāi)始对(duì)整个(gè)工程進(jìn)行編譯和(hé)綜合。
图(tú) 556
出(chū)現(xiàn)上(shàng)面(miàn)的(de)界面(miàn),就(jiù)说(shuō)明(míng)編譯綜合成(chéng)功。
4.5 連(lián)接開(kāi)發(fà)板
图(tú) 557
連(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 上(shàng)板
图(tú) 558
在(zài)quartus的(de)Task窗(chuāng)口(kǒu)中(zhōng),右(yòu)鍵Program Device 選擇Open 進(jìn)入(rù)燒录(lù)界面(miàn)。
图(tú) 559
在(zài)上(shàng)面(miàn)的(de)界面(miàn)中(zhōng),默認会(huì)選中(zhōng)文(wén)件(jiàn)output/fir_prj.sof,如(rú)果(guǒ)沒(méi)有(yǒu)生(shēng)成(chéng)請看(kàn)XXXX。
在(zài)上(shàng)面(miàn)的(de)界面(miàn)中(zhōng),Hardware Setup的(de)旁邊(biān)会(huì)顯示:USB-Blaster。如(rú)果(guǒ)不(bù)是(shì),請看(kàn)XXXX。
图(tú) 560
點(diǎn)擊statr,在(zài)progress这(zhè)一(yī)条(tiáo)顯示100%即表(biǎo)示成(chéng)功,此(cǐ)时(shí)可(kě)以(yǐ)看(kàn)FPGA輸出(chū)效果(guǒ)了(le)。
更(gèng)多(duō)FPGA技術(shù)資訊:微信(xìn)公衆号(hào) fpga資訊
返回(huí)目录(lù) >> 明(míng)德揚FPGA实验(yàn)手(shǒu)册









