Linear feedback shift register

Als we een sequentie van getallen willen genereren, kunnen we een LFSR (linear feedback shift register) gebruiken. Een LFSR is een shift register, waarbij de inschuivende bit elke klokcyclus gelijk is aan de XOR van een aantal bits in de interne toestand. Op wikipedia staat uitgelegd welke bits er genomen moeten worden bij iedere grootte van LFSR.

Voorbeeld 16 bit LFSR. Bron: Wikipedia
library ieee;
use ieee.std_logic_1164.all;

entity LFSR is
    port(   clk: in std_logic;
            load_data: in std_logic;
            reset: in std_logic;
            data_out: out std_logic_vector(15 downto 0));
end LFSR;

architecture arch_LFSR of LFSR is
    signal shift_register: std_logic_vector(15 downto 0);
begin
    p_comb_reg: process(clk)
    begin
        if clk'event and clk = '1' then
            if reset = '1'  then
                shift_register <= (others => '1'); --we resetten naar 1, anders loopt de LFSR vast
            else
                shift_register(0) <= shift_register(10) XOR shift_register(12) XOR shift_register(13) XOR shift_register(15);
                shift_register(15 downto 1) <= shift_register(14 downto 0);
            end if;
        end if;
    end process;
    data_out <= shift_register;
end arch_LFSR;

Een LFSR gebaseerd op XOR blijft stilstaan als alle bits 0 zijn. Als we dit niet willen kunnen in de plaats XNOR poorten gebruiken. Hierdoor blijft alles stilstaan als alle bits 1 zijn.