Altera Home Page
Literature Licensing
Buy On-Line Download

  Home   |   Products   |   Support   |   End Markets   |   Technology Center   |   Education & Events   |   Corporate   |   Buy On-Line  
  Knowledge Database   |   Devices   |   Design Software   |   Intellectual Property   |   Design Examples   |   mySupport   |   Reference Designs  

 Products
      MAX/MAX II
      Stratix/Stratix GX
      Nios II
  
 Functionality
      Arithmetic
      Memory
      Bus & I/O
      Logic
      Interfaces & Peripherals
      DSP
      Communications
      PLL & Clocking
  
 Design Entry
      Quartus II Project
      Tcl
      VHDL
      Verilog HDL
      C Code Examples
      DSP Builder
      TimeQuest
   On-Chip Debugging
  
 Simulation Tools
      Mentor Graphics ModelSim
      Cadence NCsim
      Synopsys VCS
  
 Legacy Examples
      Graphic Editor
      AHDL
  

Linear Feedback Shift Register

This example instantiates a linear feedback shift register that provides a high-speed counter. Some performance attributes are sacrificed in order to gain the high-speed functionality.

The linear feedback shift register counts through 2^WIDTH-1 states. A state consisting of only 1s is illegal; if the counter contains all 1s, it cannot leave that state unless the counter is cleared or another value is loaded. The maximum width of fast_cnt is 16 so the maximum number of states it can count to is 65535.

The states of the counter are not sequential and the states change depending on the specified counter width. For example, in the Graphic Editor file shown below, the width is set to 4, so the counter goes through the following 15 states: 0000, 0001, 0011, 0111, 1110, 1101, 1011, 0110, 1100, 1001, 0010, 0101, 1010, 0100, and 1000. If the width is set to a different value, then the counter will go through a different sequence of states.

This design should be targeted for a FLEX device. Although it has certain drawbacks when compared to other counters, it will run much faster than an lpm_counter of the same width in a FLEX device.

The Graphic Editor and AHDL files for this example are provided below.

To download the Graphic Editor file, click on the link below with the right mouse button and choose Save Link As from the drop-down list box.

For more information on using this example in your project, go to:
top.gdf
top.gdf
fast_cnt.tdf

INCLUDE "lpm_xor.inc";


PARAMETERS
(
   WIDTH
);

SUBDESIGN fast_cnt
(
   data[WIDTH-1..0]       : INPUT = GND;
   clock                  : INPUT;
   clk_en                 : INPUT = VCC;   -- Clock Enable
   load, aclr             : INPUT = GND;
   q[WIDTH-1..0]          : OUTPUT; 
)

VARIABLE
   counter[WIDTH-1..0] : DFFE;
   
BEGIN
   ASSERT (WIDTH > 1 )
      REPORT "Value of 'Width' must be greater than 1"
      SEVERITY ERROR;

   ASSERT (width <= 16)
      REPORT "Value of 'Width' must be equal to or less than 16"
      SEVERITY ERROR;

   counter[].clk = clock;
   counter[].clrn = !aclr;
   counter[].ena = clk_en;
   
   IF (WIDTH == 2) GENERATE
      IF load THEN counter[] = data[]; ELSE
      counter1 = counter0;
      counter0 = counter0 XNOR counter1;
      END IF;
   END GENERATE;
    IF (WIDTH == 3) GENERATE
      IF load THEN counter[] = data[]; ELSE
      counter[2..1] = counter[1..0];
      counter0 = counter2 XNOR counter1;
      END IF;
   END GENERATE; 
   IF (WIDTH == 4) GENERATE
      IF load THEN counter[] = data[]; ELSE
      counter[3..1] = counter[2..0];
      counter0 = counter2 XNOR counter3;
      END IF;
   END GENERATE;
   IF (WIDTH == 5) GENERATE
      IF load THEN counter[] = data[]; ELSE
      counter[4..1] = counter[3..0];
      counter0 = counter4 XNOR counter2;
      END IF;
   END GENERATE;
    IF (WIDTH == 6) GENERATE
      IF load THEN counter[] = data[]; ELSE
      counter[5..1] = counter[4..0];
      counter0 = counter5 XNOR counter4;
      END IF;
   END GENERATE;
   IF (WIDTH == 7) GENERATE
      IF load THEN counter[] = data[]; ELSE
      counter[6..1] = counter[5..0];
      counter0 = counter6 XNOR counter5;
      END IF;
   END GENERATE;
   IF (WIDTH == 8) GENERATE
      IF load THEN counter[] = data[]; ELSE
      counter[7..1] = counter[6..0];
      
      !counter0 = lpm_xor(counter7, counter5, counter4, counter3) 
               with (LPM_WIDTH = 1, LPM_SIZE = 4);
      END IF;
   END GENERATE;
   IF (WIDTH == 9) GENERATE
      IF load THEN counter[] = data[]; ELSE
      counter[8..1] = counter[7..0];
      counter0 = counter8 xnor counter4;
      END IF;
   END GENERATE;
   IF (WIDTH == 10) GENERATE
      IF load THEN counter[] = data[]; ELSE
      counter[9..1] = counter[8..0];
      counter0 = counter9 XNOR counter6;
      END IF;
   END GENERATE;
   IF (WIDTH == 11) GENERATE
      IF load THEN counter[] = data[]; ELSE
      counter[10..1] = counter[9..0];
      counter0 = counter10 XNOR counter8;
      END IF;
   END GENERATE;
   IF (WIDTH == 12) GENERATE
      IF load THEN counter[] = data[]; ELSE
      counter[11..1] = counter[10..0];
      
      !counter0 = lpm_xor (counter11, counter10, counter7, counter5) 
               WITH (LPM_WIDTH = 1, LPM_SIZE = 4);
      END IF;
   END GENERATE;
   IF (WIDTH == 13) GENERATE
      IF load THEN counter[] = data[]; ELSE
      counter[12..1] = counter[11..0];
      
      !counter0 = lpm_xor (counter12, counter11, counter9, counter8)
               WITH (LPM_WIDTH = 1, LPM_SIZE = 4);   
      END IF;
   END GENERATE;
   IF (WIDTH == 14) GENERATE
      IF load THEN counter[] = data[]; ELSE
      counter[13..1] = counter[12..0];
      
      !counter0 = lpm_xor (counter13, counter12, counter7, counter3)
               WITH (LPM_WIDTH = 1, LPM_SIZE = 4);   
      END IF;
   END GENERATE;
   IF (WIDTH == 15) GENERATE
      IF load THEN counter[] = data[]; ELSE
      counter[14..1] = counter[13..0];
      counter0 = counter14 XNOR counter13;
      END IF;
   END GENERATE;
   IF (WIDTH == 16) GENERATE
      IF load THEN counter[] = data[]; ELSE
      counter[15..1] = counter[14..0];
      
      !counter0 = lpm_xor(counter15, counter14, counter12, counter3) 
               WITH (LPM_WIDTH = 1, LPM_SIZE = 4);
      END IF;
   END GENERATE;
   
	q[] = counter[];
END;

Feedback

Did this information help you?

If not, please log onto mySupport to file a technical request or enhancement.


Altera does not warrant that this solution will work for the customer's intended purpose and disclaims all liability for use of or reliance on the solution.

  Please Give Us Feedback