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

1.算法仿真效果

本文是之前写的文章:

 

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

 

的硬件测试版本。

 

在系统在仿真版本基础上增加了ila在线数据采集模块,vio在线SNR设置模块,数据源模块。硬件ila测试结果如下:(完整代码运行后无水印):

 

VIO设置SNR=10db

 

 

 

VIO设置SNR=16db

 

 

 

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

 

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

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

 

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

接收端解调信号

 

接收端解调信号

 

低通滤波信号

 

低通滤波信号

 

MSK差分解调信号

 

最后的数据

 

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

 

3.Verilog核心程序

 

 

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2024/12/09 20:41:35
// Design Name: 
// Module Name: tops_hdw
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//
 
 
module tops_hdw(
 
input i_clk,
input i_rst,
output reg [3:0] led
);
    
 
 
//设置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 [1:0] o_Trans_data_samples;
	wire [9:0] o_Msk_I_samples;
	wire [9:0] o_Msk_Q_samples;
	wire [15:0] o_msk_cos;
	wire [15:0] o_msk_sin;
	wire [15:0] o_msk_R;
	wire [15:0] o_msk_Rn;
	wire [15:0] o_msk_cos_rec;
	wire [15:0] o_msk_sin_rec;
	wire [15:0] o_msk_filter_recI;
	wire [15:0] o_msk_filter_recQ;
	wire [31:0] o_data;
	wire [1:0] o_bit;
	wire [1:0]o_rec2;
   wire[31:0]o_error_num;
   wire[31:0]o_total_num;
	// Instantiate the Unit Under Test (UUT)
	tops uut (
		.i_clk(i_clk), 
		.i_rst(~i_rst), 
		.i_SNR(o_SNR),
		.o_Trans_data_samples(o_Trans_data_samples), 
		.o_Msk_I_samples(o_Msk_I_samples), 
		.o_Msk_Q_samples(o_Msk_Q_samples), 
		.o_msk_cos(o_msk_cos), 
		.o_msk_sin(o_msk_sin), 
		.o_msk_R(o_msk_R), 
		.o_msk_Rn(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),
		.o_rec2(o_rec2),
		.o_error_num(o_error_num),
		.o_total_num(o_total_num)
	);
 
 
//ila篇内测试分析模块
 
//ila篇内测试分析模块
ila_0 ila_u (
	.clk(i_clk), // input wire clk
	.probe0({ 
	        o_SNR,o_Trans_data_samples,o_rec2,//12
	        o_Msk_I_samples[9:3],o_Msk_Q_samples[9:3],//14
	        o_msk_cos[14:7],o_msk_sin[14:7],o_msk_R[14:7],o_msk_Rn[14:7],//32
	        o_msk_cos_rec[14:7],o_msk_sin_rec[14:7],o_msk_filter_recI[14:7],o_msk_filter_recQ[14:7],//32
	        o_error_num[15:0],o_total_num//48
	         })
	);
	
endmodule

  

 

 

 

posted @ 2025-03-14 00:41  我爱C编程  阅读(27)  评论(0)    收藏  举报