С кодом (7, 4) все ок, а если добавляю дополнительный бит - проверки всего слова на четность - какой-то косяк...
Допустим, есть dataword: 1010 (d3, d2, d1, d0).
Тогда для него в коде Х. (7, 4) получаем: 1010010 (d3, d2, d1, p2, d0, p1, p0).
Добавляем проверку слова на четность (overall parity, или p3):
11010010
Теперь самое интересное:
предположим, сбой происходит в d3. То есть имеем 10010010.
Вот для этой ситуации не могу понять алгоритма обработки. Не подскажете?
Пишу в виде процедуры на VHDL...
Примерно так:
Код
PROCEDURE Decoding2 ( di: in STD_LOGIC_VECTOR ( 7 downto 0);
SIGNAL decoded : OUT std_logic_vector ( 5 downto 0) ) IS
VARIABLE coded : std_logic_vector ( 7 downto 0 );
VARIABLE syndrome : integer RANGE 0 TO 7;
VARIABLE parity : std_logic_vector ( 3 downto 0 );
VARIABLE parity_in : std_logic_vector ( 3 downto 0 );
VARIABLE syn : std_logic_vector ( 3 downto 0 );
VARIABLE data_in : std_logic_vector ( 3 downto 0 );
VARIABLE P0, P1, xoverallpar : std_logic;
BEGIN
data_in(0) := di(2);
data_in(1) := di(4);
data_in(2) := di(5);
data_in(3) := di(6);
coded := di;
parity_in(0) := di(0);
parity_in(1) := di(1);
parity_in(2) := di(3);
parity_in(3) := di(7);
parity(0) := data_in(0) XOR data_in(1) XOR data_in(3);
parity(1) := data_in(0) XOR data_in(2) XOR data_in(3);
parity(2) := data_in(1) XOR data_in(2) XOR data_in(3);
parity(3) := data_in(0) XOR data_in(1) XOR data_in(2) XOR data_in(3) XOR parity(0) XOR parity(1) XOR parity(2);
-- syndorme generation
syn(2 DOWNTO 0) := parity(2 DOWNTO 0) XOR parity_in(2 DOWNTO 0);
syn(3) := data_in(0) XOR data_in(1) XOR data_in(2) XOR data_in(3) XOR parity_in(0) XOR parity_in(1) XOR parity_in(2);
xoverallpar := syn(3) XOR parity_in(3);
CASE syn(2 DOWNTO 0) IS
WHEN "011" => syndrome := 2; -- number of bit error within
WHEN "101" => syndrome := 4;
WHEN "110" => syndrome := 5;
WHEN "111" => syndrome := 6;
WHEN OTHERS =>syndrome := 7;
END CASE;
IF xoverallpar = '1' THEN
coded(syndrome) := NOT(coded(syndrome));
decoded ( 5 downto 4 ) <= "01"; -- There is an error in 6th bit
ELSIF syndrome/= 7 THEN -- There are more than one error
coded := (OTHERS => '0');-- FATAL ERROR
decoded ( 5 downto 4 ) <= "11";
ELSE
decoded ( 5 downto 4 ) <= "00"; -- No errors detected
END IF;
decoded(0) <= coded(2);
decoded(1) <= coded(4);
decoded(2) <= coded(5);
decoded(3) <= coded(6);
END;
SIGNAL decoded : OUT std_logic_vector ( 5 downto 0) ) IS
VARIABLE coded : std_logic_vector ( 7 downto 0 );
VARIABLE syndrome : integer RANGE 0 TO 7;
VARIABLE parity : std_logic_vector ( 3 downto 0 );
VARIABLE parity_in : std_logic_vector ( 3 downto 0 );
VARIABLE syn : std_logic_vector ( 3 downto 0 );
VARIABLE data_in : std_logic_vector ( 3 downto 0 );
VARIABLE P0, P1, xoverallpar : std_logic;
BEGIN
data_in(0) := di(2);
data_in(1) := di(4);
data_in(2) := di(5);
data_in(3) := di(6);
coded := di;
parity_in(0) := di(0);
parity_in(1) := di(1);
parity_in(2) := di(3);
parity_in(3) := di(7);
parity(0) := data_in(0) XOR data_in(1) XOR data_in(3);
parity(1) := data_in(0) XOR data_in(2) XOR data_in(3);
parity(2) := data_in(1) XOR data_in(2) XOR data_in(3);
parity(3) := data_in(0) XOR data_in(1) XOR data_in(2) XOR data_in(3) XOR parity(0) XOR parity(1) XOR parity(2);
-- syndorme generation
syn(2 DOWNTO 0) := parity(2 DOWNTO 0) XOR parity_in(2 DOWNTO 0);
syn(3) := data_in(0) XOR data_in(1) XOR data_in(2) XOR data_in(3) XOR parity_in(0) XOR parity_in(1) XOR parity_in(2);
xoverallpar := syn(3) XOR parity_in(3);
CASE syn(2 DOWNTO 0) IS
WHEN "011" => syndrome := 2; -- number of bit error within
WHEN "101" => syndrome := 4;
WHEN "110" => syndrome := 5;
WHEN "111" => syndrome := 6;
WHEN OTHERS =>syndrome := 7;
END CASE;
IF xoverallpar = '1' THEN
coded(syndrome) := NOT(coded(syndrome));
decoded ( 5 downto 4 ) <= "01"; -- There is an error in 6th bit
ELSIF syndrome/= 7 THEN -- There are more than one error
coded := (OTHERS => '0');-- FATAL ERROR
decoded ( 5 downto 4 ) <= "11";
ELSE
decoded ( 5 downto 4 ) <= "00"; -- No errors detected
END IF;
decoded(0) <= coded(2);
decoded(1) <= coded(4);
decoded(2) <= coded(5);
decoded(3) <= coded(6);
END;