线性反馈移位寄存器实现产生伪随机数M序列

-----在CN03平台上,主要体现为Random功能的实现。

什么是线性反馈移位寄存器?

数学解释这里就不作介绍了,这里我们主要理解两个词语就行,一个是线性,它是指量与量之间的一种按比例、成直线的关系。这里面有一点点的数学知识,就是说在ai∈(0,1)的存储单元,ai的个数表示为反馈移位寄存器的级,在某一个时刻,这些寄存器会有一个状态,共有2^n个状态,每个状态对应于域GF(2)上的一个N维向量,用(a1,a2,a3,……an)表示。作为某一个时刻的状态,可以用一个函数f(a1,a2,a3…..an)来表示,从而称为该反馈寄存器的反馈函数,因此线性的意思,就是指如果这个反馈函数是a1,a2,a3….an的线性函数,那么这个反馈移位寄存器,就叫做线性反馈移位寄存器,比如f(a1,a2,a3,…an)=kna1⊕kn-1a2⊕….⊕k2an-1⊕k1an,其中系数ki∈{0,1}i=(1,2,3,…,n)。

另外一个词,就是反馈,这个词在我理解,就是说需要获得下一个状态就需要通过获得一个反馈值来实现。这个反馈的值可以在接下来的两种实现LFSR的方式的解释过程中得到更深刻的理解。

为什么要使用线性反馈移位寄存器?

使用线性反馈移位寄存器的作用:

在很多领域上都有使用到LFSR,譬如说密码学、白噪声,还有我们这里的随机功能实现,之所以把它使用到我们的radio的随机功能里面,除了它可以产生伪随机数序列实现随机播放功能之外,更重要的是我们利用了它的两个特点。其一,只需要在代码中开辟几个byte的位置,就能够实现随机序列的产生,需要的空间很少。其二,是它的记忆功能,我们在随机的功能里面,选择了下一曲,则上一曲可以通过调整抽头数的序列来从新获得,而不需要开辟空间进行存储。

怎样产生伪随机数M序列?

M序列的意思就是最大序列,专业点来说就是周期,就是这些不同的伪随机数在什么时候才会回到初始的输入状态,M序列的最大值为2^n-1,因为全0的初始状态不起作用,所以不能以全0的状态作为初始输入。

M序列就是我们在随机功能中获得的那个随机播放的序列。

它有些很好的特性:

  1. 通过反馈抽头数可以获得与之前输出的值的输入值,这也是我们所说的记忆功能。
  2. 这些给定的反馈抽头数永远都是偶数的,而且只包括最高位,不包括最低位。
  3. 还有另外一些特征,这里就不一一列出(这些规律的东西,我们只需要理解我们用到的)。

两种LFSR的产生形式

这里有两种LFSR的实现方式,伽罗瓦(Galois)和斐波那契(Fibonacci)两种形式,也有人称为外部(External)执行方式和内部(Internal)执行方式。所以这两种方式也是有着本质的区别的。

1、伽罗瓦方式(Internal)

如下图

(Galois Implementation)

从图中我们可以看到Galois方式的一些特征,其中包括数据的方向从左至右而反馈线路则是由右至左的。其中X^0项(本原多项式里面的”1”这一项),作为起始项。按照本原多项式所指示的,确定异或门(XOR)在移位寄存器电路上的位置。如上图中的X^4.因此Galois方式也有人称它为线内或模类型(M-型)LFSR.

2、斐波那契方式(External)

如下图

(Fibonacci implementation)

从图中我们可以看到Fibonacci方式的数学流向和反馈形式是恰好跟Galois方式相反的,按照本原多项式,其中的X^0这一项则作为最后一项,这里只需要一个XOR门,将本原多项式中所给出的taps来设定它的异或方式。因此Fibonacci方式也被叫做线外或者简型(S-型)LFSR.

代码是怎么通过这个原来实现伪随机数M序列的产生过程的?

下面来分析一下CN03的随机功能代码实现的过程:

对于Random_mode.c

1、Random_Initialise(void)

这里并不涉及到LFSR部分,其中最重要的是理解seed,就是随机数的种子,它是通过SYS_TICK_VALUE来获得的,也就是说,在系统运行的到某某时刻的时候,如果接到产生随机序列的命令,则获取当前的系统时刻作为seed,这里具有一定的随机性。

获得了随机的seed之后,我们看到它调用了InitialiseBitSwap(seed)。

2、InitialiseBitSwap(unsigned int Seed)

void InitialiseBitSwap(unsigned int Seed)

{  …….

for(…)//先活动一个初始数组,简单的赋值过程

last_bit_swap_array[BitSwapCounter] = bit_swap_array[BitSwapCounter];

…….

while(!LFSR_BitSwap)

{  if(Seed) //在确保LFSR的初始输入是随机数的同时,也要确保它不为0

{     //初始状态为0的时候,整个线性反馈移位的过程无论怎么操作都只有全0的状态

LFSR_BitSwap = Seed & 0x1F;

Seed = Seed >> 1;

}

else

{

LFSR_BitSwap = 1;

}

}

for(….)

{  do

{

if(LFSR_BitSwap & BIT_0)//这个条件是加速处理过程,对奇、偶数分开处//理,也能够增加序列的随机性

{     LFSR_BitSwap = (LFSR_BitSwap >> 1) ^ FIVE_STATE_NEXT_LFSR_FEEDBACK_TAPS;

//这句代码是整个程序里面最为重要的已经代码,它体现了Galois方式的代码实//现过程,跟进所提供的taps,我们可以把这句代码理解为in-line的处理过程,//先移位,然后跟进给出的taps对相应的为进行异或运算,从而实现了线性反馈//移位的功能。通过对照上图,能够较好地理解这个过程。

}

else

{     LFSR_BitSwap = (LFSR_BitSwap >> 1);

}

}while(LFSR_BitSwap > NUMBER_OF_LFSR_BITS);//确保这个随机数不能够大于确定的数组的个数值

bit_swap_array[last_bit_swap_array[BitSwapCounter]] = (LFSR_BitSwap-1);

//获得这个随机数后,将它存到相应的数组里面

}

}

  1. BitSwap(unsigned int InputValue)

还没有很好地理解这个函数的用意,但是我尝试去屏蔽关于这个函数的调用,并没有影响整个的随机功能。所以,我认为它应该也是一个增加随机性的过程。不过还好进一步理解,有新的进展,会更新到这里。

  1. Random_PreviousTrack和Random_NextTrack

这两个函数就是产生最后的随机播放曲目的应用。里面的核心代码在第二点里面已经基本上解释完毕,可以参考第二个函数的解释。至于上一曲下一曲的区别,这里要重点说明一下,就是利用了反馈抽头数在M序列上面的应用,在M序列解释的第一个特点中有提及。我们可以看看在头文件random.h里面的定义:

#define SIXTEEN_STAGE_NEXT_LFSR_FEEDBACK_TAPS (BIT_15 | BIT_13 | BIT_12 | BIT_10 )

#define SIXTEEN_STAGE_PREV_LFSR_FEEDBACK_TAPS (BIT_0  | BIT_14 | BIT_13 | BIT_11 )

抽头数的定义有一定的规律,参照这个规律,可以实现对其他级的选择。

小结

小结一下这个学习的过程,里面还有两点没有深入地理解:

  1. 抽头数是怎么来的,通常已经算好了,网上有相关的资源。参考网站:

http://www.newwaveinstruments.com/resources/articles/m_sequence_linear_feedback_shift_register_lfsr.htm

但是其中的数学知识是怎么实现的,在此就不作介绍了,可以网上收索一些资源。

2、     在上面也听过,有些函数可能是为了增加伪随机数的随机性而设置的,但是现在还不确定,譬如,BitSwap函数,还需要进一步学习。

