【文章】波形相位頻率可調(diào)DDS設(shè)計
本文為明德?lián)P原創(chuàng)及錄用文章,轉(zhuǎn)載請注明出處!
1.1 總體設(shè)計
? ?? ?1.1.1 概述
? 學(xué)習(xí)了明德?lián)P至簡設(shè)計法和明德?lián)P設(shè)計規(guī)范,本人設(shè)計了一個基于FPGA的可調(diào)頻調(diào)相而且可以輸出不同波形的DDS信號發(fā)生器。該信號發(fā)生器實現(xiàn)了通過按鍵控制輸出不同類型的波形,并可以通過按鍵改變波形頻率和初始相位。將此設(shè)計與明德?lián)P的波形采集設(shè)計相結(jié)合,可以實現(xiàn)示波器功能,并且還可拓展實現(xiàn)波形頻率計算、峰峰值計算、頻譜分析等功能,有很大的設(shè)計空間。同時本設(shè)計以及其擴展功能在現(xiàn)實生活中也具有比較廣泛的應(yīng)用。在本案例的設(shè)計過程中,包含了按鍵定義和消抖、計數(shù)器、ROMIP的應(yīng)用等技術(shù)。經(jīng)過逐步改進、調(diào)試等一系列操作之后,完成了此設(shè)計,下面將完整的設(shè)計記錄與大家分享。
? ?? ?1.1.2 設(shè)計目標(biāo)
此設(shè)計可以通過按鍵進行波形類型的切換,并且波形的頻率還可以進行改變,具體需求如下:
1)按鍵1按下時可以改變波形的類型,實現(xiàn)波形的切換,順序為正弦波、鋸齒波、三角波;
2)按鍵2按下時可以改變波形的頻率,每按下一次,頻率增大2倍,達到一定值后跳回初始頻率值,以此循環(huán);
3)按鍵3按下時可以改變波形的初始相位,每按下一次,初始相位加30,達到一定值后跳回初始相位值,以此循環(huán)。
? ?? ?1.1.3 系統(tǒng)結(jié)構(gòu)框圖
? ?系統(tǒng)結(jié)構(gòu)框圖如下所示:

? ?? ?1.1.4 模塊功能
按鍵模塊實現(xiàn)功能
將外來異步信號打兩拍處理,將異步信號同步化;
實現(xiàn)20ms按鍵消抖功能,并輸出有效按鍵信號。
DDS模塊實現(xiàn)功能
通過有效按鍵信號實現(xiàn)切換波形類型、改變波形頻率、調(diào)整波形初始相位;
從ROM中讀取波形數(shù)據(jù)并輸出按鍵控制下的波形數(shù)據(jù)。
? ??1.1.5 信號定義
頂層模塊mdy_DDS.v

按鍵模塊key_delay.v

DDS模塊DDS.v

? ?? ?1.1.6 工作原理
在系統(tǒng)整體結(jié)構(gòu)中,通過按鍵控制輸出波形類型,并通過按鍵改變波形頻率控制字和初始相位控制字,得到ROM的讀地址。ROM為只讀存儲器,只要給它一個地址,就能讀出該地址中相應(yīng)的數(shù)據(jù),從已經(jīng)初始化好的ROM讀取相應(yīng)的波形數(shù)據(jù)。
DDS的原理如下圖,累加器每次累加一個頻率控制字,調(diào)節(jié)頻率控制字的數(shù)值,可以改變累加器的累加速度,進而可以調(diào)節(jié)從ROM查找表中讀取波形數(shù)據(jù)的速度。即頻率控制字越大,頻率越高。相位控制字可以用來調(diào)節(jié)初始相位,即ROM地址自加的初始值。

? ?1.2 按鍵電路
? ?? ? 1.2.1 按鍵電路

獨立式按鍵工作原理如上圖所示,4條輸入線接到FPGA的IO口上,當(dāng)按鍵K1按下時,VCC通過電阻R1再通過按鍵K1最終進入GND形成一條通路,這條線路的全部電壓都加在R1上,則引腳P14是低電平。當(dāng)松開按鍵后,線路斷開,就不會有電流通過,P14和VCC就應(yīng)該是等電位,為高電平。我們可以通過P14這個IO口的高低電平狀態(tài)來判斷是否有按鍵按下。其它按鍵原理與K1一致。
? ???從圖中可以看出,如果我們按下按鍵,那么按鍵就會接通并連接到低電平GND,如果我們沒有按下,那么按鍵就會斷開并接到VCC,因此按鍵為低電平有效。通常的按鍵所用開關(guān)為機械彈性開關(guān),當(dāng)機械觸點斷開或者閉合時,由于機械觸點的彈性作用,一個按鍵開關(guān)在閉合時不會馬上穩(wěn)定地接通,在斷開時也不會一下子斷開。因而機械式按鍵在閉合及斷開的瞬間均伴隨有一連串的抖動,如果不進行處理,會使系統(tǒng)識別到抖動信號而進行不必要的反應(yīng),導(dǎo)致模塊功能不正常,為了避免這種現(xiàn)象的產(chǎn)生,需要進行按鍵消抖的操作。
? ???1.2.2 按鍵消抖
? ?? ?
按鍵消抖主要分為硬件消抖和軟件消抖。兩個“與非”門構(gòu)成一個RS觸發(fā)器為常用的硬件消抖。軟件方法消抖,即檢測出鍵閉合后執(zhí)行一個延時程序,抖動時間的長短由按鍵的機械特性決定,一般為5ms~20ms,讓前沿抖動消失后再一次檢測鍵的狀態(tài),如果仍保持閉合狀態(tài)電平,則確認按下按鍵操作有效。當(dāng)檢測到按鍵釋放后,也要給5ms~20ms的延時,待后沿抖動消失后才能轉(zhuǎn)入該鍵的處理程序。經(jīng)過按鍵消抖的行人優(yōu)先按鍵,判斷按鍵有效后,按鍵信號傳遞給控制系統(tǒng),控制系統(tǒng)再進入相應(yīng)的處理程序。如還不明白之處,見實驗的PDF。

