高斯白噪聲的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

 轉載請聲明出處,謝謝。


 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM