m基于FPGA的高斯白噪声信道模拟系统verilog实现,包含testbench,可以配置不同的SNR和频偏

目录

1.算法仿真效果

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

3.verilog核心程序

4.完整算法代码文件


1.算法仿真效果

vivado2019.2仿真结果如下:

SNR=0db,无频偏

SNR=5db,无频偏

SNR=25db,无频偏 

SNR=45db,带频偏 

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

       高斯白噪声信道在通信系统中具有重要意义,模拟此类信道有助于评估系统性能。本文提出的FPGA实现系统可以灵活地模拟不同信道条件,为通信系统的设计和测试提供有力支持。

本系统的设计分为以下几个步骤:

  1. 生成高斯白噪声:使用随机数生成器产生服从高斯分布的随机数,作为噪声信号。
  2. 生成发送信号:根据应用场景生成发送信号,如调制后的信号。
  3. 添加信道效应:将发送信号与高斯白噪声相加,模拟信道效应。
  4. 频偏模拟:将发送信号经过频偏模块,引入频偏效应。
  5. 编写Testbench:编写Verilog测试台,配置不同的SNR和频偏参数,验证系统功能。

       本系统在通信系统设计、性能评估和算法验证等方面具有广泛应用。通过模拟不同信道条件,可以评估系统在各种环境下的性能表现,指导系统设计优化。 

3.verilog核心程序

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2023/08/17 14:13:20
// Design Name: 
// Module Name: TEST
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module TEST();
    
reg i_clk;
reg i_rst;
reg signed[7:0]i_SNR;//根据质量得到当前帧类型:-10~50
reg signed[15:0]i_fre;
wire signed[15:0]i_real1;
wire signed[15:0]i_imag1;
wire signed[15:0]o_Rnoise1;
wire signed[15:0]o_Inoise1;
wire signed[15:0]o_real1;
wire signed[15:0]o_imag1;    
    
reg signed[1:0]i_Idiff;
reg signed[1:0]i_Qdiff;    
initial
begin
    i_Idiff = 2'b00;
    #1440
    repeat(12500)
    begin
    #10 i_Idiff = 2'b00;
    #30 i_Idiff = 2'b01;
    #10 i_Idiff = 2'b00;
    #30 i_Idiff = 2'b11;
    #10 i_Idiff = 2'b00;
    #30 i_Idiff = 2'b11;
    #10 i_Idiff = 2'b00;
    #30 i_Idiff = 2'b11;
    #10 i_Idiff = 2'b00;
    #30 i_Idiff = 2'b01;
    #10 i_Idiff = 2'b00;
    #30 i_Idiff = 2'b01;
    #10 i_Idiff = 2'b00;
    #30 i_Idiff = 2'b11;
    #10 i_Idiff = 2'b00;
    #30 i_Idiff = 2'b01;
    #10 i_Idiff = 2'b00;
    #30 i_Idiff = 2'b11;
    #10 i_Idiff = 2'b00;
    #30 i_Idiff = 2'b01;
    #10 i_Idiff = 2'b00;
    #30 i_Idiff = 2'b01;
    #10 i_Idiff = 2'b00;
    #30 i_Idiff = 2'b01;
    #10 i_Idiff = 2'b00;
    #30 i_Idiff = 2'b01;
    #10 i_Idiff = 2'b00;
    #30 i_Idiff = 2'b11;
    #10 i_Idiff = 2'b00;
    #30 i_Idiff = 2'b11;
    end
    $stop();
end

initial
begin
    i_Qdiff = 2'b00;
    #1440
    repeat(12500)
    begin
    #10 i_Qdiff = 2'b00;
    #30 i_Qdiff = 2'b11;
    #10 i_Qdiff = 2'b00;
    #30 i_Qdiff = 2'b11;
    #10 i_Qdiff = 2'b00;
    #30 i_Qdiff = 2'b01;
    #10 i_Qdiff = 2'b00;
    #30 i_Qdiff = 2'b01;
    #10 i_Qdiff = 2'b00;
    #30 i_Qdiff = 2'b01;
    #10 i_Qdiff = 2'b00;
    #30 i_Qdiff = 2'b01;
    #10 i_Qdiff = 2'b00;
    #30 i_Qdiff = 2'b11;
    #10 i_Qdiff = 2'b00;
    #30 i_Qdiff = 2'b11;
    #10 i_Qdiff = 2'b00;
    #30 i_Qdiff = 2'b11;
    #10 i_Qdiff = 2'b00;
    #30 i_Qdiff = 2'b01;
    #10 i_Qdiff = 2'b00;
    #30 i_Qdiff = 2'b11;
    #10 i_Qdiff = 2'b00;
    #30 i_Qdiff = 2'b01;
    #10 i_Qdiff = 2'b00;
    #30 i_Qdiff = 2'b11;
    #10 i_Qdiff = 2'b00;
    #30 i_Qdiff = 2'b01;
    #10 i_Qdiff = 2'b00;
    #30 i_Qdiff = 2'b11;
    end
    $stop();
end
    
//测试信号源
wire signed[1:0] w_Inz=i_Idiff;
wire signed[1:0] w_Qnz=i_Qdiff;

//成型滤波
fiter uut1(
.i_clk  (i_clk),
.i_rst  (i_rst),
.i_din  (w_Inz),
.o_dout (i_real1)
);

fiter uut2(
.i_clk  (i_clk),
.i_rst  (i_rst),
.i_din  (w_Qnz),
.o_dout (i_imag1)
);
    
 
initial
begin
    i_clk = 1'b1;
    i_rst = 1'b1;
    i_fre= 0;
    i_SNR = 8'd0;
    #1600
    i_rst = 1'b0;
    i_SNR = 0;
    i_fre= 0;
    #10000
    i_SNR = 5;
    i_fre= 0;
    #10000
    i_SNR = 15;
    i_fre= 0;
    #10000
    i_SNR = 25;
    i_fre= 0;
    #10000
    i_SNR = 45;
    i_fre= 10;//1/2^15*100e6=3k频偏
end

always #5 i_clk=~i_clk;  
    
AWGN_tops AWGN_tops_u(
.i_clk     (i_clk),
.i_rst     (i_rst),
.i_SNR     (i_SNR),//根据质量得到当前帧类型:-10~50
.i_fre     (i_fre),
.i_real1   (i_real1),
.i_imag1   (i_imag1),
.o_Rnoise1 (o_Rnoise1),
.o_Inoise1 (o_Inoise1),
.o_real1   (o_real1),
.o_imag1   (o_imag1)
);  
    
    
    
endmodule
00_037m

4.完整算法代码文件

V

猜你喜欢

转载自blog.csdn.net/hlayumi1234567/article/details/132347338