1.23.21 Random Number Generator (RNG)
The RNG peripheral contains two internal blocks namely TRNG (True Random Number Generator) and PRNG (Pseudo-Random Number Generator).
TRNG can be used for generating seed for the PRNG. The peripheral can generate random numbers of up to 64-bits length. This peripheral does not have interrupt generation capability.
Using The Library
RNG Peripheral library provides API's that can be used to perform below functionalities on the RNG peripheral.
-
Initialize the RNG
-
Enable/Disable the TRNG and PRNG blocks inside the RNG peripheral
-
Read/Write the seed, polynomial and the generated random number.
-
To check whether the number of valid bits in RNGSEEDx reached the required bit length for PRNG seed.
The example code below demonstrates how to generate True Random Number and Pseudo Random Number using RNG peripheral.
uint32_t true_rand_num[2]; uint32_t pseudo_rand_num[2]; int main ( void ) { /* Initialize all modules */ SYS_Initialize ( NULL ); /* Enable TRNG */ RNG_TrngEnable(); RNG_WaitForTrngCnt(); true_rand_num[0] = RNG_Seed1Get(); true_rand_num[1] = RNG_Seed2Get(); printf("\r\nSeed available in TRNG 0x%x%x", true_rand_num[1], true_rand_num[0]); /* Prepare PRNG to get seed from TRNG */ RNG_LoadSet(); RNG_Poly1Set(0x00C00003); RNG_PrngEnable(); /* Wait for at least 64 clock cycles */ CORETIMER_DelayUs(1); pseudo_rand_num[0] = RNG_NumGen1Get(); pseudo_rand_num[1] = RNG_NumGen2Get(); RNG_PrngDisable(); printf("\r\nGenerated 64-bit Pseudo-Random Number 0x%x%x\r\n", pseudo_rand_num[1], pseudo_rand_num[0]); while(true) { } /* Execution should not come here during normal operation */ return ( EXIT_FAILURE ); }
Library Interface
Random Number Generator peripheral library provides the following interfaces:
Functions
Name | Description |
---|---|
RNG_Initialize | Initializes RNG module of the device |
RNG_TrngEnable | Enables the TRNG block inside the RNG peripheral |
RNG_TrngDisable | Disables the TRNG block inside the RNG peripheral |
RNG_WaitForTrngCnt | Waits for RNGCNT to reach the number of bits required for the PRNG seed |
RNG_Seed1Get | Returns the content of RNGSEED1 register |
RNG_Seed2Get | Returns the content of RNGSEED2 register |
RNG_PrngEnable | Enables the PRNG block inside the RNG peripheral |
RNG_PrngDisable | Disables the PRNG block inside the RNG peripheral |
RNG_LoadSet | Sets the LOAD bit in RNGCON register |
RNG_LoadGet | Returns the LOAD bit value in RNGCON register |
RNG_Poly1Set | Loads a value into the RNGPOLY1 register |
RNG_Poly2Set | Loads a value into the RNGPOLY2 register |
RNG_Poly1Get | Returns the value of the RNGPOLY1 register |
RNG_Poly2Get | Returns the value of the RNGPOLY2 register |
RNG_NumGen1Set | Loads a value into the RNGNUMGEN1 register |
RNG_NumGen2Set | Loads a value into the RNGNUMGEN2 register |
RNG_NumGen1Get | Returns the value in the RNGNUMGEN1 register |
RNG_NumGen2Get | Returns the value in the RNGNUMGEN2 register |