本文章主要讨论高斯白噪声的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. 使用live555 在linux下搭建 rtsp server

    系统环境 Debian 7 x64  / centos 7 x64  都可以 首先去下载源码 http://www.live555.com/liveMedia/public/live555-lates ...

  2. 【Spark2.0源码学习】-3.Endpoint模型介绍

         Spark作为分布式计算框架,多个节点的设计与相互通信模式是其重要的组成部分.   一.组件概览      对源码分析,对于设计思路理解如下:            RpcEndpoint: ...

  3. Spring数据库访问

    一般采用第三方具有连接缓冲池的数据源实现类:spring支持最常见的两个具有连接缓冲池的数据源为:DBCP和C3P0; DBCP(Database connection pool) 是Apache的一 ...

  4. Typecho - MyTagCloud标签云插件

    一.前言: 标签云是博客.CMS类系统的常见功能,读者可以根据标签快速的查找和浏览自己喜欢的文章.个人很喜欢Typecho的简洁,但对于后台不能控制前台标签栏目的显示还是略表遗憾.令人高兴的是Type ...

  5. mui开发app之自定义事件以更新其他页内容

    我之前做过jquery mobile的开发,那还是前年的事情 在jquery mobile中,由于页面是存储在div[data-role=page]的dom中(jqmobile通过对data-role ...

  6. Ajax第一课

    <script language="javascript"></script> Javascript 函数创建     function 函数名(){    ...

  7. ASP.NET Core:部署项目到Ubuntu Server

    概述 基于上一篇成功安装Ubuntu Server 16.10的基础上,接下来继续我们ASP.NET Core项目的部署之旅! 只是对于这些年整天和Windows打交道的我,初次使用Linux确实有点 ...

  8. Java:构造器,构造代码块,静态代码块的执行顺序

    1.构造器:与类同名且没有返回值,用来初始化类属性: 构造器又分为无参构造器和有参构造器 1.1:无参构造器 public class Contruction{ ...属性... public Con ...

  9. linux用户和组的创建与管理!

    useradd创建用户,usermod修改用户属性,userdel删除用户,groupadd创建组,groupmod修改组属性,groupdel删除组. 创建用户命令:useradd 语法: user ...

  10. AutoFac学习摘要

    依赖注入(控制反转)常见的依赖注入工具:AutoFac,Spring.Net,Unity等依赖注入的方式:1.通过构造函数进行注入2.通过属性进行注入 注意:在项目中AutoFac的注入有两次,第一次 ...