1
本应用笔记给出了使用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, 因此,相同的值将被多次返回。
审核编辑:郭婷
全部0条评论
快来发表一下你的评论吧 !