m基于FPGA的MSK调制解调系统verilog开发,并带FPGA误码检测模块和matlab仿真程序

目录

1.算法描述

2.仿真效果预览

3.Verilog核心程序

4.完整FPGA


1.算法描述

整个模型的基本框图为

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

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

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

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

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

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

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

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

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

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

接收端解调信号

接收端解调信号

低通滤波信号

低通滤波信号

MSK差分解调信号

最后的数据

误码数

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

2.仿真效果预览

matlab2022a仿真结果如下:

 

 

3.Verilog核心程序

`timescale 1ns / 1ps
 
module tops(
           i_clk,
			  i_rst,
			  //Trans
			  o_Trans_data_samples,
			  o_Msk_I_samples,
			  o_Msk_Q_samples,
			  o_msk_cos,
			  o_msk_sin,
			  o_msk_R,
			  o_msk_Rn,
			  //Rec
			  o_msk_cos_rec,
			  o_msk_sin_rec,
			  o_msk_filter_recI,
			  o_msk_filter_recQ,
           o_data,
           o_bit,
           o_error_num,
			  o_total_num
	        );
 
input              i_clk;
input              i_rst;
//Trans
output signed[1:0] o_Trans_data_samples;
output signed[9:0] o_Msk_I_samples;
output signed[9:0] o_Msk_Q_samples;			  
output signed[15:0]o_msk_cos;
output signed[15:0]o_msk_sin;					  
output signed[15:0]o_msk_R;
output signed[15:0]o_msk_Rn;
//Rec
output signed[15:0]o_msk_cos_rec;
output signed[15:0]o_msk_sin_rec;	
output signed[15:0]o_msk_filter_recI;
output signed[15:0]o_msk_filter_recQ;
output signed[31:0]o_data;
output signed[1:0] o_bit;
 
output signed[31:0]o_error_num;
output signed[31:0]o_total_num;
 
 
//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_power(16'd100), 
    .i_din(o_msk_R), 
    .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
01_117m

4.完整FPGA

V

  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
下面是一个简单的MSK调制解调FPGA程序代码Verilog示例: ``` module msk_mod_demod ( input clk, input reset, input [7:0] data_in, output reg data_out, output reg mod_out ); // MSK调制参数 parameter freq_dev = 10; // 频偏 parameter bit_rate = 100; // 比特率 parameter sample_rate = 1000; // 采样率 // 计算参数 reg [31:0] phase_acc; // 相位累加器 reg [15:0] mod_acc; // 调制信号累加器 reg [15:0] demod_acc; // 解调信号累加器 reg [7:0] data_count; // 数据计数器 reg [7:0] sample_count; // 采样计数器 reg [7:0] bit_count; // 比特计数器 reg [1:0] demod_state; // 解调状态机 // 初始化参数 initial begin phase_acc <= 0; mod_acc <= 0; demod_acc <= 0; data_count <= 0; sample_count <= 0; bit_count <= 0; demod_state <= 2'b00; end // 数据输入 always @(posedge clk) begin if (reset) begin data_count <= 0; end else begin data_count <= data_count + 1; end end // MSK调制 always @(posedge clk) begin if (reset) begin phase_acc <= 0; mod_acc <= 0; end else begin if (sample_count == 0) begin mod_acc <= {mod_acc[14:0], data_in}; phase_acc <= phase_acc + freq_dev * mod_acc; end sample_count <= sample_count + 1; if (sample_count == sample_rate / bit_rate) begin sample_count <= 0; end end end // MSK解调 always @(posedge clk) begin if (reset) begin demod_acc <= 0; demod_state <= 2'b00; end else begin if (sample_count == 0) begin case (demod_state) 2'b00: begin // 等待跳变 if (data_in == 1) begin demod_state <= 2'b01; end end 2'b01: begin // 第一个采样 demod_acc <= phase_acc; demod_state <= 2'b10; end 2'b10: begin // 第二个采样 if (data_in == 0) begin demod_acc <= demod_acc + phase_acc; end demod_state <= 2'b00; end default: begin // 其他情况 demod_state <= 2'b00; end endcase end sample_count <= sample_count + 1; if (sample_count == sample_rate / bit_rate / 2) begin sample_count <= 0; end end end // 输出结果 always @(posedge clk) begin if (reset) begin data_out <= 0; bit_count <= 0; end else begin if (sample_count == 0) begin data_out <= (demod_acc > mod_acc) ? 1 : 0; if (bit_count == bit_rate - 1) begin bit_count <= 0; end else begin bit_count <= bit_count + 1; end end if (mod_acc > 0) begin mod_out <= 1; end else begin mod_out <= 0; end end end endmodule ``` 这是一个简单的MSK调制解调FPGA程序代码Verilog示例,其中包含MSK调制参数、计算参数、状态机、数据输入、MSK调制、MSK解调和输出结果等部分,可以根据具体的应用场景进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我爱C编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值