【至簡設計案例系列】波形相位頻率可調DDS信號發生器


1.1 總體設計


1.1.1 概述


學習了明德揚至簡設計法和明德揚設計規範,本人設計了一個基於FPGA的可調頻調相而且可以輸出不同波形的DDS信號發生器。該信號發生器實現了通過按鍵控制輸出不同類型的波形,並可以通過按鍵改變波形頻率和初始相位。將此設計與明德揚的波形採集設計相結合,可以實現示波器功能,並且還可拓展實現波形頻率計算、峰峰值計算、頻譜分析等功能,有很大的設計空間。同時本設計以及其擴展功能在現實生活中也具有比較廣泛的應用。在本案例的設計過程中,包含了按鍵定義和消抖、計數器、ROMIP的應用等技術。經過逐步改進、調試等一系列操作之後,完成了此設計,下面將完整的設計記錄與大家分享。


1.1.2 設計目標


此設計可以通過按鍵進行波形類型的切換,並且波形的頻率還可以進行改變,具體需求如下:

1)按鍵1按下時可以改變波形的類型,實現波形的切換,順序為正弦波、鋸齒波、三角波;

2)按鍵2按下時可以改變波形的頻率,每按下一次,頻率增大2倍,達到一定值後跳回初始頻率值,以此循環;

3)按鍵3按下時可以改變波形的初始相位,每按下一次,初始相位加30,達到一定值後跳回初始相位值,以此循環。


1.1.3 系統結構框圖


系統結構框圖如下所示:

【至簡設計案例系列】波形相位頻率可調DDS信號發生器


1.1.4 模塊功能

  • 按鍵模塊實現功能

將外來異步信號打兩拍處理,將異步信號同步化;

實現20ms按鍵消抖功能,並輸出有效按鍵信號。

  • DDS模塊實現功能

通過有效按鍵信號實現切換波形類型、改變波形頻率、調整波形初始相位;

從ROM中讀取波形數據並輸出按鍵控制下的波形數據。


1.1.5 信號定義

  • 頂層模塊mdy_DDS.v
