1.算法仿真效果
本程序系统是《m基于FPGA的MSK调制解调系统verilog开发,并带FPGA误码检测模块和matlab仿真程序》的的升级。

升级前原文链接

增加了完整的AWGN信道模型的FPGA实现,可以在testbench里面设置SNR,分析不同SNR对应的FPGA误码率情况。

vivado2019.2仿真结果如下(完整代码运行后无水印):

设置SNR=0:

基于FPGA的MSK调制解调系统verilog开发,包含testbench,同步模块,高斯信道模拟模块,误码率统计模块_码元

设置SNR=5:

基于FPGA的MSK调制解调系统verilog开发,包含testbench,同步模块,高斯信道模拟模块,误码率统计模块_f5_02

设置SNR=8:

基于FPGA的MSK调制解调系统verilog开发,包含testbench,同步模块,高斯信道模拟模块,误码率统计模块_f5_03

设置SNR=15:

基于FPGA的MSK调制解调系统verilog开发,包含testbench,同步模块,高斯信道模拟模块,误码率统计模块_码元_04

RTL图:

基于FPGA的MSK调制解调系统verilog开发,包含testbench,同步模块,高斯信道模拟模块,误码率统计模块_码元_05

然后MATLAB的MSK测试仿真如下:

基于FPGA的MSK调制解调系统verilog开发,包含testbench,同步模块,高斯信道模拟模块,误码率统计模块_码元_06基于FPGA的MSK调制解调系统verilog开发,包含testbench,同步模块,高斯信道模拟模块,误码率统计模块_码元_07

2.算法涉及理论知识概要
软件无线电是现代通信技术的重要研究领域和发展方向,目前发展迅速.快速发展的软件无线电技术与落后的硬件计算资源之间的矛盾越来越突出.为了缓解这个矛盾,一方面可以加快集成电路的研发进度,提升硬件的计算性能;另一方面可以对信号处理的算法进行深入的改进研究,降低算法的运算量,在现有的硬件水平下提出符合实际的解决方案.在信号处理的各种算法中,调制解调算法的地位十分重要.尤其是其中的解调算法,其复杂度已被作为衡量整个信号处理系统工作性能的有效指标. 本文的研究对象是恒定包络连续相位调制技术中的最小频移键控(MSK).这种调制方式具有恒定包络,相位连续,功率谱密度较集中,频带利用率高等特点.MSK信号的诸多优点使得它在信号理论研究和应用中具有重要意义.整个模型的基本框图为:

基于FPGA的MSK调制解调系统verilog开发,包含testbench,同步模块,高斯信道模拟模块,误码率统计模块_f5_08基于FPGA的MSK调制解调系统verilog开发,包含testbench,同步模块,高斯信道模拟模块,误码率统计模块_有符号数_09

    MSK信号是一种相位连续、包络恒定并且占用带宽最小的二进制正交FSK信号。它的第k个码元可以表示为:

基于FPGA的MSK调制解调系统verilog开发,包含testbench,同步模块,高斯信道模拟模块,误码率统计模块_f5_10

MSK信号具有特点如下:①MSK信号是正交信号;②其波形在码元间是连续的;③其包络是恒定不变的;④其附加相位在一个码元持续时间内线性地变化2/;⑤调制产生的频率偏移等于T4/1Hz;⑥在一个码元持续时间内含有的载波周期数等于1/4的整数倍。这里,我们考虑到硬件平台的高度可移植性,我们采用了无核化设计,就是全部使用verilog进行设计,下面首先说明一下系统的各个管脚。

系统复位,高电平复位清0,你接板子上任意一个开关即可。

数据发送端数据,有符号,你接起高位即可,示波器看

MSK符号,多维有符号数,需要使用chipscope在线看

MSK符号,多维有符号数,需要使用chipscope在线看

MSK调制,多维有符号数,需要使用chipscope在线看

MSK调制,多维有符号数,需要使用chipscope在线看

调制端最后输出的中频信号

接收端解调信号

接收端解调信号

低通滤波信号

低通滤波信号

MSK差分解调信号

最后的数据

误码数总比特数(两个相除就是误码率)

3.Verilog核心程序

 
//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



  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.