本應用筆記給出了使用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, 因此,相同的值將被多次返回。
審核編輯:郭婷
-
寄存器
+關注
關注
31文章
5322瀏覽量
120022 -
adc
+關注
關注
98文章
6438瀏覽量
544120 -
調制解調器
+關注
關注
3文章
850瀏覽量
38783
發布評論請先 登錄
相關推薦
評論