线性反馈移位寄存器实现产生伪随机数M序列相关推荐

  1. 序列密码体制(python随机数密码,RC4,线性反馈移位寄存器

    目录 概念: Vernam密码技术(序列密码的起源 伪随机数 线性反馈移位寄存器: 线性反馈移位寄存器LFSR 概念: 明文按一定长度分组后表示成一个序列,称为明文流.加密时,由种子密钥通过密钥流生产 ...

  2. 【数字IC手撕代码】Verilog伪随机数生成器|线性反馈移位寄存器|题目|原理|设计|仿真

    芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球 四社区联合力荐!近500篇数字IC精品文章收录! [数字IC精品文章收录]学习路线·基础知识·总线·脚本语言·芯片求职· ...

  3. 线性反馈移位寄存器(LFSR) ______FPGA产生基于LFSR的伪随机数

    FPGA产生基于LFSR的伪随机数 https://blog.csdn.net/qq_34070723/article/details/89736772 1.概念 通过一定的算法对事先选定的随机种子( ...

  4. Verilog 实现伪随机数生成器(线性反馈移位寄存器)

    Verilog 实现伪随机数生成器(线性反馈移位寄存器) 1,题目 2,RTL代码设计 3,testbench测试代码 4,前仿真,波形验证 参考文献1 1,题目 不简单的进行移位,而是在移位的基础上 ...

  5. 四类九种移位寄存器总结(循环(左、右、双向)移位寄存器、逻辑和算术移位寄存器、串并转换移位寄存器、线性反馈移位寄存器LFSR|verilog代码|Testbench|仿真结果)

    移位寄存器总结 一.前言 二.简单循环左移/右移/双向移位寄存器 2.1 简单循环左移/右移/双向移位寄存器 2.2 verilog代码 2.3 Testbench 2.4 仿真结果 三.逻辑移位与算 ...

  6. HDLBITS笔记29:移位寄存器(包括4位移位寄存器,创建100位左/右旋转器,算术偏移,线性反馈移位寄存器等)

    题目1:4位移位寄存器(4-bit shift register) 构建一个具有异步复位.同步加载和使能功能的 4 位移位寄存器(右移位). reset:将移位寄存器重置为零. load: 加载数据[ ...

  7. 线性反馈移位寄存器(LSFR)

    线性反馈移位寄存器(LSFR) 流密码的流密钥产生器可以通过线性驱动和非线性组合两部分来实现.而线性驱动部分可以由线性反馈移位寄存器(LFSR)来实现. 线性反馈移位寄存器(LFSR):通常由移位寄存 ...

  8. 线性反馈移位寄存器LFSR(斐波那契LFSR(多到一型)和伽罗瓦LFSR(一到多型)|verilog代码|Testbench|仿真结果)

    线性反馈移位寄存器LFSR 一.前言 二.LFSR简介 三.斐波那契LFSR和伽罗瓦LFSR 3.1 斐波那契LFSR 3.1.1 斐波那契LFSR 3.1.2 verilog代码 3.1.3 Tes ...

  9. 流密码(一)同步流密码、自同步流密码以及线性反馈移位寄存器

    正式进入密码学领域,发现密码学更像是一门数学,主要是对数论.近世代数的简单应用以及运用在算法中,常常结合模运算以及数字逻辑运算. 流密码的第一部分主要是比较了同步流密码和自同步流密码,其中自同步流密码 ...

  10. 详解线性反馈移位寄存器(LFSR)

    转载于(九)详解线性反馈移位寄存器(LFSR) 文章目录 LFSR的由来 LFSR具体内容 对LFSR的密钥流攻击 延伸 书籍推荐 LFSR的由来 1. 移位寄存器: 移位寄存器(ShiftRegis ...

最新文章

  1. 键盘历史记录实用程序已停止工作 解决办法
  2. linux编译c++11的代码
  3. Asterisk AGI脚本
  4. 建立管理SQL Server登录帐户
  5. 10kv电压互感器型号_电气行业需要知道的10KV电压互感器基本技术参数
  6. Learning Multiview 3D point Cloud Registration论文阅读笔记
  7. Android 应用启动速度优化
  8. CSS 3的display:盒类型详解
  9. Python安装Tensorflow
  10. MFC显示位图和显示透明位图
  11. 【CGAL_空间搜索与排序】3D快速求交和距离计算
  12. 菜鸟心得1 - 在数据清洗过程中使用excel对重复数据进行处理
  13. 说话干嘛要“之道”啦?(持续更新中)
  14. delphi 18位身份证号码的校验
  15. Android推送的群魔乱舞
  16. 星舰原型机又炸了,马斯克:没事儿,咱还有
  17. 1 python数据分析概述
  18. brew Error: Cask ‘adoptopenjdk8‘ is unreadable
  19. 推荐一款免费又好用的客户管理软件
  20. 现在我的机子是卡巴+ewido+ZA的组合了!希望以此能远离病毒、木马等等威胁!

热门文章

  1. 设计模式--创建型模式之抽象工厂模式
  2. Android开机启动广播
  3. Android:实现弹窗效果
  4. 程序员累了怎么办-兄弟连IT教育
  5. 如何查看Dll中包含了哪些函数
  6. win7 兼容 因特尔十代_高配主板想用win7咋办 Intel10代CPU配上驱动总裁玩转win7
  7. springboot+springcloudgateway+nacos+sleuth+zipkin+mysql
  8. keil5.24 +注册机 下载
  9. 我的世界服务器显示fps,我的世界提升fps的方法 低配玩家必备秘籍
  10. 怎么通过Excel导入sqlserver数据库(无废话)