Le générateur de nombres aléatoires

publication: 3 janvier 2022 / mis à jour 10 mai 2024

Read this page in english

 

Appel à collaboration

Vous développez des montages, simples ou complexes avec ESP32 et ESP32forth.

Partagez-les ici sur ce site.

ESP32forth ne pourra se développer qu'avec la collaboration active de toutes les bonnes volontés.

Vos montages peuvent aider d'autres développeurs.

Les montages des autres développeurs peuvent vous aider.

Pour proposer un article ou un montage, cliquez ici



Caractéristique

Le générateur de nombres aléatoires génère de vrais nombres aléatoires, ce qui signifie un nombre aléatoire généré à partir d'un processus physique, plutôt qu'au moyen d'un algorithme. Aucun nombre généré dans la plage spécifiée n'est plus ou moins susceptibles d'apparaître que tout autre nombre.

Chaque valeur de 32 bits que le système lit dans le registre RNG_DATA_REG du générateur de nombres aléatoires est un vrai nombre aléatoire. Ces vrais nombres aléatoires sont générés en fonction du bruit thermique dans le système et le décalage d'horloge asynchrone.

Le bruit thermique provient de l'ADC haute vitesse ou de l'ADC SAR ou des deux. Chaque fois que l'ADC haute vitesse ou l'ADC SAR est activé, les flux de bits seront générés et introduits dans le générateur de nombres aléatoires via une porte logique XOR comme graines aléatoires.

Lorsque l'horloge RTC8M_CLK est activée pour le noyau numérique, le générateur de nombres aléatoires échantillonnera également RTC8M_CLK (8 MHz) en tant que graine binaire aléatoire. RTC8M_CLK est une source d'horloge asynchrone et elle augmente l'entropie RNG en introduisant la métastabilité du circuit. Cependant, pour assurer une entropie maximale, il est également recommandé de toujours activer une source ADC.

Lorsqu'il y a du bruit provenant du SAR ADC, le générateur de nombres aléatoires est alimenté avec une entropie de 2 bits dans un cycle d'horloge de RTC8M_CLK (8 MHz), qui est généré à partir d'un oscillateur RC interne (voir le chapitre Réinitialisation et Horloge pour plus de détails). Ainsi, il est conseillé de lire le registre RNG_DATA_REG à une cadence maximum de 500 kHz pour obtenir l'entropie maximale.

Lorsqu'il y a du bruit provenant du CAN haute vitesse, le générateur de nombres aléatoires est alimenté par une entropie de 2 bits dans un cycle d'horloge APB, qui est normalement de 80 MHz. Ainsi, il est conseillé de lire le registre RNG_DATA_REG à un débit maximal de 5 MHz pour obtenir l'entropie maximale.

Un échantillon de données de 2 Go, qui est lu à partir du générateur de nombres aléatoires à une fréquence de 5 MHz avec seulement la haute speed ADC étant activé, a été testé à l'aide de la suite de tests Dieharder Random Number (version 3.31.1). le l'échantillon a réussi tous les tests.

Procédure de programmation

Lors de l'utilisation du générateur de nombres aléatoires, assurez-vous qu'au moins l'ADC SAR, l'ADC haute vitesse ou le RTC8M_CLK est autorisé. Sinon, des nombres pseudo-aléatoires seront renvoyés.

Lorsque vous utilisez le générateur de nombres aléatoires, lisez le registre RNG_DATA_REG plusieurs fois jusqu'à ce qu'il y ait suffisamment d'aléas des nombres générés.

NameDescriptionAddressAccess
RNG_DATA_REGRandom number data$3FF75144RO
\ Random number data 
$3FF75144 constant RNG_DATA_REG 
 
\ get 32 bits random b=number 
: rnd  ( -- x ) 
    RNG_DATA_REG UL@ 
  ; 
 
\ get random number in interval [0..n-1] 
: random ( n -- 0..n-1 ) 
    rnd swap mod 
  ; 

Fonction RND en assembleur XTENSA

Depuis la version 7.0.7.4, ESP32forth dispose d'un assembleur XTENSA. Il est possible de réécrire notre mot rnd en assembleur XTENSA:

forth definitions 
asm xtensa 
 
$3FF75144 defForL32R: RNG_DATA_REG 
 
code myRND ( -- [addr] ) 
    a1 32           ENTRY,  
    a8 RNG_DATA_REG L32R,       \ a8 = RNG_DATA_REG 
    a9 a8 0         L32I.N,     \ a9 = [a8] 
    a9          arPUSH,         \ push a9 on stack 
                    RETW.N,  
end-code 

Legal: site web personnel sans commerce / personal site without seling