LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.NUMERIC_STD.ALL;
ENTITY e_block_crc32 IS
PORT (
rst: IN std_logic;
clk: IN std_logic;
i_en: IN std_logic;
i_start: IN std_logic;
i_data: IN std_logic_vector( 7 DOWNTO 0);
o_crc: OUT std_logic_vector(31 DOWNTO 0)
);
END ENTITY e_block_crc32;
ARCHITECTURE a_block_crc32 OF e_block_crc32 IS
TYPE t_xor IS ARRAY(7 DOWNTO 0) of std_logic_vector(31 DOWNTO 0);
CONSTANT c_xor: t_xor := (0 => X"77073096",
1 => X"EE0E612C",
2 => X"076DC419",
3 => X"0EDB8832",
4 => X"1DB71064",
5 => X"3B6E20C8",
6 => X"76DC4190",
7 => X"EDB88320");
SIGNAL r_crc: std_logic_vector(31 DOWNTO 0) := X"FFFFFFFF";
SIGNAL n_crc: std_logic_vector(31 DOWNTO 0);
BEGIN
p_next: PROCESS(r_crc, i_en, i_start, i_data)
VARIABLE v_crc: std_logic_vector(31 DOWNTO 0);
VARIABLE v_bits: std_logic_vector( 7 DOWNTO 0);
BEGIN
v_crc := r_crc;
IF i_en = '1' THEN
IF i_start = '1' THEN
v_crc := X"FFFFFFFF";
END IF;
v_bits := v_crc(7 DOWNTO 0) XOR i_data;
v_crc := X"00" & v_crc(31 DOWNTO 8);
FOR i IN 7 DOWNTO 0 LOOP
IF v_bits(i) = '1' THEN
v_crc := v_crc XOR c_xor(i);
END IF;
END LOOP;
END IF;
n_crc <= v_crc;