реклама на сайте
подробности

 
 
> Код Хемминга (8, 4) - непонятность!, Помогите, пожалуйста!
araglin
сообщение Feb 6 2007, 03:24
Сообщение #1





Группа: Новичок
Сообщений: 3
Регистрация: 27-12-06
Пользователь №: 23 951



Мозг клинит...

С кодом (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;
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 20:08
Рейтинг@Mail.ru


Страница сгенерированна за 0.01336 секунд с 7
ELECTRONIX ©2004-2016