PRBS array C code generator

Needed an 11 bit PRBS (Pseudo Random Binary Sequence) for use in a project. After some searching online, I came across this sweet wikipedia article on Linear Feedback Shift Registers (LFSRs). This article includes some sample C code to generate a PRBS sequence so I modified this code to generate a sequence that is 2048 bits in length.

// taken from the prbs wikipedia page and modified to make an 11 bit prbs and print to file
// wattnotions april 18th 2015
# include <stdint.h>
# include <stdio.h>
# include <stdbool.h>

bool prbs[2047];

int main(void)
{
uint16_t start_state = 0x7D0;  /* Any nonzero start state will work. */
uint16_t lfsr = start_state;
bool bit;
unsigned period = 0;

FILE *fp;
fp=fopen("test.txt", "w");

fflush( stdout );
do
{
/* taps: 11 and 9; feedback polynomial: x^11 +x^9 + 1 */
bit  = ((lfsr >> 0) ^ (lfsr >> 2) ) & 1;
fprintf(fp, "%d", bit);
lfsr =  (lfsr >> 1) | (bit << 10);
++period;
} while (lfsr != start_state);

}

This 2048 bit sequence in printed as a sequence of 1s and 0s to a .txt file. It looks something like this:
0010010001110110101101011000110001110111101101010010110000110011100111111011110000101001100100011111101……you get the idea

Fairly useless in its current state so some Python magic is required to convert this in to C code.

# opens file containg prbs sequence, parses it into an array of bytes in C code
f = open('Cgen.h', 'w')  # open the file that will hold the generated C code

with open ("test.txt", "r") as myfile:   # open the file containing the prbs 1s and 0s
data=myfile.read().replace('\n', '')

num = 0

f.write('int prbs[] = {\n')
for i in range( ((len(data))//8)  ):

f.write("'0b" + data[i:i+8] +"'")
if( i != (((len(data))//8) -1) ):
f.write(", ")
num = num + 1
if (num == 7):        # print a newline after every 7th element to keep things pretty
f.write("\n")
num = 0

f.write(");")

The output from this python script is saved in a file called Cgen.h . It looks like this:
int prbs[] = {
‘0b00100100’, ‘0b01001000’, ‘0b10010001’, ‘0b00100011’, ‘0b01000111’, ‘0b10001110’, ‘0b00011101’,
‘0b00111011’, ‘0b01110110’, ‘0b11101101’, ‘0b11011010’, ‘0b10110101’, ‘0b01101011’, ‘0b11010110’,
‘0b10101101’, ‘0b01011010’, ‘0b10110101’, ‘0b01101011’, ‘0b11010110’, ‘0b10101100’, ‘0b01011000’,
‘0b10110001’, ‘0b01100011’, ‘0b11000110’, ‘0b10001100’, ‘0b00011000’, ‘0b00110001’, ‘0b01100011’,
‘0b11000111’, ‘0b10001110’, ‘0b00011101’, ‘0b00111011’, ‘0b01110111’, ‘0b11101111’, ‘0b11011110’,

….and so on, then near the end it looks like this:

‘0b10011001’, ‘0b00110010’, ‘0b01100101’, ‘0b11001010’, ‘0b10010101’, ‘0b00101011’, ‘0b01010111’,
‘0b10101111’, ‘0b01011111’, ‘0b10111111’, ‘0b01111110’, ‘0b11111100’, ‘0b11111000’, ‘0b11110000’,
‘0b11100001’, ‘0b11000010’, ‘0b10000100’);

So its just an array definition that can be conveniently hidden away in a header file. There’s a github repo called prbs_C_gen with all of the source files and example output files if you fancy taking a peek.

Leave a Reply

%d bloggers like this: