library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; use IEEE.NUMERIC_STD.ALL; library XilinxCoreLib; use XilinxCoreLib.all; entity CRC32 is Port ( Clock: in std_logic; Init : in std_logic; Data : in std_logic_vector(7 downto 0); CRC : out std_logic_vector(31 downto 0) ); end CRC32; architecture Behavioral of CRC32 is -- signals -------------------------------------------- signal ETH_DAT: std_logic_vector(7 downto 0); signal ROM_ADR: std_logic_vector(7 downto 0); signal CRC_VAR: std_logic_vector(31 downto 0); signal CRC_DEL: std_logic_vector(31 downto 0); signal CRC_SFT: std_logic_vector(31 downto 0); signal ROM_DAT: std_logic_vector(31 downto 0); alias CRC_ROM: std_logic_vector(7 downto 0) is CRC_VAR(7 downto 0); component ROM port ( a: in std_logic_vector(7 downto 0); spo: out std_logic_vector(31 downto 0) ); end component; -------------------------------------------- begin -- Latch input data ------------------------------------------- process(Clock, Data) begin if (Clock'event and Clock = '0') then ETH_DAT <= Data; end if; end process; ------------------------------------------- -- Initialize CRC variable ------------------------------------------- process(Clock, Init, CRC_DEL) begin if (Clock'event and Clock='0') then if (Init = '1') then CRC_VAR <= x"FFFFFFFF"; else CRC_VAR <= CRC_DEL; end if; end if; end process; ------------------------------------------- -- Data mapping ------------------------------------------- ROM_ADR <= ETH_DAT xor CRC_ROM; CRC_SFT(31 downto 24) <= x"00"; CRC_SFT(23 downto 0) <= CRC_VAR(31 downto 8); ------------------------------------------- -- ROM data ------------------------------------------- U0: ROM port map ( a => ROM_ADR, spo => ROM_DAT); ------------------------------------------- -- Copy CRC variable ------------------------------------------- process(Clock, CRC_SFT, ROM_DAT) begin if (Clock'event and Clock = '1') then CRC_DEL <= CRC_SFT xor ROM_DAT; end if; end process; ------------------------------------------- -- Final result ------------------------------------------- CRC <= CRC_DEL xor x"FFFFFFFF"; ------------------------------------------- end Behavioral;