I have been using a 31 bit prbs function to generate random numbers. I never tested to see if this was of maximum length – guess what – it wasn’t! So after some trial and error I arrived at the following 31 bit prbs function which doesn’t repeat itself until after 2 billion cycles or so and is maximal length
#include <stdio.h>
unsigned prbs()
{
// This is a verified 31 bit PRBS generator on an i3 running 64 bit Fedora Linux
static unsigned long shift_register=0xa5a5a5a5;
unsigned long new_bit=0;
static int busy=0; // need to prevent re-entrancy here
if (!busy)
{
busy=1;
new_bit= ((shift_register >> 27) ^ (shift_register >> 30));
new_bit= ~new_bit;
new_bit = new_bit & 1;
shift_register=shift_register << 1;
shift_register=shift_register | (new_bit);
shift_register=shift_register & 0x7fffffff;
busy=0;
}
return shift_register; // return 31 LSB's
}
void main()
{
unsigned first_run;
unsigned count;
int value;
first_run = prbs();
value=prbs();
while(value != first_run)
{
value=prbs();
//printf("%d\n",value); // uncomment this to see the values (slows things down a lot)
count++;
}
printf("Count = %d\n",count);
}
The “busy” flag is used in the prbs function in case the routine is called from with an interrupt service routine leading to a danger of re-entrancy.