圖5.1.2按鍵消抖示意圖
? ?? ?1.2.3 按鍵消抖代碼實現(xiàn)
? ? ??使用明德?lián)P的計數(shù)器模板,可以很快速很熟練地寫出按鍵消抖模塊。
每20ms掃描一次按鍵輸入key_in,可以達到消抖的目的,再用寄存器緩存一下,按鍵為低電平有效;所以檢測當(dāng)檢測到按鍵有下降沿變化時,代表該按鍵被按下,按鍵有效,輸出1。
代碼如下:


? ?? ? 1.3.1 控制波形類型
? ?? ?消抖過后的按鍵輸入到本模塊,同樣使用明德?lián)P至簡設(shè)計法和計數(shù)器模板,可以秒速寫出控制波形類型的代碼。按鍵1每按下一次,即key_done[0]有效時,wave_cnt加1,加到3時歸0,否則保持不變。wave_cnt為0時輸出正弦波,1時輸出三角波,2時輸出鋸齒波,默認時輸出正弦波;至簡設(shè)計法和計數(shù)器模板有多好用,越用越絕精妙。
完整代碼如下:


? ???
? ???1.3.2 改變波形頻率
? ?? ?
? ?? ?話不多說,反手又是一個明德?lián)P計數(shù)模板。按鍵2每按下一次,即key_done[1]有效時,i乘以2,加到64時歸0,否則保持不變。這里通過i可以改變頻率的原理是ROM中512個數(shù)據(jù)為一個周期,i等于1的話,采集一個周期需要512次,clk/512即為頻率,i為2時,只需要采集256次即完成一個周期,頻率為clk/256。
當(dāng)然也可以直接通過分頻改變clk,從而達到改變頻率的效果。
完整代碼如下:

? ???1.3.3 改變波形相位
依舊是百用不厭的計數(shù)器模板,按鍵3每按下一次,即key_done[2]有效時,初始相位加30,加到360時歸0,否則保持不變。達到改變相位的目的。
因此,通過至簡設(shè)計法、計數(shù)器模板,可以輕松達到設(shè)計目標(biāo)。
完整代碼如下:

? ???1.3.4 mif文件的生成
? ?程序中我們會用到一個ROM用于存儲512個8位的波形數(shù)據(jù),首先我們需要準(zhǔn)備ROM的初始化文件(mif文件)。以下為生成正弦波數(shù)據(jù)mif文件的方法:首先打開Guagle_wave工具,選擇菜單"查看"->”全局參數(shù)設(shè)置”,設(shè)置參數(shù)如下:



? ?? ? 調(diào)用ROMIP核,并將mif導(dǎo)入ROM,其他波形同理。

? ???1.4 在線邏輯分析儀查看波形數(shù)據(jù)
不同頻率正弦波:


三角波

鋸齒波

? ?? ?觀看上面的現(xiàn)象,可以發(fā)現(xiàn),各項功能正常,可以通過按鍵改變波形類型、頻率、相位,成功完成設(shè)計目標(biāo)。
?在這個設(shè)計案例中,至簡設(shè)計法和明德?lián)P計數(shù)器模板發(fā)揮了至關(guān)重要的作用,使我能夠快速準(zhǔn)確完成設(shè)計。本設(shè)計拓展加上ADDA采集和VGA顯示,可以實現(xiàn)基于FPGA的示波器設(shè)計,之前明德?lián)P論壇已經(jīng)發(fā)布了波形采集并VGA顯示的案例,希望有興趣的同學(xué)可以運用至簡設(shè)計法和明德?lián)P模板嘗試一下拓展設(shè)計哦。
感興趣的朋友也可以訪問明德?lián)P論壇(http://www.fpgabbs.cn/)進行FPGA相關(guān)工程設(shè)計學(xué)習(xí),也歡迎大家在評論與我進行討論!