FPGA數字信號處理(1)-AM調制的實現
一:前言
- 本內容分享為本人自學經歷。受限於作者水平可能有不准確的地方。歡迎諸位批評指正。
- 分享的文章需要一些基本的FPGA開發基礎
二:概述
這部分簡單,但卻是最最重要的,把這部分看懂,所有的程序也就明白了。
1. AM信號:
(A+ma*cos(w0t))*cos(wct)
看到這個式子,首先肯定要產生兩個頻率不同的余弦波cos(w0t),cos(wct)。立馬想到調用系統自帶的DDS IP核來實現,這是最簡單的方法。當然你也可以利用ROM配合加法器自己寫一個。這里就不講了。
產生兩個余弦波后,再來兩個乘法器(雖然可以直接使用 * 這個符號。但是關於這種方式實現和IP核實現有什么區別。各位讀者自行百度)
2.AM信號生成中的注意點
首先看一下調制深度的問題。關於本部分的敘述。大家可以找找教材。調制深度通常為已調波的最大振幅與最小振幅之差對載波最大振幅與最小振幅之和的比。可以算出調制深度就是ma/A。本設計中A為1,調制深度就是ma,其實只要A的值和后面的余弦波的最大值是相同的,調制深度就會為ma,為0~1之間。但是問題在於在FPGA上實現就有一些問題了。關於浮點和定點我在這里就不獻丑了大家自行百度。
在本設計中DDS生成的信號是有符號的8bit數據。那么這里先假設A為127。再來再算一下調制深度。這時包絡最大值為127+ma127,最小值為127-ma127。最后調制深度還會是ma,這個ma的范圍還是01。ma是從01之間變的話,還是有不能直接表示小數這個問題。為了解決這個問題我們這樣做:
讓A=1270,也就是包絡最大值為1270+ma127,最小1270+ma127。算出調制深度最后應該為ma/10的。這時便可以設定ma為1~10來改變調制深度了。
當然有很多方式可以實現。這里只列舉了簡單的一種。
三:設計輸入
為了加速設計 我們推薦一種更方便的設計輸入方式bd(block_design)。這種設計方式大概就是加價IP核 連連線。
創建一個DB
首先添加一個DDS核.然后開始配置它
這里有一個SDR(動態范圍)
一般意義上1bit ≈ 6.02bit。具體計算過程大家可以百度。
輸出一個COS 不輸出相位
一個數據有效位 八個數據位。輸出頻率設置為1Mhz
然后添加一個乘法器IP。我們要將這個信號乘以調制深度。
注意符號位,DDS IP核輸出是有符號的。調制深度為無符號數,選擇0延時輸出即可
然后我們添加一個加法器IP用以添加增加直流分量。加法器IP為乘法器輸出加一個定值。按圖設置
這個首先需要指定B的類型和位寬然后輸入二進制的數據
接下來將以上的IP鏈接起來。並且添加對外的端口(快捷鍵Ctrl+T)。
然后生成HDLwrapper(這個單詞意思是包裝,但是我沒有能力恰當的翻譯索性就直接這樣稱呼)
接下來我們寫個testbench代碼測試下 。看起來我們只要給一個時鍾信號,給一個調制深度就OK。這里就不貼代碼了。非常簡單的
這樣我們就完成了調制前的波形產生。
可以看到波形已經產生。且均為有符號數。
接下來如法炮制。添加一個載波DDS 頻率設置為10M。添加一個乘法器IP。最終的BD圖如所示。
以看到輸出有20bit
我們進行一個簡單的計算(1270*10+1270)*127 =325120
可以看到第20bit無用
所以我們選取[18:3]這16bit。作為輸出。
剛剛哪個testbench 改改還能用。最終效果如下。