本應(yīng)用筆記給出了使用MAX7651/52微控制器和12位模數(shù)轉(zhuǎn)換器(ADC)生成隨機(jī)數(shù)的功能。
擴(kuò)頻通信、安全、加密和調(diào)制解調(diào)器等應(yīng)用需要生成隨機(jī)數(shù)。實(shí)現(xiàn)隨機(jī)數(shù)發(fā)生器的最常見方法是線性反饋移位寄存器(LFSR)。LFSR生成的代碼實(shí)際上是“偽”隨機(jī)的,因?yàn)橐欢螘r(shí)間后數(shù)字重復(fù)。訣竅是使用足夠長度的移位寄存器,以便模式在極長時(shí)間后重復(fù)。
長度為 1 的基本 LFSR 如圖 <> 所示。移位寄存器是一組串聯(lián)的觸發(fā)器,具有異或反饋。異或門用于對(duì)輸入位進(jìn)行加擾。
圖1.5級(jí)線性反饋移位寄存器。
有些表格提供了正確的反饋抽頭位置,用于生成需要最大時(shí)鐘數(shù)重復(fù)的序列。下表如下所示:
表 1.用于最大長度 2 至 32 位 LFSR 的抽頭
位數(shù) | 循環(huán)長度 | 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] |
* 長度為素?cái)?shù)的序列
請(qǐng)注意,有多種解決方案可以生成抽頭位置 最大長度序列。
使用 LFSR 存在一個(gè)主要問題:如果所有階段都恰好是 “0”,移位寄存器被“卡住”。這是因?yàn)?所有“0”的異或仍然是“0”。異或反饋確實(shí) 不生成“1”來重新開始序列。為了防止 在這種情況下,例程必須首先加載非零 種子價(jià)值。此值可以是任何數(shù)字,只要它不是 零。LFSR 生成的數(shù)字基于種子值。你 將一遍又一遍地獲得相同的數(shù)字序列,除非在某個(gè)時(shí)候 LSFR 重新加載了不同的種子。
這個(gè)種子價(jià)值從何而來?這將取決于可用的內(nèi)容 在您的特定應(yīng)用程序中。例如,如果您的系統(tǒng)可以訪問 到RTC(實(shí)時(shí)時(shí)鐘),那么一個(gè)好的種子是基于時(shí)間的。你 可以讀取當(dāng)前時(shí)間和/或日期,屏蔽部分并使用它 作為種子。另一個(gè)例子是溫度。如果您的系統(tǒng)可以讀取溫度 (假設(shè)它不是恒定的)那么這可以成為一顆好種子。的 ADC MAX765x可設(shè)置為讀取各種內(nèi)容: 刻度交流電源線 電壓、某些傳感器位置甚至放大齊納的約翰遜噪聲 二極管(密碼學(xué)中的常見做法)。
但是,在某些情況下,您只需要使用 01H 或其他數(shù)字, 并接受序列最終將重復(fù)的事實(shí),并且 預(yù)定模式。
呈現(xiàn)的例程使用 25 位序列,該序列在 叫了33萬次。即使你不能生產(chǎn)一個(gè)獨(dú)特的種子 時(shí)間,長度使得在大多數(shù)應(yīng)用程序中,“隨機(jī)性”是 綽綽有余。
MAX765x列表如下所示。例程使用四個(gè) 8 位內(nèi)存 標(biāo)記為 RN1-RN4 的位置。較低的 3 字節(jié) RN1-RN3 用于 24 位, RN4 的 MSB 是第 25 位。該算法使用 XOR 反饋(使用 處理器的 XRL 指令)來自“階段”25(進(jìn)位 位)和階段 7(RN1 的 MSB)。因?yàn)樗械牡挚拐叨贾皇?RAM 位置,您可以形成最多 32 位寬的隨機(jī)數(shù)。為此 例如,在例程結(jié)束時(shí),將 8 位數(shù)字 RANNUM 存儲(chǔ)在 RAM 中。
要獲得隨機(jī)數(shù)的真實(shí)高斯分布函數(shù),您需要 可以做進(jìn)一步的處理。添加任意數(shù)量的連續(xù) 樣本和取平均值(例如 4)將創(chuàng)建高斯分布。
算法中使用的一個(gè)編程“技巧”是“字節(jié)交換” 模擬“移位 8 個(gè)時(shí)鐘”。這是為了節(jié)省 CPU 時(shí)鐘周期。 例如,如果原始字節(jié)順序是 ABCD,則在字節(jié)交換之后 順序是BCDA。這樣可以防止代碼必須進(jìn)行“內(nèi)務(wù)管理” 將一個(gè)字節(jié)的 MSB 移動(dòng)到下一個(gè)字節(jié)的 LSB。這不重要 如果每時(shí)鐘或每 8 個(gè)時(shí)鐘計(jì)算隨機(jī)數(shù):它們 仍然是隨機(jī)的。由于LFSR的總長度是3的乘積 質(zhì)數(shù)(31、601 和 1801) 序列仍然是 33,554,431 子程序 調(diào)用,直到序列重復(fù)!當(dāng)然,由于我們正在查看 8 在我們的示例中,值限制為 00H 到 0FFH, 因此,相同的值將被多次返回。
審核編輯:郭婷
-
寄存器
+關(guān)注
關(guān)注
31文章
5401瀏覽量
122808 -
adc
+關(guān)注
關(guān)注
99文章
6611瀏覽量
547784 -
調(diào)制解調(diào)器
+關(guān)注
關(guān)注
3文章
871瀏覽量
39366
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
FPGA產(chǎn)生中偽隨機(jī)數(shù)發(fā)生器分析

什么是隨機(jī)數(shù)
學(xué)習(xí)筆記 | 基于FPGA的偽隨機(jī)數(shù)發(fā)生器(附代碼)
C語言中偽隨機(jī)數(shù)的產(chǎn)生及性能檢驗(yàn)
C語言random函數(shù)偽隨機(jī)數(shù)產(chǎn)生
為max765x微處理器的偽隨機(jī)數(shù)生成程序

神經(jīng)網(wǎng)絡(luò)的偽隨機(jī)數(shù)生成方法
偽隨機(jī)數(shù)生成算法
如何在C語言中使用隨機(jī)數(shù)
基于FPGA的偽隨機(jī)數(shù)發(fā)生器設(shè)計(jì)方案
單片機(jī)STM32F1隨機(jī)數(shù)生成探索與實(shí)踐(基于CUBEMX和KEIL5)

如何在200 smart中生成偽隨機(jī)數(shù)

評(píng)論