MAX765x微处理器的伪随机数生成例程

描述

本应用笔记给出了使用MAX7651/52微控制器和12位模数转换器(ADC)生成随机数的功能。

扩频通信、安全、加密和调制解调器等应用需要生成随机数。实现随机数发生器的最常见方法是线性反馈移位寄存器(LFSR)。LFSR生成的代码实际上是“伪”随机的,因为一段时间后数字重复。诀窍是使用足够长度的移位寄存器,以便模式在极长时间后重复。

长度为 1 的基本 LFSR 如图 <> 所示。移位寄存器是一组串联的触发器,具有异或反馈。异或门用于对输入位进行加扰。

调制解调器


图1.5级线性反馈移位寄存器。

有些表格提供了正确的反馈抽头位置,用于生成需要最大时钟数重复的序列。下表如下所示:

表 1.用于最大长度 2 至 32 位 LFSR 的抽头

 

位数 循环长度 Taps
2 3* [0,1]
3 7* [0,2]
4 15 [0,3]
5 31* [1,4]
6 63 [0,5]
7 127* [0,6]
8 255 [1,2,3,7]
9 511 [3,8]
10 1023 [2,9]
11 2047 [1,10]
12 4095 [0,3,5,11]
13 8191* [0,2,3,12]
14 16,383 [0,2,4,13]
15 32,767 [0,14]
16 65,535 [1,2,4,15]
17 131,071* [2,16]
18 262,143 [6,17]
19 524,287* [0,1,4,18]
20 1,048,575 [2,19]
21 2,097,151 [1,20]
22 4,194,303 [0,21]
23 8,388,607 [4,22]
24 16,777,215 [0,2,3,23]
25 33,554,431 [7,24]
26 67,108,863 [0,1,5,25]
27 134,217,727 [0,1,4,26]
28 268,435,455 [2,27]
29 536,870,911 [1,28]
30 1,073,741,823 [0,3,5,29]
31 2,147,483,647* [2,30]
32 4,294,967,295 [1,5,6,31]

 

* 长度为素数的序列

请注意,有多种解决方案可以生成抽头位置 最大长度序列。

使用 LFSR 存在一个主要问题:如果所有阶段都恰好是 “0”,移位寄存器被“卡住”。这是因为 所有“0”的异或仍然是“0”。异或反馈确实 不生成“1”来重新开始序列。为了防止 在这种情况下,例程必须首先加载非零 种子价值。此值可以是任何数字,只要它不是 零。LFSR 生成的数字基于种子值。你 将一遍又一遍地获得相同的数字序列,除非在某个时候 LSFR 重新加载了不同的种子。

这个种子价值从何而来?这将取决于可用的内容 在您的特定应用程序中。例如,如果您的系统可以访问 到RTC(实时时钟),那么一个好的种子是基于时间的。你 可以读取当前时间和/或日期,屏蔽部分并使用它 作为种子。另一个例子是温度。如果您的系统可以读取温度 (假设它不是恒定的)那么这可以成为一颗好种子。的 ADC MAX765x可设置为读取各种内容: 刻度交流电源线 电压、某些传感器位置甚至放大齐纳的约翰逊噪声 二极管(密码学中的常见做法)。

但是,在某些情况下,您只需要使用 01H 或其他数字, 并接受序列最终将重复的事实,并且 预定模式。

呈现的例程使用 25 位序列,该序列在 叫了33万次。即使你不能生产一个独特的种子 时间,长度使得在大多数应用程序中,“随机性”是 绰绰有余。

MAX765x列表如下所示。例程使用四个 8 位内存 标记为 RN1-RN4 的位置。较低的 3 字节 RN1-RN3 用于 24 位, RN4 的 MSB 是第 25 位。该算法使用 XOR 反馈(使用 处理器的 XRL 指令)来自“阶段”25(进位 位)和阶段 7(RN1 的 MSB)。因为所有的抵抗者都只是 RAM 位置,您可以形成最多 32 位宽的随机数。为此 例如,在例程结束时,将 8 位数字 RANNUM 存储在 RAM 中。

要获得随机数的真实高斯分布函数,您需要 可以做进一步的处理。添加任意数量的连续 样本和取平均值(例如 4)将创建高斯分布。

算法中使用的一个编程“技巧”是“字节交换” 模拟“移位 8 个时钟”。这是为了节省 CPU 时钟周期。 例如,如果原始字节顺序是 ABCD,则在字节交换之后 顺序是BCDA。这样可以防止代码必须进行“内务管理” 将一个字节的 MSB 移动到下一个字节的 LSB。这不重要 如果每时钟或每 8 个时钟计算随机数:它们 仍然是随机的。由于LFSR的总长度是3的乘积 质数(31、601 和 1801) 序列仍然是 33,554,431 子程序 调用,直到序列重复!当然,由于我们正在查看 8 在我们的示例中,值限制为 00H 到 0FFH, 因此,相同的值将被多次返回。

审核编辑:郭婷

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分