Fibonacci Linear Feedback Shift Register (Pseudo-Random Number Generator)

Dependents:   SDP_K1_Rand FibonacciLFSR_LED_Demo

FibonacciLFSR.cpp

Committer:
electromotivated
Date:
2016-06-25
Revision:
1:a1207d543967
Parent:
0:2038ff2b7de5

File content as of revision 1:a1207d543967:

#include "FibonacciLFSR.h"
#include "mbed.h"

FibonacciLFSR::FibonacciLFSR(LFSR_SIZE_t size){
    this->size = size;
    this->lfsr_period = (1 << size) - 1;    // Number of random numbers
    this->lfsr = 0x0001;
}

uint16_t FibonacciLFSR::getRandom(){
    switch (size){
        case LFSR_2:
            feedback_bit = ((lfsr >> 1) ^ (lfsr >> 0)) & 0x01;
            break;
        case LFSR_4:
            feedback_bit = ((lfsr >> 3) ^ (lfsr >> 2)) & 0x01;
            break;
        case LFSR_8:
            feedback_bit = ((lfsr >> 7) ^ (lfsr >> 5) ^ (lfsr >> 4) ^ (lfsr >> 3)) & 0x01;
            break;
        case LFSR_16:
            feedback_bit = ((lfsr >> 15) ^ (lfsr >> 14) ^ (lfsr >> 12) ^ (lfsr >> 3)) & 0x01;
            break;
        default: 
            break;
    }
    
    // Shift, add feedback, AND zero extra MSb's leaving only "size" number of bits representing lfsr
    lfsr = ((lfsr << 1) | feedback_bit) & ((1 << size) - 1); 
    return lfsr;
}