简易DDS信号发生器记录
簡易DDS信號發生器
學習資料:野火 升騰Pro《FPGA Verilog開發實戰指南——基于Xilinx Artix7》2021.11.16
1. 理論知識
DDS 是直接數字式頻率合成器(Direct Digital Synthesizer),也就是信號發生器,具有低成本、低功耗、高分辨率和快速轉換時間等優點。
DDS 的基本結構主要由相位累加器、相位調制器、波形數據表 ROM、D/A 轉換器等四大結構組成,其中較多設計還會在數模轉換器之后增加一個低通濾波器。
基本結構示意圖:
頻率字輸入F_WORD一般為整數,控制輸出信號的頻率,數值越大頻率越高,后面用K表示,其位寬為N。相位字輸入P_WORD(后文用P表示),為整數,數值大小控制輸出信號的相位偏移,主要用于相位的信號調制。系統時鐘頻率fclk,輸出信號頻率fout,兩者的關系:**fout= K * fclk / (2 ^ N ).**對于P的計算,P= 相位偏移量 / (2π / 2 ^ M),M為ROM地址的位寬。
2. 工程設計
實驗目標:使用 FPGA 開發板和外部掛載的高速 AD/DA 板卡,設計并實現一個簡易 DDS 信號發生器,可通過按鍵控制實現正弦波、方波、三角波和鋸齒波的波形輸出,頻率相位可調。
波形文件的產生利用Matlab生成.coe格式文件,代碼如下圖:
-
整體框架
D/A模塊由外部掛載AD/DA板卡處理,其余相位累加器、相位調制器、波形數據表 ROM 由FPGA 負責。
整體模塊框圖,四個按鍵進行波形選擇輸出,
-
按鍵控制模塊
四個輸入,需要按鍵消抖,直接套用以前的模塊即可。 -
dds模塊
內部實例化了波形數據表ROM,用于存儲波形信號。
其中 fre_add 表示相位累加器輸出值,位寬為 32 位,系統上電后,fre_add 信號一直執行自加操作,每個時鐘周期自加參數 FREQ_CTRL,參數FREQ_CTRL 就是在之前理論知識部分提到的頻率字輸入 K。
寄存器變量 rom_addr_reg 表示相位調制器輸出值,將相位累加器輸出值的高 12 位與相位偏移量 PHASE_CTRL 相加,參數 PHASE_CTRL 就是我們之前提到過的相位字輸入P。
ROM 讀地址 rom_addr 是輸入波形數據表的 ROM 讀地址,是在 rom_addr_reg 的基礎上計算得到。我們之前將 4 種信號波形數據按照正弦波、方波、三角波、鋸齒波的順序寫入 ROM。若需要讀取正弦波波形數據,rom_addr_reg 可直接賦值給 rom_addr;但是要進行方波波形數據的讀取,rom_addr_reg 需要再加上正弦波存儲單元個數才能賦值給
rom_addr。 -
頂層模塊
直接實例化按鍵和dds模塊即可,輸出的dac_clk是DAC模塊的時鐘,該信號由系統時鐘 sys_clk 取反得到。取反的原因是波形數據表 ROM 的讀時鐘為系統時鐘 sys_clk,在系統時鐘上升沿時對 ROM 進行數據讀取,而 DA 模塊也使用時鐘上升沿進行數據處理,將系統時鐘 sys_clk 取反得到dac_clk,那么dac_clk 的上升沿剛好采集到波形數dac_data 的穩定數據。
代碼詳見資料
總結
以上是生活随笔為你收集整理的简易DDS信号发生器记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 虚拟化六大安全问题
- 下一篇: 市场调研报告-全球与中国仅相位空间光调制