48 lines
1.0 KiB
VHDL
48 lines
1.0 KiB
VHDL
library IEEE;
|
|
use IEEE.STD_LOGIC_1164.ALL;
|
|
use IEEE.NUMERIC_STD.ALL;
|
|
|
|
--Simple Generic Galois LFSR
|
|
--Copyright (C) 2017 David Shah
|
|
--Licensed under the MIT License
|
|
|
|
entity galois_lfsr is
|
|
generic(
|
|
size : natural := 32;
|
|
polynomial : std_logic_vector := x"80000057";
|
|
init : std_logic_vector := x"2b8e9b90"
|
|
);
|
|
port(
|
|
clock : in std_logic;
|
|
enable : in std_logic;
|
|
reset : in std_logic; --active high sync reset
|
|
data : out std_logic_vector(size-1 downto 0)
|
|
);
|
|
end galois_lfsr;
|
|
|
|
architecture Behavioral of galois_lfsr is
|
|
|
|
signal reg_d : std_logic_vector(size-1 downto 0);
|
|
signal reg_q : std_logic_vector(size-1 downto 0) := init;
|
|
|
|
begin
|
|
|
|
reg_d <= (("0" & reg_q(size-1 downto 1)) xor polynomial) when reg_q(0) = '1' else
|
|
("0" & reg_q(size-1 downto 1));
|
|
|
|
process(clock)
|
|
begin
|
|
if rising_edge(clock) then
|
|
if reset = '1' then
|
|
reg_q <= init;
|
|
else
|
|
if enable = '1' then
|
|
reg_q <= reg_d;
|
|
end if;
|
|
end if;
|
|
end if;
|
|
end process;
|
|
|
|
data <= reg_q;
|
|
end Behavioral;
|