学习笔记 | 基于FPGA的伪随机数发生器(附代码)
今天给大侠带来在基于FPGA的伪随机数发生器,话不多说,上货。
今天是画师本人第一次和各位大侠见面,执笔绘画FPGA江湖,本人写了篇关于FPGA的伪随机数发生器学习笔记,这里分享给大家,仅供参考。
1
概念
随机数是专门的随机试验的结果,产生随机数有多种不同的方法。这些方法被称为随机数生成器。随机数最重要的特性是它在产生时后面的那个数与前面的那个数毫无关系。随机数分为三类,分别是伪随机数、密码学安全的伪随机数以及真随机数。
本次设计为基于FPGA生成的伪随机数发生器,什么是伪随机数呢?统计学伪随机性指的是在给定的随机比特流样本中,1的数量大致等于0的数量,同理,“10”“01”“00”“11”四者数量大致相等。类似的标准被称为统计学随机性。满足这类要求的数字在人类“一眼看上去”是随机的。
在实际应用中往往使用伪随机数就足够了。这些数列是“似乎”随机的数,实际上它们是通过一个固定的、可以重复的计算方法产生的。计算机或计算器产生的随机数有很长的周期性。它们不真正地随机,因为它们实际上是可以计算出来的,但是它们具有类似于随机数的统计特征。这样的发生器叫做伪随机数发生器。
2
设计原理
本次设计采用线性反馈移位寄存器(Linear Feedback Shift Register, LFSR)来实现伪随机数发生器。线性反馈移位寄存器是指,给定前一状态的输出,将该输出的线性函数再用作输入的移位寄存器。异或运算是最常见的单比特线性函数:对寄存器的某些位进行异或操作后作为输入,再对寄存器中的各比特进行整体移位。
线性反馈移位寄存器通常由动态或静态主从型触发器构成。反馈回路由异或门构成。其特性通常由一个特征多项式表征。LFSR结构如下图所示:
图1 LFSR结构示意图
对应的特征多项式为:
Gm为多项式的系数,而多项式系数只能为1或0。
利用LFSR生成伪随机数,需要给它一个随机种子(seed),由于它是由N个触发器和异或门组成,所以种子不能给全0,如果给的全0,将会陷入0的死循环一直出不来,就得不到我们想要的伪随机数,在设计时,我们可以给一个任意不为0的数。
基于以上原理,我们使用本原多项式x^32+x^7+x^5+x^3+x^2+x+1来构造最大周期的LFSR。
3
架构设计
设计架构如下图:
将输入时钟命名为clk,复位信号命名为rst_n,输入有效信号命名为ivalid,输入的随机种子命名为seed[31:0],生成的随机数命名为data[31:0]。
4
Verilog 代码实现
代码中data <= seed部分也可以不需要,不用输入有效信号以及随机种子,直接初始化为非零值也可。如直接初始化为非零值,则仿真代码只需进行复位即可。
设计实现代码如下:
module PRNG(
input wire clk,
input wire rst_n,
input wire ivalid,
input wire [31:0] seed,
output reg [31:0] data
);
always @ (posedge clk,negedge rst_n) begin
if (rst_n == 1'b0)
data <= 32'd0;
else if (ivalid == 1'b1)
data <= seed;
else begin
data[0] <= data[31];
data[1] <= data[0] ^ data[31];
data[2] <= data[1] ^ data[31];
data[3] <= data[2] ^ data[31];
data[4] <= data[3];
data[5] <= data[4] ^ data[31];
data[6] <= data[5];
data[7] <= data[6] ^ data[31];
data[8] <= data[7];
data[9] <= data[8];
data[10] <= data[9];
data[11] <= data[10];
data[12] <= data[11];
data[13] <= data[12];
data[14] <= data[13];
data[15] <= data[14];
data[16] <= data[15];
data[17] <= data[16];
data[18] <= data[17];
data[19] <= data[18];
data[20] <= data[19];
data[21] <= data[20];
data[22] <= data[21];
data[23] <= data[22];
data[24] <= data[23];
data[25] <= data[24];
data[26] <= data[25];
data[27] <= data[26];
data[28] <= data[27];
data[29] <= data[28];
data[30] <= data[29];
data[31] <= data[30];
end
end
endmodule
5
仿真测试及结果
仿真代码如下:
`timescale 1ns/1ps
module PRNG_tb;
reg clk;
reg rst_n;
reg ivalid;
reg [31:0] seed;
wire [31:0] data;
PRNG PRNG_inst(
.clk (clk),
.rst_n (rst_n),
.ivalid (ivalid),
.seed (seed),
.data (data)
);
initial clk = 1'b0;
always # 5 clk = ~clk;
initial begin
rst_n = 1'b0;
ivalid = 1'b0;
seed = 32'd0;
# 201;
rst_n = 1'b1;
#200;
@ (posedge clk);
# 2;
ivalid = 1'b1;
seed = {$random} % 4294967295;
@ (posedge clk);
# 2;
ivalid = 1'b0;
seed = 32'd0;
#200000;
$stop;
end
endmodule
本次仿真采用100M时钟进行,输入种子为非零随机数。
6
总结
以上是经过学习,集合了各家所长得到的结果。由于想做一个32位的伪随机数发生器,在网上找了各种资料,并没有找到有规定的标准多项式,于是随意定了一个。在实际运用当中,如果有标准的多项式系数,可能得到了一个伪随机数,就可以根据已知的特征式得出后面的结果,安全性也就大大降低了。
END
后续会持续更新,带来Vivado、 ISE、Quartus II 、candence等安装相关设计教程,学习资源、项目资源、好文推荐等,希望大侠持续关注。
大侠们,江湖偌大,继续闯荡,愿一切安好,有缘再见!
往期精选
电子版资料获取方式正确流程
详解FPGA技术,为什么这么牛?
干货 | 拆解FPGA芯片,带你深入了解其原理
FPGA在人工智能时代的独特优势
FPGA设计的8大重要知识点,你都get了吗?
开课通知 | 2021FPGA寒假班来啦!
学习笔记 | 基于FPGA的伪随机数发生器(附代码)相关推荐
- FPGA项目开发:基于FPGA的伪随机数发生器(附代码)
FPGA项目开发:基于FPGA的伪随机数发生器(附代码) 今天是画师和各位大侠见面了,执笔绘画FPGA江湖,本人写了篇关于FPGA的伪随机数发生器学习笔记,这里分享给大家,仅供参考. 一.概念 随机数 ...
- 学习笔记——基于FPGA的SD卡学习(1)
SD卡介绍 SD卡( Secure Digital Card),即安全数字卡 ,具有两个突出的优点 更高的安全性和更快的读写速度 . SD卡分类 SD卡从存储容量上分为3个级别,分别为SD卡.SD ...
- cs224n学习笔记 03:Subword Models(fasttext附代码)
课程内容 语言学的一点小知识 词级字符级模型 n-gram思想 FastText模型 1 .人类语言声音:语音学和音系学 语音学是音流,这是属于物理层面的东西 词法学:一个n-grams的代替方案 在 ...
- FPGA零基础学习:基于FPGA的多路选择器设计(附代码)
FPGA零基础学习:基于FPGA的多路选择器设计(附代码) 大侠好,欢迎来到FPGA技术江湖.本系列将带来FPGA的系统性学习,从最基本的数字电路基础开始,最详细操作步骤,最直白的言语描述,手把手的& ...
- FPGA零基础学习:基于FPGA的二进制转BCD设计(附代码)
FPGA零基础学习:基于FPGA的二进制转BCD设计(附代码) 本系列将带来FPGA的系统性学习,从最基本的数字电路基础开始,最详细操作步骤,最直白的言语描述,手把手的"傻瓜式"讲 ...
- RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决)
RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决) 参考文章: (1)RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决) (2)https://www.cnblogs. ...
- STM32学习笔记——基于正点原子例程编码器模式小结
STM32学习笔记--基于正点原子例程编码器模式小结 最近一段时间学习了,STM32f4的编码器功能,经过自己探索和他人的热心帮助,对于编码器模式有了一定了解.STM32f4单片机提供编码器模式,以便 ...
- c语言注释语句执行吗,C语言学习笔记之C语言概念解析(附资料分享)每一个语句都必须以分号结尾但预处理命令函数头和花括号“}”之后不能加分号...
[[怪兽爱C语言]C语言学习笔记之C语言概念解析(附资料分享)]https://toutiao.com/group/6582429294901854728/?iid=15906422033&a ...
- 激光slam学习笔记——基于图优化的激光slam方法
激光slam学习笔记--基于图优化的激光slam方法 1.slam基础 整体来说,在激光slam中,滤波器的误差要小于图优化的误差. 图优化通俗点说就是里程计计算的位姿与观测到的位姿之间会形成一个误差 ...
最新文章
- Hibernate映射解析——七种映射关系
- 学生成绩管理网站之——课程视频分享实现
- 为什么ubuntu64位下C语言for循环不能超过2147483647次?(size_t )
- 5.6 Column Attribute
- luogu P1659 [国家集训队]拉拉队排练
- 微软Tech Summit 2017,等你来打Call
- 3个观念 不再瞎学习!
- Python:List、tuple、dict、set
- 【FPGA】——UART串口通信
- 新装Windows 2003 + IIS 6.0的问题
- 查看linux目录剩余空间大小
- 以WinGrub 引导安装Fedora 4.0 为例,详述用WinGrub来引导Linux的安装
- Python 工匠: 异常处理的三个好习惯
- Python 算法交易实验30 退而结网7-交易策略思考
- 中国邮政国际挂号信网上查询
- 基于struts2的个人信息管理系统(一)
- 高绩效团队-VUCA时代的五个管理策略《二》—代际管理
- tp5html的if判断,TP5 判断方法
- mac系统自带中文输入法提示条不见了怎样找回
- 2018秋招心酸路---持续更新【面挂家】
热门文章
- 纵览上海IDC(互联网数据中心)机房分布概括
- 本周 火火火火 的开源项目!
- c语言将注释和语句分离,C语言组卷系统中重复题问题研究
- PID算法的一点改进思路
- 用计算机弹暗影刺客,伍六七:op曝光了七大暗影刺客的武器,你们都注意到了吗?...
- centos-Nagios 监控搭建
- 从中控HMI看智能座舱技术发展
- 基于单片机的指纹锁密码锁电路设计(#0202)
- [Warning] incompatible implicit declaration of built-in function ‘memset‘
- linux网络配置出现E325,Linux启动vi编辑器时提示E325: ATTENTION怎么办?