本文章主要讨论高斯白噪声的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. Cf #353 D. Tree Construction

    题目链接:http://codeforces.com/problemset/problem/675/D 题目大意是将一个没有相同数字的数列中的数字依次插入到二叉搜索树中,问除了第一个数字以外,其他数字 ...

  2. Nodejs进阶:express+session实现简易身份认证

    本文摘录自<Nodejs学习笔记>,更多章节及更新,请访问 github主页地址.欢迎加群交流,群号 197339705. 文档概览 本文基于express.express-session ...

  3. Mahout源码分析:并行化FP-Growth算法

    FP-Growth是一种常被用来进行关联分析,挖掘频繁项的算法.与Aprior算法相比,FP-Growth算法采用前缀树的形式来表征数据,减少了扫描事务数据库的次数,通过递归地生成条件FP-tree来 ...

  4. (原创)看我用各种姿势在手机和PC查看到连接到的wifi密码

    今天一个女神来我家做客,她问我WiFi密码,然而我却奇迹般的忘记了(特么的当时心里一万个草泥马踏过去),让我在她面前尴尬求子的,所以为了防止你们也出现这种情况,我特地把各种方法整理了一下,那么感兴趣的 ...

  5. SpringMVC中的session用法及细节记录

    前言 初学SpringMVC,最近在给公司做的系统做登录方面,需要用到session. 在网上找了不少资料,大致提了2点session保存方式: 1.javaWeb工程通用的HttpSession 2 ...

  6. 使用Apache Spark 对 mysql 调优 查询速度提升10倍以上

    在这篇文章中我们将讨论如何利用 Apache Spark 来提升 MySQL 的查询性能. 介绍 在我的前一篇文章Apache Spark with MySQL 中介绍了如何利用 Apache Spa ...

  7. Xcode旧项目引入CocoaPod遇到的问题与解决

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  8. hdu4463 Outlets 最小生成树

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4463 很裸的一道题目,稍微处理一下输入即可 代码: #include<iostream> ...

  9. vue-router2.x

    组件中的路由 <router-link to=""></router-link> 无参数 <router-link to="/ar/1&qu ...

  10. Chrome DevTools 的 Queueing、Stalled解析

    https://developers.google.com/web/tools/chrome-devtools/network-performance/understanding-resource-t ...