------------------------------------------------------------------------------------------------------- -- -- University of Heidelberg -- Kirchhoff Institute for Physics -- -- Filename: hamming_enc_dmem.vhd -- Author: Falk Lesser -- Description: -- -- -- Comment: Hamming: (2**m-1, 2**m-1-m); allgemein: (n,k)-Codes mit n Bits, k Informationsstellen -- n-k Pruefstellen. Betrachte: 32 Informationsstellen => m = 6 => (63, 57) Code. -- Kuerze also Code um 25 Stellen in H-Matrix zu (38, 32) Code. -- -- -- 111111111111111111111111111111110000000000000000000000000000000 -- 111111111111111100000000000000001111111111111111000000000000000 -- H = 111111110000000011111111000000001111111100000000111111110000000 streiche die Stellen mit vielen Einsen -- 111100001111000011110000111100001111000011110000111100001111000 -- 110011001100110011001100110011001100110011001100110011001100110 -- 101010101010101010101010101010101010101010101010101010101010101 -- -- -- new -- 11111100000000000000000000000000|100000 -- 00000011111111111111100000000000|010000 -- 00000011111111000000011111110000|001000 -- 11100011110000111100011110001110|000100 -- 10011011001100110011011001101101|000010 -- 01010110101010101010110101011011|000001 -- -- -- -- Hamming Bits sind die Spalten der 6x6 Einheitsmatrix (1,2,4,8,16,32). Verknuepfe dabei -- zeilenweise. -- d=3 => 2 Bit Fehler erkennen ODER 1 Bit Fehler korregieren. -- Deshalb verwende falls notwendig Abstand 4 Code oder Parity -- Konstruktion Abstand 4: kuerze (63,57) Code zu (38,32) und erweitere zu (39,24). -- -- H''= H|0 -- --- -- 111 -- -- -- 11111100000000000000000000000000|1000000 -- 00000011111111111111100000000000|0100000 -- 00000011111111000000011111110000|0010000 -- H''= 11100011110000111100011110001110|0001000 -- 10011011001100110011011001101101|0000100 -- 01010110101010101010110101011011|0000010 -- 1111111111111111111111111111111111111111 -- -- -- -- History: ------------------------------------------------------------------------------------------------------- -- Version | Author | Date | Changes | ------------------------------------------------------------------------------------------------------- -- | lesser |28.01.02 | made | ------------------------------------------------------------------------------------------------------- LIBRARY IEEE; USE IEEE.std_logic_1164.ALL; USE IEEE.std_logic_signed.ALL; -------------------------------------------------------------------------------------------------------- -- ENTITY -------------------------------------------------------------------------------------------------------- entity hamming_enc_dmem is port ( din : in std_logic_vector (31 downto 0); -- data from the device dout : out std_logic_vector (38 downto 0) -- data to instr. memory ); end hamming_enc_dmem; -------------------------------------------------------------------------------------------------------- -- ARCHITECTURE -------------------------------------------------------------------------------------------------------- architecture RTL of hamming_enc_dmem is signal h : std_logic_vector (5 downto 0); begin h(0) <= din( 0) xor din( 1) xor din( 3) xor din( 4) xor din( 6) xor din( 8) xor din(10) xor din(11) xor din(13) xor din(15) xor din(17) xor din(19) xor din(21) xor din(23) xor din(25) xor din(26) xor din(28) xor din(30) ; h(1) <= din( 0) xor din( 2) xor din( 3) xor din( 5) xor din( 6) xor din( 9) xor din(10) xor din(12) xor din(13) xor din(16) xor din(17) xor din(20) xor din(21) xor din(24) xor din(25) xor din(27) xor din(28) xor din(31) ; h(2) <= din( 1) xor din( 2) xor din( 3) xor din( 7) xor din( 8) xor din( 9) xor din(10) xor din(14) xor din(15) xor din(16) xor din(17) xor din(22) xor din(23) xor din(24) xor din(25) xor din(29) xor din(30) xor din(31) ; h(3) <= din( 4) xor din( 5) xor din( 6) xor din( 7) xor din( 8) xor din( 9) xor din(10) xor din(18) xor din(19) xor din(20) xor din(21) xor din(22) xor din(23) xor din(24) xor din(25) ; h(4) <= din(11) xor din(12) xor din(13) xor din(14) xor din(15) xor din(16) xor din(17) xor din(18) xor din(19) xor din(20) xor din(21) xor din(22) xor din(23) xor din(24) xor din(25) ; h(5) <= din(26) xor din(27) xor din(28) xor din(29) xor din(30) xor din(31) ; -- connect the hamming bits dout(0) <= h(0); dout(1) <= h(1); dout(3) <= h(2); dout(7) <= h(3); dout(15) <= h(4); dout(31) <= h(5); dout(2) <= din(0); dout(4) <= din(1); dout(5) <= din(2); dout(6) <= din(3); dout(8) <= din(4); dout(9) <= din(5); dout(10) <= din(6); dout(11) <= din(7); dout(12) <= din(8); dout(13) <= din(9); dout(14) <= din(10); dout(16) <= din(11); dout(17) <= din(12); dout(18) <= din(13); dout(19) <= din(14); dout(20) <= din(15); dout(21) <= din(16); dout(22) <= din(17); dout(23) <= din(18); dout(24) <= din(19); dout(25) <= din(20); dout(26) <= din(21); dout(27) <= din(22); dout(28) <= din(23); dout(29) <= din(24); dout(30) <= din(25); dout(32) <= din(26); dout(33) <= din(27); dout(34) <= din(28); dout(35) <= din(29); dout(36) <= din(30); dout(37) <= din(31); -- blow up to hamming distance d=4 and add an other check bit to detect 2-Bit errors dout(38) <= din(31) xor din(30) xor din(29) xor din(28) xor din(27) xor din(26) xor din(25) xor din(24) xor din(23) xor din(22) xor din(21) xor din(20) xor din(19) xor din(18) xor din(17) xor din(16) xor din(15) xor din(14) xor din(13) xor din(12) xor din(11) xor din(10) xor din( 9) xor din( 8) xor din( 7) xor din( 6) xor din( 5) xor din( 4) xor din( 3) xor din( 2) xor din( 1) xor din( 0) xor h(5) xor h(4) xor h(3) xor h(2) xor h(1) xor h(0); end RTL; -------------------------------------------------------------------------------------------------------- -- CONFIGURATION -------------------------------------------------------------------------------------------------------- -- synopsys translate_off configuration hamming_enc_dmem_CFG of hamming_enc_dmem is for RTL end for; end hamming_enc_dmem_CFG; -- synopsys translate_on