1.演算法模擬效果
本程式系統是《m基於FPGA的MSK調製解調系統verilog開發,並帶FPGA誤碼檢測模組和matlab模擬程式》的的升級。
升級前原文連結
增加了完整的AWGN通道模型的FPGA實現,可以在testbench裡面設定SNR,分析不同SNR對應的FPGA誤位元速率情況。
vivado2019.2模擬結果如下(完整程式碼執行後無水印):
設定SNR=0:
設定SNR=5:
設定SNR=8:
設定SNR=15:
RTL圖:
然後MATLAB的MSK測試模擬如下:
2.演算法涉及理論知識概要
軟體無線電是現代通訊技術的重要研究領域和發展方向,目前發展迅速.快速發展的軟體無線電技術與落後的硬體計算資源之間的矛盾越來越突出.為了緩解這個矛盾,一方面可以加快積體電路的研發進度,提升硬體的計算效能;另一方面可以對訊號處理的演算法進行深入的改進研究,降低演算法的運算量,在現有的硬體水平下提出符合實際的解決方案.在訊號處理的各種演算法中,調製解調演算法的地位十分重要.尤其是其中的解調演算法,其複雜度已被作為衡量整個訊號處理系統工作效能的有效指標. 本文的研究物件是恆定包絡連續相位調製技術中的最小頻移鍵控(MSK).這種調製方式具有恆定包絡,相位連續,功率譜密度較集中,頻帶利用率高等特點.MSK訊號的諸多優點使得它在訊號理論研究和應用中具有重要意義.整個模型的基本框圖為:
MSK訊號是一種相位連續、包絡恆定並且佔用頻寬最小的二進位制正交FSK訊號。它的第k個碼元可以表示為:
MSK訊號具有特點如下:①MSK訊號是正交訊號;②其波形在碼元間是連續的;③其包絡是恆定不變的;④其附加相位在一個碼元持續時間內線性地變化2/p±;⑤調製產生的頻率偏移等於T4/1±Hz;⑥在一個碼元持續時間內含有的載波週期數等於1/4的整數倍。這裡,我們考慮到硬體平臺的高度可移植性,我們採用了無核化設計,就是全部使用verilog進行設計,下面首先說明一下系統的各個管腳。
系統復位,高電平復位清0,你接板子上任意一個開關即可。
資料傳送端資料,有符號,你接起高位即可,示波器看
MSK符號,多維有符號數,需要使用chipscope線上看
MSK符號,多維有符號數,需要使用chipscope線上看
MSK調製,多維有符號數,需要使用chipscope線上看
MSK調製,多維有符號數,需要使用chipscope線上看
調製端最後輸出的中頻訊號
接收端解調訊號
接收端解調訊號
低通濾波訊號
低通濾波訊號
MSK差分解調訊號
最後的資料
誤碼數總位元數(兩個相除就是誤位元速率)
3.Verilog核心程式
//Trans //output o_clk_4M; //100M ~ 4M , 25 times //output o_clk_1600K; //100M ~ 0.8M, 125 times //output o_clk_200K; //100M ~ 0.1M, 1000 times wire clk200; wire clk_4M; Msk_mod Msk_mod_u( .i_clk (i_clk), .i_rst (~i_rst), .o_clk_4M (clk_4M), .o_clk_1600K (), .o_clk_200K (clk200), .o_Trans_data (), .o_Trans_data_samples(o_Trans_data_samples), .o_Msk_I (), .o_Msk_Q (), .o_Msk_I_samples (o_Msk_I_samples), .o_Msk_Q_samples (o_Msk_Q_samples), .o_cos (), .o_sin (), .o_msk_cos (o_msk_cos), .o_msk_sin (o_msk_sin), .o_msk_R (o_msk_R) ); awgns awgns_u( .i_clk(clk_4M), .i_rst(~i_rst), .i_SNR(i_SNR), //這個地方可以設定訊雜比,數值大小從-10~50, .i_din(o_msk_R), .o_noise(), .o_dout(o_msk_Rn) ); //Rec Msk_demod Msk_demod_u( .i_clk (i_clk), .i_rst (~i_rst), .i_msk_R (o_msk_Rn), .o_msk_cos_rec (o_msk_cos_rec), .o_msk_sin_rec (o_msk_sin_rec), .o_msk_filter_recI(o_msk_filter_recI), .o_msk_filter_recQ(o_msk_filter_recQ), .o_data (o_data), .o_bit (o_bit) ); //error calculate Error_Chech Error_Chech_u( .i_clk(clk200), .i_rst(~i_rst), .i_trans(o_Trans_data_samples), .i_rec(o_bit), .o_error_num(o_error_num), .o_total_num(o_total_num) ); endmodule 0sj_002m