微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 8位单片机随机数

8位单片机随机数

时间:12-03 来源:互联网 点击:

===========================================

; 兼顾版本 乘数1664525(10进制)

;==============================================================================

兼顾版本 是不用上面的循环加来做乘法,而是在必要的时候加上 种子,$100* 种子,

$10000* 种子,来获得数字序列,这样能够提高速度,又不增加太多代码。

分解公式表

b7 b6 b5 b4 b3 b2 b1 b0

$0D = 0 0 0 0 1 1 0 1 b ---> +种子

$66 = 0 1 1 0 0 1 1 0 b ---> *$100h

$19 = 0 0 0 1 1 0 0 1 b ---> *$10000h

$00 = 0 0 0 0 0 0 0 0 b --->

| | | | | | | |

| | | | | | | |

V V V V V V V V

左 左 左 左 左 左

移 移 移 移 移 移

6 5 4 3 2 1

位 位 位 位 位 位

那么 种子*bit0 时,种子*$10000+种子

种子*bit1 时,种子*$100, 左移1位

种子*bit2 时,种子*$100+种子, 左移2位

种子*bit3 时,种子*$10000+种子,左移3位

种子*bit4 时,种子*$10000, 左移4位

种子*bit5 时,种子*$100, 左移5位

种子*bit6 时,种子*$100, 左移6位

;==============================================================================

; 伪随机数函数的线性叠加

; 计算 R_Seed=1664525 * R_Seed + 1

;------------------------------------------------------------------------------

; 输入:

; R_Seed0 --- 种子0

; R_Seed1 --- 种子1

; R_Seed2 --- 种子2

; R_Seed3 --- 种子3

; 回返:

; 种子0 ---> R_Seed0

; 种子1 ---> R_Seed1

; 种子2 ---> R_Seed2

; 种子3 ---> R_Seed3

; 重写

; R_Temp,R_Temp+1,R_Temp+2,R_Temp+3

;-------------------------------------------------------------------------------

; 空间: 106个字节

; 速度: F_RandomSeed 517个周期

;===============================================================================

F_RandomSeed:

CLC ; 复制种子进入R_Temp

LDA R_Seed0 ; 计算 种子 = 种子 *$10000+ 种子 +1

STA R_Temp

ADC #1

STA R_Seed0

LDA R_Seed1

STA R_Temp+1

ADC #0

STA R_Seed1

LDA R_Seed2

STA R_Temp+2

ADC R_Temp

STA R_Seed2

LDA R_Seed3

STA R_Temp+3

ADC R_Temp+1

STA R_Seed3

;-------------------------------------------------

;因为$0019660D 的Bit7=0,所以只需6次移位

;-------------------------------------------------

LDY #5

L_Rand1 ASL R_Temp ; 左移旧的种子

ROL R_Temp+1

ROL R_Temp+2

ROL R_Temp+3

;-------------------------------------------------

; 从 L_Rand4 列表取得 X, 4个索引值对应4种情况,数值选的巧妙!

; X=$00, 种子 = 种子 +$10000* R_Temp

; X=$01, 种子 = 种子 +$100 * R_Temp

; X=$FE, 种子 = 种子 +$10000* R_Temp+ R_Temp

; X=$FF, 种子 = 种子 +$100 * R_Temp+ R_Temp

;-------------------------------------------------

LDX L_Rand4,Y

BPL L_Rand2 ; 分支如果 X=$00 或 X=$01

CLC ; 种子 = 种子 +R_Temp

LDA R_Seed0

ADC R_Temp

STA R_Seed0

LDA R_Seed1

ADC R_Temp+1

STA R_Seed1

LDA R_Seed2

ADC R_Temp+2

STA R_Seed2

LDA R_Seed3

ADC R_Temp+3

STA R_Seed3

INX ; $ FE->$00,$ FF->$01

INX

L_Rand2 CLC

BEQ L_Rand3 ; 如果 X=$00, 种子 =种子 + R_Temp*$10000

LDA R_Seed1 ; 种子 = 种子 + R_Temp*$100

ADC R_Temp

STA R_Seed1

L_Rand3 LDA R_Seed2

ADC R_Temp,X

STA R_Seed2

LDA R_Seed3

ADC R_Temp+1,X

STA R_Seed3

DEY

BPL L_Rand1

RTS

L_Rand4 .DB $01,$01,$00,$FE,$FF,$01

;==============================================================================

; 改进的 兼顾版本B 选择新的 乘数=69069(10进制)

;==============================================================================

兼顾版本B中, 用69069(10进制)替换1664525(10进制)作乘数,也就是说,选择了另外一

个数字序列,这个乘数也是计算机程序的艺术,第2册>>一书中选出,经过论证和测试,

这个数字虽不及1664525做乘数好,但也是个神奇的数字,而且可以进一步减小程序时间。

;===============================================================================

; 伪随机数函数的线性叠加

; 计算种子 = 种子 * 69069 + 1

;-------------------------------------------------------------------------------

; 输入:

; R_Seed0 --- 种子0

; R_Seed1 --- 种子1

; R_Seed2 --- 种子2

; R_Seed3 --- 种子3

; 回返:

; 种子0 ---> R_Seed0

; 种子1 ---> R_Seed1

; 种子2 ---> R_Seed2

; 种子3 ---> R_Seed3

; 重写

; R_Temp,R_Temp+1

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top