【硬件测试】基于FPGA的2FSK调制解调系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR

1.算法仿真效果

本文是之前写的文章


基于FPGA的2FSK调制解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR_fpga 2fsk-CSDN博客


的硬件测试版本。


在系统在仿真版本基础上增加了ila在线数据采集模块,vio在线SNR设置模块,数据源模块。


硬件ila测试结果如下:(完整代码运行后无水印):


vio设置SNR=30db



vio设置SNR=20db



vio设置SNR=10db


硬件测试操作步骤可参考程序配套的操作视频。


2.算法涉及理论知识概要

频移键控是利用载波的频率变化来传递数字信息。数字频率调制是数据通信中使用较早的一种通信方式,由于这种调制解调方式容易实现,抗噪声和抗衰减性能较强,因此在中低速数字通信系统中得到了较为广泛的应用。


在二进制频移键控中,幅度恒定不变的载波信号的频率随着输入码流的变化而切换(称为高音和低音,代表二进制的1 和0)。产生FSK 信号最简单的方法是根据输入的数据比特是0还是1,在两个独立的振荡器中切换。采用这种方法产生的波形在切换的时刻相位是不连续的,因此这种FSK 信号称为不连续FSK 信号。由于相位的不连续会造频谱扩展,这种FSK 的调制方式在传统的通信设备中采用较多。随着数字处理技术的不断发展,越来越多地采用连继相位FSK调制技术。目前较常用产生FSK 信号的方法是,首先产生FSK 基带信号,利用基带信号对单一载波振荡器进行频率调制。相位连续的FSK信号的功率谱密度函数最终按照频率偏移的负四次幂衰落。如果相位不连续,功率谱密度函数按照频率偏移的负二次幂衰落。


2-FSK功率谱密度的特点如下:


(1) 2FSK信号的功率谱由连续谱和离散谱两部分构成,离散谱出现在f1和f2位置;


(2) 功率谱密度中的连续谱部分一般出现双峰。若两个载频之差|f1 -f2|≤fs,则出现单峰。


PSK:在相移键控中,载波相位受数字基带信号的控制,如在二进制基带信号中为0时,载波相位为0或π,为1时载波相位为π或0。载波相位和基带信号有一一对应的关系,从而达到调制的目的。


在二进制频移键控(2FSK)中,当传送“1”码时对应于载波频率,传送“0”码时对应于载波频率。 2FSK信号波形可看作两个2ASK信号波形的合成,下图是相位连续的2FSK信号波形。


FSK信号的解调也有非相干和相干两种,FSK信号可以看作是用两个频率源交替传输得到的,所以FSK的接收机由两个并联的ASK接收机组成。


FSK:频移键控是利用两个不同频率f1和f2的振荡源来代表信号1和0,用数字信号的1和0去控制两个独立的振荡源交替输出。对二进制的频移键控调制方式,其有效带宽为B=2xF+2Fb,xF是二进制基带信号的带宽也是FSK信号的最大频偏,由于数字信号的带宽即Fb值大,所以二进制频移键控的信号带宽B较大,频带利用率小。


FSK功率谱密度的特点如下:


(1) 2FSK信号的功率谱由连续谱和离散谱两部分构成,离散谱出现在f1和f2位置;


(2) 功率谱密度中的连续谱部分一般出现双峰。若两个载频之差|f1 -f2|≤fs,则出现单峰。


3.Verilog核心程序

wire o_msg;


//产生模拟测试数据

signal signal_u(

.i_clk (i_clk),

.i_rst (~i_rst),

.o_bits(o_msg)

);





//设置SNR

wire signed[7:0]o_SNR;

vio_0 your_instance_name (

.clk(i_clk),                // input wire clk

.probe_out0(o_SNR)  // output wire [7 : 0] probe_out0

);


wire signed[15:0]o_carrier1;

wire signed[15:0]o_carrier2;

wire signed[15:0]o_fsk;

wire signed[15:0]o_fskn;

wire signed[31:0]o_de_ffsk1;

wire signed o_bits;

wire signed[31:0]o_error_num;

wire signed[31:0]o_total_num;

wire  [1:0]o_rec2;


//FSK调制解调系统    

FSK uut(

.i_clk(i_clk),

.i_rst(~i_rst),

.i_bits(o_msg),

.i_SNR(o_SNR),

.o_carrier1(o_carrier1),

.o_carrier2(o_carrier2),

.o_fsk(o_fsk),

.o_fskn(o_fskn),

.o_de_ffsk1(o_de_ffsk1),

.o_bits(o_bits),

.o_error_num(o_error_num),

.o_total_num(o_total_num),

.o_rec2     (o_rec2)

);





wire signed[15:0]w_de_ffsk1=o_de_ffsk1[25:10];

wire errflag = o_bits^{~o_rec2[1]};



//ila篇内测试分析模块

ila_0 ila_u (

.clk(i_clk), // input wire clk

.probe0({

o_msg,o_SNR,//9

o_fsk, o_fskn,w_de_ffsk1,o_bits,//50

o_error_num,o_total_num,errflag,//64

o_rec2

})

);  

endmodule

0sj_025m



4.开发板使用说明和如何移植不同的开发板

注意:硬件片内测试是指发射接收均在一个板子内完成,因此不需要定时同步模块。


在本课题中,使用的开发板是:



如果你的开发板和我的不一样,可以参考代码包中的程序移植方法进行移植:


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容