LFSR Counter Generator
Description
LFSR Counter Generator is a command-line application that generates Verilog or VHDL code for an LFSR counter of any value up to 63 bit wide. The code is written in C and is cross-platform compatible
Parameters
language: verilog or vhdl
count : counter value in hex or decimal format, e.g. 1234, 0x1234.
Can be up to 63-bit long, e,g, 0x7fffffffffffffff, although itd take a very long time to generate such a counter.
Output Examples
[1] C:\OutputLogic\lfsr-counter-generator> lfsr-counter-generator
usage:
lfsr-counter-generator language count
parameters:
language: verilog or vhdl
count : counter value in hex or decimal format, e.g. 1234, 0x1234
[2] C:\OutputLogic> lfsr-counter-generator verilog 0x1234
count = 0x1234 num_bits=13
generating...
//-----------------------------------------------------------------------------
// Copyright (C) 2009 OutputLogic.com
// This source file may be used and distributed without restriction
// provided that this copyright statement is not removed from the file
// and that any derivative work contains the original copyright notice
// and the associated disclaimer. --
// THIS SOURCE FILE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS
// OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
// WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
//-----------------------------------------------------------------------------
module lfsr_counter(
input clk,
input reset,
input ce,
output reg lfsr_done);
reg [12:0] lfsr;
wire d0,lfsr_equal;
xnor(d0,lfsr[12],lfsr[3],lfsr[2],lfsr[0]);
assign lfsr_equal = (lfsr == 13'h220);
always @(posedge clk,posedge reset) begin
if(reset) begin
lfsr <= 0;
lfsr_done <= 0;
end
else begin
if(ce)
lfsr <= lfsr_equal ? 13'h0 : {lfsr[11:0],d0};
lfsr_done <= lfsr_equal;
end
end
endmodule
Background
Most of the EE or CS graduates know or at
least have heard about different types of hardware counters: binary,
prescaled, linear feedback shift register (LFSR), and others.
The
majority of logic designers use the first two types, because theyre simple to
implement in Verilog or VHDL. However, for some applications LFSR counters
offer a significant advantage in terms of logic utilization and maximum
frequency.
There is an online LFSR Counter Generator tool is running on the OutputLogic.com server. The time it takes to generate
the code depends exponentially on the counter size. It takes several seconds to
generate a small 24-bit counter.
A stand-alone application can generate much larger LFSR counters orders of magnitude faster than the online tool. The application limits LFSR counter size to 63 bit, but it should cover any practical usage. There is no fundamental problem to extend that. The LFSR counter can be as large as 168 bit, this is the limitation of the LFSR polynomial table in [1].
Here is an example of how the LFSR Counter Generator works:
(1) Specify counter value, e.g. 200. It is 8 bits, so the application selects 8-bit LFSR with polynomial coefficients taken from the table in [1].
(2) Reset LFSR
to 0, run a loop that shifts the LFSR 200 times. Then latch its value
(LFSR_COUNT_VAL).
(3) Use that 8-bit LFSR and LFSR_COUNT_VAL to generate a Verilog
or VHDL code. When the LFSR hits LFSR_COUNT_VAL, it counted 200.
This approach is working because the polynomial selected in (1) has a maximum-length property. That is it generates a sequence of unique values from 0 to 2n-1.
Following is a table that illustrates size differences between a 32-bit LFSR counter and a regular counter synthesized for Xilinx V5 chip.
|
Module |
Slices |
Regs |
LUTs |
|
Regular counter |
17 |
32 |
44 |
|
LFSR counter |
10 |
32 |
7 |
About the Author
Evgeni Stavinov is the creator and main developer of OutputLogic.com. Evgeni has more than 10 years of diverse design experience in the areas of FPGA logic design, embedded software and communication protocols. He holds MSEE from University of Southern California and BSEE from Technion Israel Institute of Technology. For more information contact evgeni@outputlogic.com
About OutputLogic.com
OutputLogic.com is a web portal that offers online tools for FPGA and ASIC designers.
References
[1]
Peter
Alfke, Efficient Shift Registers, LFSR Counters, and Long
Pseudo-Random Sequence Generators,
Xilinx application note Xapp052
[2] Maria George and Peter Alfke, Linear Feedback Shift Registers in Virtex Devices, Xilinx application note Xapp210
[3] Xilinx Linear Feedback Shift Register (LFSR) Logic Core