---------------------------------------------------------------------- -- HAMMING DECODER (5,2) & (6,3) & (7,4) ---------------------------------------------------------------------- LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.all; entity hamm67dec34 is generic( Nbits : Integer range 2 to 4 := 4); port (code : in std_logic_vector(Nbits+3 downto 0); data : out std_logic_vector(Nbits-1 downto 0); status : out std_logic_vector(1 downto 0) ); end hamm67dec34 ; architecture a of hamm67dec34 is signal syndrom : std_logic_vector(2 downto 0); signal parity, parity_ok, syndrom_nez : std_logic; -- this code was generated by a program of Rolf Schneider begin h2: if Nbits=2 generate -- PARITY ------------------------------------------------------------------- parity <= code( 0) xor code( 1) xor code( 2) xor code( 4) ; parity_ok <= parity xor code(5); -- SYNDROM ------------------------------------------------------------------ syndrom(0) <= code( 0) xor code( 2) xor code( 4) ; syndrom(1) <= code( 1) xor code( 2) ; syndrom(2) <= '0' ; -- CORRECTED DATA ----------------------------------------------------------- data( 0) <= code( 2) xor (syndrom(0) and syndrom(1) and (not syndrom(2)) ); data( 1) <= code( 4) xor (syndrom(0) and (not syndrom(1)) and syndrom(2) ); end generate; h3: if Nbits=3 generate -- PARITY ------------------------------------------------------------------- parity <= code( 0) xor code( 1) xor code( 2) xor code( 3) xor code( 4) xor code( 5) ; parity_ok <= parity xor code(6); -- SYNDROM ------------------------------------------------------------------ syndrom(0) <= code( 0) xor code( 2) xor code( 4) ; syndrom(1) <= code( 1) xor code( 2) xor code( 5) ; syndrom(2) <= code( 3) xor code( 4) xor code( 5) ; -- CORRECTED DATA ----------------------------------------------------------- data( 0) <= code( 2) xor (syndrom(0) and syndrom(1) and (not syndrom(2)) ); data( 1) <= code( 4) xor (syndrom(0) and (not syndrom(1)) and syndrom(2) ); data( 2) <= code( 5) xor ((not syndrom(0)) and syndrom(1) and syndrom(2) ); end generate; h4: if Nbits=4 generate -- PARITY ------------------------------------------------------------------- parity <= code( 0) xor code( 1) xor code( 2) xor code( 3) xor code( 4) xor code( 5) xor code( 6) ; parity_ok <= parity xor code(7); -- SYNDROM ------------------------------------------------------------------ syndrom(0) <= code( 0) xor code( 2) xor code( 4) xor code( 6); syndrom(1) <= code( 1) xor code( 2) xor code( 5) xor code( 6); syndrom(2) <= code( 3) xor code( 4) xor code( 5) xor code( 6); -- CORRECTED DATA ----------------------------------------------------------- data( 0) <= code( 2) xor (syndrom(0) and syndrom(1) and (not syndrom(2)) ); data( 1) <= code( 4) xor (syndrom(0) and (not syndrom(1)) and syndrom(2) ); data( 2) <= code( 5) xor ((not syndrom(0)) and syndrom(1) and syndrom(2) ); data( 3) <= code( 6) xor (syndrom(0) and syndrom(1) and syndrom(2) ); end generate; -- STATUS ------------------------------------------------------------------- syndrom_nez <= syndrom(0) or syndrom(1) or syndrom(2) ; status <= syndrom_nez & parity_ok; -- "00" : everything ok -- "01" : data ok, parity wrong -- "11" : data corrected -- "10" : data wrong, two bit error end;