• 高斯白噪声的Verilog实现


          本文章主要讨论高斯白噪声的FPGA实现。简单的方法可以采用在Matlab中产生服从一定均值和方差的I、Q两路噪声信号。然后将两组数据存在FPGA中进行回放,以此来产生高斯白噪声。这种方法优点是产生方法简单占用FPGA资源少,但是他只能保证在回放噪声的一段数据是满足不相关特性的,段与段之间的数据是相关的。为了使整个过程中的噪声都满足不相关特性,可以通过LSFR序列的交错异或,得到均匀分布的伪随机信号,采用在一个ROM中存储sin函数值另一个ROM中存储log函数值。通过产生随机读地址的方式随机读取两个ROM中的数据,将两组随机的函数值相乘得到高斯白噪声。模块功能框图如下图。

          chipscope调试结果:

     

    //////////////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////////子模块1
    module
    rand_gen( input wire clk100, input wire rst, output reg [10:0] orbit_sin_addr, //rand number for sin ROM addr, [10:] output reg [9:0] orbit_log_addr //rand number for log ROM addr, [9:0] ); wire resetup; // asynchronous clear, high active wire [10:0] orbit_1; wire [10:0] orbit_2; wire [9:0] orbit_3; wire [9:0] orbit_4; parameter initval_1=24'b010110010010110111110001, initval_2=24'b100000111100010111010001, initval_3=24'b001101000001010010010001, initval_4=24'b111010100110010011110001; // 交错异或子模块 inter_feedback_rand_1 inter_feedback_rand_1_inst ( .orbit(orbit_1), //[10:0] .clk(clk100), .resetup(resetup), .initval(initval_1) //[23:0] );
    ////////////////////////////////////////////////////////////////////////////////// inter_feedback_rand_2 inter_feedback_rand_2_inst ( .orbit(orbit_2),
    //[10:0] .clk(clk100), .resetup(resetup), .initval(initval_2) //[23:0] );
    ////////////////////////////////////////////////////////////////////////////////// inter_feedback_rand_3 inter_feedback_rand_3_inst ( .orbit(orbit_3),
    //[9:0] .clk(clk100), .resetup(resetup), .initval(initval_3) //[23:0] );
    ////////////////////////////////////////////////////////////////////////////////// inter_feedback_rand_4 inter_feedback_rand_4_inst ( .orbit(orbit_4),
    //[9:0] .clk(clk100), .resetup(resetup), .initval(initval_4) //[23:0] ); ////////////////////////////////////////////////////////////////////////////////// // orbit_sin_addr [10:0] // ////////////////////////////////////////////////////////////////////////////////// always @ (posedge clk100 or posedge rst) begin if(rst) begin orbit_sin_addr <= 11'b0; end else orbit_sin_addr <= orbit_1 ^ orbit_2; end ////////////////////////////////////////////////////////////////////////////////// // orbit_log_addr [9:0 ] // ////////////////////////////////////////////////////////////////////////////////// always @ (posedge clk100 or posedge rst) begin if(rst) begin orbit_log_addr <= 10'b0; end else orbit_log_addr <= orbit_3 ^ orbit_4; end ////////////////////////////////////////////////////////////////////////////////// // resetup // ////////////////////////////////////////////////////////////////////////////////// reg resetup_r = 1'b0; assign resetup = resetup_r; always @ (posedge clk100 or posedge rst) begin if(rst) resetup_r <= 1'd1; else resetup_r <= 1'd0; end endmodule //////////////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////////子模块2 module noise_gen( input wire clk100, input wire rst, input wire noise_en, input wire [10:0] orbit_sin_addr, input wire [9:0] orbit_log_addr, output wire [15:0] noise_out ); wire [7:0] sin_data; wire [7:0] log_data; // 正弦、对数、乘法IP核 Sin Sin_inst ( .clka(clk100), // input clka .ena(noise_en), // input ena .addra(orbit_sin_addr), // input [10 : 0] addra .douta(sin_data) // output [7 : 0] douta ); Log Log_inst ( .clka(clk100), // input clka .ena(noise_en), // input ena .addra(orbit_log_addr), // input [9 : 0] addra .douta(log_data) // output [7 : 0] douta ); Mult_signed Mult_signed_inst ( .clk(clk100), // input clk .a(sin_data), // input [7 : 0] a .b(log_data), // input [7 : 0] b .ce(noise_en), // input ce .sclr(rst), // input sclr .p(noise_out) // output [15 : 0] p ); endmodule
    //////////////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////////顶层模块(部分)

     rand_gen rand_gen_inst_1 (
      .clk100(clk100),
      .rst(rst),
      .orbit_sin_addr(orbit_sin_addr_1),  
      .orbit_log_addr(orbit_log_addr_1)   
      );

     noise_gen noise_gen_inst_1 (
      .clk100(clk100),
      .rst(rst),
      .noise_en(noise_en),
      .orbit_sin_addr(orbit_sin_addr_1),
      .orbit_log_addr(orbit_log_addr_1),
      .noise_out(noise_out_1)
      ); 
    /////////////////////////////////////////////////////////////////////////////////feedback1
    `define FEXPR sr_a[23]^(sr_a[22]^(sr_a[17]^sr_a[0]))
    module inter_feedback_rand_1(
        output wire    [10:0] orbit,
        input  wire           clk,
        input  wire           resetup,    //置数,高电平有效
        input  wire    [23:0] initval
        );
    reg[23:0] sr_a;
    assign orbit[10:0]=sr_a[10:0];
    always@(posedge clk or posedge resetup)
    begin
        if(resetup)
            sr_a<=initval;
        else
        begin
            sr_a[22:0]<=sr_a[23:1];
            sr_a[23]<=`FEXPR;
        end
    end
    endmodule
    `undef FEXPR
    /////////////////////////////////////////////////////////////////////////////////feedback2
    `define FEXPR sr_a[23]^(sr_a[22]^(sr_a[7]^sr_a[0]))
    module inter_feedback_rand_2(    
        output wire    [10:0]     orbit,
        input  wire               clk,
        input  wire               resetup,    //置数,高电平有效
        input  wire    [23:0]     initval
        );
    reg[23:0] sr_a;
    assign   orbit[10]=sr_a[0],
             orbit[9]=sr_a[1],
             orbit[8]=sr_a[2],
             orbit[7]=sr_a[3],
             orbit[6]=sr_a[4],
             orbit[5]=sr_a[5],
             orbit[4]=sr_a[6],
             orbit[3]=sr_a[7],
             orbit[2]=sr_a[8],
             orbit[1]=sr_a[9],
             orbit[0]=sr_a[10];
    always@(posedge clk or posedge resetup)
    begin
        if(resetup)
            sr_a<=initval;
        else
        begin
            sr_a[22:0]<=sr_a[23:1];
            sr_a[23]<=`FEXPR;
        end
    end
    endmodule
    `undef FEXPR
    /////////////////////////////////////////////////////////////////////////////////feedback3
    `define FEXPR sr_a[23]^(sr_a[21]^(sr_a[20]^sr_a[0]))
    module inter_feedback_rand_3(
        output wire    [9:0] orbit,
        input  wire          clk,
        input  wire          resetup,    //置数,高电平有效
        input  wire    [23:0] initval    
        );
    reg[23:0] sr_a;
    assign orbit=sr_a[9:0];
    always@(posedge clk or posedge resetup)
    begin
        if(resetup)
            sr_a<=initval;
        else
        begin
            sr_a[22:0]<=sr_a[23:1];
            sr_a[23]<=`FEXPR;
        end
    end
    endmodule
    `undef FEXPR
    /////////////////////////////////////////////////////////////////////////////////feedback4
    `define FEXPR sr_a[23]^(sr_a[21]^(sr_a[11]^sr_a[0]))
    module inter_feedback_rand_4(
        output wire    [9:0] orbit,
        input  wire          clk,
        input  wire          resetup,    //置数,高电平有效
        input  wire    [23:0] initval    
        );
    reg[23:0] sr_a;
    assign   orbit[9]=sr_a[0],
             orbit[8]=sr_a[1],
             orbit[7]=sr_a[2],
             orbit[6]=sr_a[3],
             orbit[5]=sr_a[4],
             orbit[4]=sr_a[5],
             orbit[3]=sr_a[6],
             orbit[2]=sr_a[7],
             orbit[1]=sr_a[8],
             orbit[0]=sr_a[9];      
    always@(posedge clk or posedge resetup)
    begin
        if(resetup)
            sr_a<=initval;
        else
        begin
            sr_a[22:0]<=sr_a[23:1];
            sr_a[23]<=`FEXPR;
        end
    end
    endmodule
    `undef FEXPR

     转载请声明出处,谢谢。


     

  • 相关阅读:
    centos7 下安装MongoDB
    centos7 学习笔记
    MongoDB相关资料收集
    centos 下安装.net core
    sql server 2008 r2 中的oracle发布使用笔记
    sql server 与oracle数据互导的一种思路--sql server链接服务器
    Visual Studio 2015正式版/产品密钥 Win10正式版官方原版ISO镜像下载大全&安装激活教程
    Modbus库开发笔记:Modbus ASCII Slave开发
    PID控制器开发笔记之十一:专家PID控制器的实现
    μCUnit,微控制器的单元测试框架
  • 原文地址:https://www.cnblogs.com/yinknight/p/6972837.html
Copyright © 2020-2023  润新知