前幾天,臨危受命,幫幾個初學者的學生寫一個簡易AM信號的FPGA實現,以幫助他們搭建一個相對完整的系統,測試他們的低速ADC,高速DAC,AGC控制等等模塊。本文的FPGA代碼已經經過上板測試,由于時間緊急沒有保存圖片,所以文章只有仿真圖片。
首先,為什么是AM信號的調制過程,是因為在短時間情況下,AM信號的實現相對簡單,而且上述提到的幾個模塊都可以得到使用和驗證。因為FPGA的價格因素,做課設/比賽使用最多的還是Altera的Cyclone系列板。所以,本文使用Quartus II 13.1 作為Verilog代碼綜合實現工具。AM信號調制過程就不做過多介紹了,簡單來說,就是基帶信號和一個直流信號相加,然后與載波相乘。那么,在實現過程中,做了些許改變,先讓基帶信號與載波相乘,然后將截位后的信號與載波相加。如果想要實現更精細的AM信號調制(變更調制深度等參數),可以修改這個地方的先后順序。AM公式表達如下:
為直流信號,是基帶信號,是載波信號。
實現過程如上圖,頂層文件使用BSF文件,更為直觀。由上圖可以看出,基帶信號和載波信號是由NCO(DDS)產生,在上板驗證中,低頻部分的NCO被刪去,由低速ADC采樣外部信號替換這部分的低頻信號。所以在剛開始搭建模塊時,低速NCO輸出信號位寬就兼容了低速ADC的16位位寬。根據資料1可得,Altera提供的NCO是根據32位輸入信號phi_inc_i而輸出對應的頻率的正弦波。公式為:
是NCO預設輸出正弦波頻率,是輸入時鐘頻率,是NCO的相位精度。這里的設置是32位。NCO(DDS)的本質是ROM表,ROM表存儲著正弦波的波形數據,相位精度代表波形數據的多少。根據phi_inc_i累加地址,ROM根據地址輸出波形數據,最后數據計算如下。
基帶載波
頻率(MHz)0.110
phi_inc_i8589935858993459
然后讓基帶和載波信號相乘,使用LPM_MULT IP核,設置好位寬,數據類型設為“signed”,設置流水線(增加clock),延遲設為1,便于后續通過時序檢查。相乘輸出信號位寬為32位,保險起見我們只截取最高位的符號位,再截取低位的數據。但是經過上板測試和仿真,符號位實際上有很多位。當然,這部分可以將符號位進行優化,或者設置一個模塊,根據輸入的參數輸出不一樣的截位信號,相當于在調整調制深度。同時,將載波信號延遲一個周期,與乘法器延遲一周期的信號做好時序對齊,然后經過LPM_ADD_SUB IP核的加法運算;同樣,LPM_ADD_SUB IP核設置好輸入信號位寬,數據類型設為“signed”,設置流水線,延遲設為1。最后輸出的信號就可以經過高速DAC輸出。整個調制過程就結束了。仿真結果:
最后思考,可以在加法器和乘法器增加一個enable端口,IP核可以增加這個輸入信號;如果先加再乘,由于直流信號一般不會變動,使能信號可以等待每次低速ADC或低速NCO數值更新再拉高一次;乘法器也可以使用使能信號控制,這樣的話性能可能沒有變化,功耗或許可降低些。此外,使用VCS仿真NCO的nco.vo文件時,一直遇到一個問題,報錯如下:
大概是說NCO生成的4個hex文件有問題,但是使用modelsim就沒這個問題了。
原文標題:簡易AM信號調制的FPGA實現過程簡單講解
文章出處:【微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。
責任編輯:haq
-
FPGA
+關注
關注
1630文章
21785瀏覽量
605046 -
加速器
+關注
關注
2文章
805瀏覽量
37998
原文標題:簡易AM信號調制的FPGA實現過程簡單講解
文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論