本文章主要讨论高斯白噪声的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 [:] orbit_sin_addr, //rand number for sin ROM addr, [10:]
output reg [:] orbit_log_addr //rand number for log ROM addr, [9:0]
);
wire resetup; // asynchronous clear, high active
wire [:] orbit_1;
wire [:] orbit_2;
wire [:] orbit_3;
wire [:] orbit_4;
parameter initval_1='b010110010010110111110001,
initval_2='b100000111100010111010001,
initval_3='b001101000001010010010001,
initval_4='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 <= '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 <= 'b0;
end
else
orbit_log_addr <= orbit_3 ^ orbit_4;
end
//////////////////////////////////////////////////////////////////////////////////
// resetup //
//////////////////////////////////////////////////////////////////////////////////
reg resetup_r = 'b0;
assign resetup = resetup_r;
always @ (posedge clk100 or posedge rst) begin
if(rst)
resetup_r <= 'd1;
else
resetup_r <= 'd0;
end
endmodule
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////子模块2
module noise_gen(
input wire clk100,
input wire rst,
input wire noise_en,
input wire [:] orbit_sin_addr,
input wire [:] orbit_log_addr,
output wire [:] noise_out
);
wire [:] sin_data;
wire [:] 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[]^(sr_a[]^(sr_a[]^sr_a[]))
module inter_feedback_rand_1(
output wire [:] orbit,
input wire clk,
input wire resetup, //置数,高电平有效
input wire [:] initval
);
reg[:] sr_a;
assign orbit[:]=sr_a[:];
always@(posedge clk or posedge resetup)
begin
if(resetup)
sr_a<=initval;
else
begin
sr_a[:]<=sr_a[:];
sr_a[]<=`FEXPR;
end
end
endmodule
`undef FEXPR
/////////////////////////////////////////////////////////////////////////////////feedback2
`define FEXPR sr_a[]^(sr_a[]^(sr_a[]^sr_a[]))
module inter_feedback_rand_2(
output wire [:] orbit,
input wire clk,
input wire resetup, //置数,高电平有效
input wire [:] initval
);
reg[:] sr_a;
assign orbit[]=sr_a[],
orbit[]=sr_a[],
orbit[]=sr_a[],
orbit[]=sr_a[],
orbit[]=sr_a[],
orbit[]=sr_a[],
orbit[]=sr_a[],
orbit[]=sr_a[],
orbit[]=sr_a[],
orbit[]=sr_a[],
orbit[]=sr_a[];
always@(posedge clk or posedge resetup)
begin
if(resetup)
sr_a<=initval;
else
begin
sr_a[:]<=sr_a[:];
sr_a[]<=`FEXPR;
end
end
endmodule
`undef FEXPR
/////////////////////////////////////////////////////////////////////////////////feedback3
`define FEXPR sr_a[]^(sr_a[]^(sr_a[]^sr_a[]))
module inter_feedback_rand_3(
output wire [:] orbit,
input wire clk,
input wire resetup, //置数,高电平有效
input wire [:] initval
);
reg[:] sr_a;
assign orbit=sr_a[:];
always@(posedge clk or posedge resetup)
begin
if(resetup)
sr_a<=initval;
else
begin
sr_a[:]<=sr_a[:];
sr_a[]<=`FEXPR;
end
end
endmodule
`undef FEXPR
/////////////////////////////////////////////////////////////////////////////////feedback4
`define FEXPR sr_a[]^(sr_a[]^(sr_a[]^sr_a[]))
module inter_feedback_rand_4(
output wire [:] orbit,
input wire clk,
input wire resetup, //置数,高电平有效
input wire [:] initval
);
reg[:] sr_a;
assign orbit[]=sr_a[],
orbit[]=sr_a[],
orbit[]=sr_a[],
orbit[]=sr_a[],
orbit[]=sr_a[],
orbit[]=sr_a[],
orbit[]=sr_a[],
orbit[]=sr_a[],
orbit[]=sr_a[],
orbit[]=sr_a[];
always@(posedge clk or posedge resetup)
begin
if(resetup)
sr_a<=initval;
else
begin
sr_a[:]<=sr_a[:];
sr_a[]<=`FEXPR;
end
end
endmodule
`undef FEXPR

转载请声明出处,谢谢。

【FPGA】高斯白噪声的Verilog实现的更多相关文章

  1. Matlab实现加性高斯白噪声信道(AWGN)下的digital调制格式识别分类

    Matlab实现加性高斯白噪声信道(AWGN)下的digital调制格式识别分类 内容大纲 加性高斯白噪声信道(AWGN)下的digital调制格式识别分类 (1. PSK; 2. QPSK; 3.8 ...

  2. [转] Matlab中给信号加高斯白噪声的方法

    MATLAB中产生高斯白噪声非常方便,可以直接应用两个函数,一个是WGN,另一个是AWGN.WGN用于产生高斯白噪声,AWGN则用于在某一信号中加入高斯白噪声. 1. WGN:产生高斯白噪声 y = ...

  3. 高斯白噪声(white Gaussian noise,WGN)

    本文科普一下高斯白噪声(white Gaussian noise,WGN). 百度百科上解释为“高斯白噪声,幅度分布服从高斯分布,功率谱密度服从均匀分布”,听起来有些晦涩难懂,下面结合例子通俗而详细地 ...

  4. MATLAB中产生高斯白噪声的两个函数

    MATLAB中产生高斯白噪声非常方便,可以直接应用两个函数,一个是WGN,另一个是AWGN.WGN用于产生高斯白噪声,AWGN则用于在某一信号中加入高斯白噪声.1.WGN:产生高斯白噪声 y = wg ...

  5. FPGA按键去抖verilog代码

    按键去抖的原因及其分类就不罗嗦了. 在这里解释一段代码,代码是网上找的,看了半天没懂,无奈查了半天想了半天,终于明白了... module sw_debounce(clk,rst_n,sw1,sw2, ...

  6. FPGA 状态机-序列检测器verilog

    实现功能:检测出串行输入数据4位Data二进制序列0101,当检测到该序列的时候,out=1,否则out=0 (1)给出状态编码,画出状态图 (2)门电路实现 (3)verilog实现 首先规定Q3Q ...

  7. 【FPGA篇章三】FPGA常用语句:Verilog基本语法要素

    欢迎大家关注我的微信公众账号,支持程序媛写出更多优秀的文章 Verilog中总共有十九种数据类型,我们先介绍四个最基本的数据类型,他们是: reg型.wire型.integer型.parameter型 ...

  8. 【MATLAB】对离散采样信号添加高斯白噪声(已知Eb/N0)

    (1)首先计算已知信号序列(采样之后得到的信号)的平均功率.该序列在第n个点处的功率为: 如果已知的信号序列中的总共的点数为N个,则该序列的平均功率为: 在MATLAB中求平均功率的方法是: Pav= ...

  9. python 写matlab中的加性高斯白噪声AWGN

    定义 原始信号:x 噪声信号:n 信噪比:SNR 信号长度:N def wgn(x, snr): snr = 10**(snr/10.0) xpower = np.sum(x**2)/len(x) n ...

随机推荐

  1. 1.6 在WHERE子句中引用取别名的列

    如下查询,会抛出错误:mysql> select sal as salary, comm as commission from emp where salary < 5000;ERROR ...

  2. js解析器(重要!)

    JavaScript有"预解析"的特性,理解预解析是很重要的,不然在实际开发中可能会遇到很多无法解析的问题,甚至导致程序bug的存在. #js预解析执行过程: 预解析:(全局作用域 ...

  3. 根据GPS经纬度判断当前所属的市区

    这个事情分两步走 1. 拿到行政区划的地理围栏数据 2. 根据GPS定位判断一个点是否落在地理围栏的多边形区域里. 1. 获取行政区划的地理围栏数据可以利用百度API.打开以前我的一个例子在chrom ...

  4. lib-flexble 使用遇到的bug及解决方案

    1 lib-flexble解决微信端长按不能弹出识别二维码功能 加viewport就完美解决  flexble可以自动完成 一般情况不建议加 但是么 bug出来了  加上就好了 2 Font Boos ...

  5. Linq 查询与普通查询的区别

    普通:select * --1 from User(表名) as u --2 where u.Name like '%s%' --3 Linq : from User(表名) as u --1 whe ...

  6. Oracle数据泵(上)

    导出 (以导出表空间为例) 1.给用户创建密码 alter user system identified by 00000000;   2.创建导出目录 create or replace  dire ...

  7. 【算法系列学习】DP和滚动数组 [kuangbin带你飞]专题十二 基础DP1 A - Max Sum Plus Plus

    A - Max Sum Plus Plus https://vjudge.net/contest/68966#problem/A http://www.cnblogs.com/kuangbin/arc ...

  8. 关于v-model、v-for、v-on的用法

    展示Holle Vue     window.onload = function(){         var box = new Vue({             el:'#div',      ...

  9. AOJ/堆与动态规划习题集

    ALDS1_9_A-CompleteBinaryTree. Codes: //#define LOCAL #include <cstdio> int parent(int i) { ret ...

  10. Spring Boot 整合 MyBatis

    前言 现在业界比较流行的数据操作层框架 MyBatis,下面就讲解下 Springboot 如何整合 MyBatis,这里使用的是xml配置SQL而不是用注解.主要是 SQL 和业务代码应该隔离,方便 ...