本文章主要讨论高斯白噪声的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. stm32的定时器学习

    看了几篇博客之后,对这个定时器也有了一些认识,其实和51差不多,就是配置定时器的时候多了几个步骤而已. 其中很好的一片是:http://blog.sina.com.cn/s/blog_49cb4249 ...

  2. 虚拟机下安装ubuntu系统

    前期准备工具; 1,Oracle VM VirtualBox虚拟机 下载地址:http://pan.baidu.com/s/1miSaGvm 密码:c3dy 2,ubuntu系统文件 下载地址:htt ...

  3. mui开发app之多图压缩与上传(仿qq空间说说发表)

    欲实现效果图 提出需求点: 用户可自由添加删除替换多张图片,并且显示相应缩略图,限制为8张 用户可选择压缩图或直接上传原图功能 返回提醒用户会丢失填写的信息 下面一个个实现上述需求,从简单到复杂: 需 ...

  4. Omi树组件omi-tree编写指南

    Omi框架能够以少量的代码声明式地编写可拖拽移动节点的树形组件. 通常树组件能够考验UI框架的健壮性,因为需要使用到UI框架的如下特性: 组件嵌套 组件传值 组件批量传值 组件依赖自身递归嵌套(nes ...

  5. SOA与基于CDIF的API的联动

    几千年来,巴别塔的故事一直是人类面对的一个核心的困境.为了交流和沟通我们人类创造出语言,但沟通与交流仍然存在障碍……相同语言之间的沟通依语境的不同,尚且存在巨大的鸿沟,不同语言之间更是让人坐困愁城. ...

  6. ionic创建项目遇到的各种问题

    前提:执行创建语句的前提是ionic环境已经装好,开始执行ionic start myApp blank. 提示已经有同名项目,是否覆盖.这里创建的是一个blank(空) 的ionic项目.还要两种是 ...

  7. [笔记]ACM笔记 - 自用模板

    长期更新. 快速幂 lld pow_mod(lld a, lld b, const int &pr) { lld ans = 1; while (b) { if (b & 1) ans ...

  8. SQL server 用命令行更改数据库

    (计应154兰家才) CREATE  DATABASE  数据库名 ON [PRIMARY] ( <数据文件参数> [,…n]  [<文件组参数>] ) [LOG ON] ( ...

  9. LR11 scan correlation 卡死解决方案

    LR11 scan correlation 卡死解决方案 笔者在录制脚本时是勾选Enable correlation during recording的,导致后续每次脚本回放都会弹出scan corr ...

  10. CF219C hoosing Capital for Treeland

    D. Choosing Capital for Treeland time limit per test 3 seconds memory limit per test 256 megabytes i ...