Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Код Хемминга (8, 4) - непонятность!
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Математика и Физика
araglin
Мозг клинит...

С кодом (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;
InvisibleFed
Цитата
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);


Вот эта сстрочка чего-то мне не понятна. Чего вы в ней пытаетесь сделать?
Все остальные синдромы вычислете вроде верно (проверил). Как я понял вы проверяете не кодовую комбинацию, а кодируемое слово. И, если я ничего не забыл еще, не на "четность" а на "нечетность".

[code]
syn(3):=di(7) xor di(6) xor di(5) xor di(4) xor di(2);
if ( syn(3) = di(7) ) then ... ;--Parity_OK
else ... ;--Fatal_Error
end if;
[quote]

Я бы написал как-нить так. Суть надеюсь уловили.
araglin
Большое спасибо за ответ!
Проблему решил. Действительно, общий бит четности вычислял неправильно - складывал не те биты... Теперь поправил, и все работает как часы smile.gif

p.s. Когда писал оригинальное сообщение в форум, уже начал догадываться, где искать ошибку... Поэтому конец такой скомканный вышел... smile.gif

Цитата(InvisibleFed @ Feb 6 2007, 08:20) *
Цитата

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);


Вот эта сстрочка чего-то мне не понятна. Чего вы в ней пытаетесь сделать?
Все остальные синдромы вычислете вроде верно (проверил). Как я понял вы проверяете не кодовую комбинацию, а кодируемое слово. И, если я ничего не забыл еще, не на "четность" а на "нечетность".

[code]
syn(3):=di(7) xor di(6) xor di(5) xor di(4) xor di(2);
if ( syn(3) = di(7) ) then ... ;--Parity_OK
else ... ;--Fatal_Error
end if;

Я бы написал как-нить так. Суть надеюсь уловили.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.