Fibonacci Linear Feedback Shift Register (Pseudo-Random Number Generator)
Dependents: SDP_K1_Rand FibonacciLFSR_LED_Demo
FibonacciLFSR.cpp@1:a1207d543967, 2016-06-25 (annotated)
- Committer:
- electromotivated
- Date:
- Sat Jun 25 17:03:12 2016 +0000
- Revision:
- 1:a1207d543967
- Parent:
- 0:2038ff2b7de5
Generated Documentation;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
electromotivated | 0:2038ff2b7de5 | 1 | #include "FibonacciLFSR.h" |
electromotivated | 0:2038ff2b7de5 | 2 | #include "mbed.h" |
electromotivated | 0:2038ff2b7de5 | 3 | |
electromotivated | 0:2038ff2b7de5 | 4 | FibonacciLFSR::FibonacciLFSR(LFSR_SIZE_t size){ |
electromotivated | 0:2038ff2b7de5 | 5 | this->size = size; |
electromotivated | 0:2038ff2b7de5 | 6 | this->lfsr_period = (1 << size) - 1; // Number of random numbers |
electromotivated | 0:2038ff2b7de5 | 7 | this->lfsr = 0x0001; |
electromotivated | 0:2038ff2b7de5 | 8 | } |
electromotivated | 0:2038ff2b7de5 | 9 | |
electromotivated | 0:2038ff2b7de5 | 10 | uint16_t FibonacciLFSR::getRandom(){ |
electromotivated | 0:2038ff2b7de5 | 11 | switch (size){ |
electromotivated | 0:2038ff2b7de5 | 12 | case LFSR_2: |
electromotivated | 0:2038ff2b7de5 | 13 | feedback_bit = ((lfsr >> 1) ^ (lfsr >> 0)) & 0x01; |
electromotivated | 0:2038ff2b7de5 | 14 | break; |
electromotivated | 0:2038ff2b7de5 | 15 | case LFSR_4: |
electromotivated | 0:2038ff2b7de5 | 16 | feedback_bit = ((lfsr >> 3) ^ (lfsr >> 2)) & 0x01; |
electromotivated | 0:2038ff2b7de5 | 17 | break; |
electromotivated | 0:2038ff2b7de5 | 18 | case LFSR_8: |
electromotivated | 0:2038ff2b7de5 | 19 | feedback_bit = ((lfsr >> 7) ^ (lfsr >> 5) ^ (lfsr >> 4) ^ (lfsr >> 3)) & 0x01; |
electromotivated | 0:2038ff2b7de5 | 20 | break; |
electromotivated | 0:2038ff2b7de5 | 21 | case LFSR_16: |
electromotivated | 0:2038ff2b7de5 | 22 | feedback_bit = ((lfsr >> 15) ^ (lfsr >> 14) ^ (lfsr >> 12) ^ (lfsr >> 3)) & 0x01; |
electromotivated | 0:2038ff2b7de5 | 23 | break; |
electromotivated | 0:2038ff2b7de5 | 24 | default: |
electromotivated | 0:2038ff2b7de5 | 25 | break; |
electromotivated | 0:2038ff2b7de5 | 26 | } |
electromotivated | 0:2038ff2b7de5 | 27 | |
electromotivated | 0:2038ff2b7de5 | 28 | // Shift, add feedback, AND zero extra MSb's leaving only "size" number of bits representing lfsr |
electromotivated | 0:2038ff2b7de5 | 29 | lfsr = ((lfsr << 1) | feedback_bit) & ((1 << size) - 1); |
electromotivated | 0:2038ff2b7de5 | 30 | return lfsr; |
electromotivated | 0:2038ff2b7de5 | 31 | } |