--=====================================================
-- Проект 27. Генератор псевдослучайной последовательности
-- Регистр сдвига с линейной обратной связью (LFSR):
-- максимальная длина периода при верных отводах.
--=====================================================
library ieee;
use ieee.std_logic_1164.all;

entity lfsr is
    port (
        clk     : in  std_logic;
        rst     : in  std_logic;
        en      : in  std_logic;
        rnd     : out std_logic_vector(15 downto 0);
        bit_out : out std_logic                         -- последовательный выход
    );
end entity lfsr;

architecture rtl of lfsr is
    -- начальное состояние не может быть нулевым, иначе регистр «залипнет»
    signal reg : std_logic_vector(15 downto 0) := x"ACE1";
    signal fb  : std_logic;
begin
    -- отводы 16, 14, 13, 11 дают период 65535
    fb <= reg(15) xor reg(13) xor reg(12) xor reg(10);

    process (clk, rst)
    begin
        if rst = '1' then
            reg <= x"ACE1";
        elsif rising_edge(clk) then
            if en = '1' then
                reg <= reg(14 downto 0) & fb;
            end if;
        end if;
    end process;

    rnd     <= reg;
    bit_out <= reg(15);
end architecture rtl;