【至簡設計案例系列】波形相位頻率可調DDS信號發生器


  • 按鍵模塊key_delay.v

  • 【至簡設計案例系列】波形相位頻率可調DDS信號發生器


    • DDS模塊DDS.v


    【至簡設計案例系列】波形相位頻率可調DDS信號發生器


    1.1.6 工作原理


    在系統整體結構中,通過按鍵控制輸出波形類型,並通過按鍵改變波形頻率控制字和初始相位控制字,得到ROM的讀地址。ROM為只讀存儲器,只要給它一個地址,就能讀出該地址中相應的數據,從已經初始化好的ROM讀取相應的波形數據。


    DDS的原理如下圖,累加器每次累加一個頻率控制字,調節頻率控制字的數值,可以改變累加器的累加速度,進而可以調節從ROM查找表中讀取波形數據的速度。即頻率控制字越大,頻率越高。相位控制字可以用來調節初始相位,即ROM地址自加的初始值。

    【至簡設計案例系列】波形相位頻率可調DDS信號發生器


    1.2 按鍵電路


    1.2.1 按鍵電路

    獨立式按鍵工作原理如上圖所示,4條輸入線接到FPGA的IO口上,當按鍵K1按下時,VCC通過電阻R1再通過按鍵K1最終進入GND形成一條通路,這條線路的全部電壓都加在R1上,則引腳P14是低電平。當鬆開按鍵後,線路斷開,就不會有電流通過,P14和VCC就應該是等電位,為高電平。我們可以通過P14這個IO口的高低電平狀態來判斷是否有按鍵按下。其它按鍵原理與K1一致。

    從圖中可以看出,如果我們按下按鍵,那麼按鍵就會接通並連接到低電平GND,如果我們沒有按下,那麼按鍵就會斷開並接到VCC,因此按鍵為低電平有效。通常的按鍵所用開關為機械彈性開關,當機械觸點斷開或者閉合時,由於機械觸點的彈性作用,一個按鍵開關在閉合時不會馬上穩定地接通,在斷開時也不會一下子斷開。因而機械式按鍵在閉合及斷開的瞬間均伴隨有一連串的抖動,如果不進行處理,會使系統識別到抖動信號而進行不必要的反應,導致模塊功能不正常,為了避免這種現象的產生,需要進行按鍵消抖的操作。


    1.2.2 按鍵消抖


    按鍵消抖主要分為硬件消抖和軟件消抖。兩個“與非”門構成一個RS觸發器為常用的硬件消抖。軟件方法消抖,即檢測出鍵閉合後執行一個延時程序,抖動時間的長短由按鍵的機械特性決定,一般為5ms~20ms,讓前沿抖動消失後再一次檢測鍵的狀態,如果仍保持閉合狀態電平,則確認按下按鍵操作有效。當檢測到按鍵釋放後,也要給5ms~20ms的延時,待後沿抖動消失後才能轉入該鍵的處理程序。經過按鍵消抖的行人優先按鍵,判斷按鍵有效後,按鍵信號傳遞給控制系統,控制系統再進入相應的處理程序。如還不明白之處,見實驗的PDF。

    【至簡設計案例系列】波形相位頻率可調DDS信號發生器

    圖5.1.2按鍵消抖示意圖


    1.2.3 按鍵消抖代碼實現


    使用明德揚的計數器模板,可以很快速很熟練地寫出按鍵消抖模塊。

    每20ms掃描一次按鍵輸入key_in,可以達到消抖的目的,再用寄存器緩存一下,按鍵為低電平有效;所以檢測當檢測到按鍵有下降沿變化時,代表該按鍵被按下,按鍵有效,輸出1。


    代碼如下:

    【至簡設計案例系列】波形相位頻率可調DDS信號發生器

    1.3 DDS模塊設計

    1.3.1 控制波形類型

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

    完整代碼如下:

    【至簡設計案例系列】波形相位頻率可調DDS信號發生器

    1.3.2 改變波形頻率

    話不多說,反手又是一個明德揚計數模板。按鍵2每按下一次,即key_done[1]有效時,i乘以2,加到64時歸0,否則保持不變。這裡通過i可以改變頻率的原理是ROM中512個數據為一個週期,i等於1的話,採集一個週期需要512次,clk/512即為頻率,i為2時,只需要採集256次即完成一個週期,頻率為clk/256。

    當然也可以直接通過分頻改變clk,從而達到改變頻率的效果。

    完整代碼如下:


    【至簡設計案例系列】波形相位頻率可調DDS信號發生器

    1.3.3 改變波形相位

    依舊是百用不厭的計數器模板,按鍵3每按下一次,即key_done[2]有效時,初始相位加30,加到360時歸0,否則保持不變。達到改變相位的目的。

    因此,通過至簡設計法、計數器模板,可以輕鬆達到設計目標。

    完整代碼如下:


    【至簡設計案例系列】波形相位頻率可調DDS信號發生器

    1.3.4 mif文件的生成

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


    【至簡設計案例系列】波形相位頻率可調DDS信號發生器

    【至簡設計案例系列】波形相位頻率可調DDS信號發生器


    調用ROMIP核,並將mif導入ROM,其他波形同理。


    【至簡設計案例系列】波形相位頻率可調DDS信號發生器

    1.4 在線邏輯分析儀查看波形數據

    • 不同頻率正弦波:


    【至簡設計案例系列】波形相位頻率可調DDS信號發生器


    【至簡設計案例系列】波形相位頻率可調DDS信號發生器


    • 三角波
    【至簡設計案例系列】波形相位頻率可調DDS信號發生器


    • 鋸齒波
    【至簡設計案例系列】波形相位頻率可調DDS信號發生器


    觀看上面的現象,可以發現,各項功能正常,可以通過按鍵改變波形類型、頻率、相位,成功完成設計目標。


    在這個設計案例中,至簡設計法和明德揚計數器模板發揮了至關重要的作用,使我能夠快速準確完成設計。本設計拓展加上ADDA採集和VGA顯示,可以實現基於FPGA的示波器設計,之前明德揚論壇已經發布了波形採集並VGA顯示的案例,希望有興趣的同學可以運用至簡設計法和明德揚模板嘗試一下拓展設計哦。


    感興趣的朋友也可以訪問明德揚論壇(http://www.fpgabbs.cn/)進行FPGA相關工程設計學習,也歡迎大家在評論與我進行討論!


    分享到:


    相關文章: