Смекни!
smekni.com

Разработка устройства кодирования-декодирования 32-х разрядных слов методом Хемминга (стр. 6 из 10)

В качестве простого примера кода с обнаружением ошибок рассмотрим код, в котором к данным присоединяется один бит четности. Бит четности выбирается таким образом, что число битов со значением 1 в кодированном слове четное (или нечетное). Интервал этого кода равен 2, поскольку любая ошибка в битах приводит к кодированному слову с неправильной четностью. Другими словами, достаточно двух ошибок в битах для перехода от одного допустимого кодированного слова к другому допустимому слову. Такой код может использоваться для обнаружения одиночных ошибок. Если из памяти считывается слово, содержащее неверную четность, поступает сигнал об ошибке. Программа не сможет продолжаться, но зато не будет неверных результатов.

В качестве простого примера кода с исправлением ошибок рассмотрим код с четырьмя допустимыми кодированными словами:

0000000000, 0000011111, 1111100000 и 1111111111

Интервал этого кода равен 5. Это значит, что он может исправлять двойные ошибки. Если появляется кодированное слово 0000000111, компьютер знает, что изначальное слово должно быть 0000011111 (если произошло не более двух ошибок). При наличии трех ошибок, если, например, слово 0000000000 изменилось на 0000000111, этот метод недопустим. Представим, что хотим разработать код с m битами данных и г контрольных разрядов, который позволил бы исправлять все ошибки в битах. Каждое из 2r допустимых слов имеет n недопустимых кодированных слов, которые отличаются от допустимого одним битом. Они образуются инвертированием каждого из n битов в n-битном кодированном слове. Следовательно, каждое из 2r допустимых слов требует п+1 возможных сочетаний битов, приписываемых этому слову (п возможных ошибочных вариантов и один правильный). Поскольку общее число различных сочетаний битов равно 2n, то (n+l)2m<2n.

Так как n=m+r, следовательно, (m+r+1)<2г. Эта формула дает нижний предел числа контрольных разрядов, необходимых для исправления одиночных ошибок. В табл. 1.1 показано необходимое количество контрольных разрядов для слов разного размера.

Табл.1.1 — Размерность кода

Размер слова Кол-во контроль разрядов Общий размер % увеличения длины слова
8 16 32 64 128 256 512 4 5 6 7 8 9 10 12 21 38 71 136 265 522 50 31 19 11 6 4 2

Этого теоретического нижнего предела можно достичь, используя метод Ричарда Хэмминга. В коде Хэмминга к слову, состоящему из m битов, добавляется r битов четности, при этом образуется слово длиной m+r битов. Биты нумеруются с единицы (а не с нуля), причем первым считается крайний левый. Все биты, номера которых — степени двойки, являются битами четности; остальные используются для данных. Например, к 16-битному слову нужно добавить 5 битов четности. Биты с номерами 1, 2, 4, 8 и 16 — биты четности, а все остальные — биты данных. Всего слово содержит 21 бит (16 битов данных и 5 битов четности). В рассматриваемом примере будем использовать положительную четность (выбор произвольный). Каждый бит четности проверяет определенные битовые позиции. Общее число битов со значением 1 в проверяемых позициях должно быть четным. Ниже указаны позиции проверки для каждого бита четности:

Бит 1 проверяет биты 1,3,5,7,9,11,13,15,17,19,21.

Бит 2 проверяет биты 2,3,6,7,10, 11, 14,15,18,19.

Бит 4 проверяет биты 4,5,6,7,12,13,14,15,20,21.

Бит 8 проверяет биты 8,9, 10, 11,12,13,14,15.

Бит 16 проверяет биты 16,17,18,19,20,21.

В общем случае бит b проверяется битами b1, b2,..., bj, такими что b1+b2+...+bj=b.

Например, бит 5 проверяется битами 1 и 4, поскольку 1+4-5. Бит 6 проверяется битами 2 и 4, поскольку 2+4=6 и т. д.

На рис. 1.3 показано построение кода Хэмминга для 16-битного слова 1111000010101110. Соответствующим 21-битным кодированным словом является 001011 100000101101110. Чтобы увидеть, как происходит исправление ошибок, рассмотрим, что произойдет, если бит 5 изменит значение из-за резкого скачка напряжения на линии электропередачи. В результате вместо кодированного слова 001011100000101101110 получится 001001100000101101110. Будут проверены 5 битов четности. Вот результаты проверки:

Бит четности 1 неправильный (биты 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21 содержат пять единиц).

Бит четности 2 правильный (биты 2,3,6,7,10,11,14,15,18,19 содержат шесть единиц).

Бит четности 4 неправильный (биты 4,5,6,7,12,13,14,15,20,21 содержат пять единиц).

Бит четности 8 правильный (биты 8,9,10,11,12,13,14,15 содержат две единицы).

Бит четности 16 правильный (биты 16,17,18,19,20,21 содержат четыре единицы).

Общее число единиц в битах 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 и 21 должно быть четным, поскольку в данном случае используется положительная четность. Неправильным должен быть один из битов, проверяемых битом четности 1 (а именно 1,3,5,7,9,11,13,15,17,19 и 21). Бит четности 4 тоже неправильный. Это значит, что изменил значение один из следующих битов: 4,5,6,7,12,13,14,15,20,21. Ошибка должна быть в бите, который содержится в обоих списках. В данном случае общими являются биты 5,7,13,15 и 21. Поскольку бит четности 2 правильный, биты 7 и 15 исключаются. Правильность бита четности 8 исключает наличие ошибки в бите 13. Наконец, бит 21 также исключается, поскольку бит четности 16 правильный. В итоге остается бит 5, в котором и содержится ошибка. Поскольку этот бит имеет значение 1, он должен принять значение 0. Именно таким образом исправляются ошибки.

Рис. 1.3 — Построение кода Хэмминга для слова 1111000010101110с помощью добавления 5 контрольных разрядов к битам данных

Чтобы найти неправильный бит, сначала нужно подсчитать все биты четности. Если они правильные, ошибки нет (или есть, но больше одной). Если обнаружились неправильные биты четности, то нужно сложить их номера. Сумма, полученная в результате, даст номер позиции неправильного бита. Например, если биты четности 1 и 4 неправильные, а 2, 8 и 16 правильные, то ошибка произошла в бите 5 (1+4)


1.4 Код Рида – Соломона

Код Рида-Соломона позволяет скорректировать одну ошибку в одном блоке данных. При его использовании к каждому блоку информации прибавляются дополнительные два элемента X и Y, значение которых находятся исходя из условий:

для трёх единиц информации (байт):байт1 + байт2 + байт3 + X + Y = 0

байт1 + 2 * байт2 + 3 * байт3 + 4 * X + 5 * Y = 0

для расчета конкретных значений X и Y для кодирования трёх байт:

Y = 3 * байт1 + 2 * байт2 + байт3X = -4 * байт1 - 3 * байт2 - 2 * байт3

Теперь для выяснения ошибки и её коррекции применяем следующие расчеты:

Значение_ошибки = байт1 + байт2 + байт3 + X + Y

Так как ранее (до возникновения ошибки) эта сумма была равна 0, то теперь она равна непосредственно значению ошибки, которое достаточно просто вычесть из недоброкачественного байта. В случае если блок принят безошибочно, то Значение_ошибки = 0. Теперь найдём байт который надо исправлять:

N = байт1 + 2 * байт2 + 3 * байт3 + 4 * X + 5 * Y

Номер_ ошибочного_ байта = N / Значение_ ошибки

При реализации этого в реальный алгоритм необходимо обязательно осуществлять проверку на то существует ошибка в блоке или нет, то есть Значение_ошибки = 0 или нет, иначе получаем деление на ноль.

Если необходимо защитить кодом Рида-Соломона блок данных более 3х байт, то формулы расчета корректирующих значений лишь немного изменяются (для 16 байт):

Y = 16 * байт1 + 15 * байт2 + 14 * байт3 + ... + байт16X = -17 * байт1 - 16 * *байт2 - 15 * байт3 - ... - 2 * байт16

Значение_ошибки = байт1 + байт2 + байт3 + ... + X + YN = байт1 + 2 * *байт2 + 3 * байт3 + ... + 16 * байт16 + 17 * X + 18 * Y

Данным кодом неудобно защищать блоки информации менее 4 байт, так как длинна контрольных параметров X и Y должна быть как минимум 4 байта

2 байта (DW) для X и 2 байта на Y, то есть получается. что к блоку данных из 4 байт будет добавлен корректирующий блок из 4 байт.

Но что делать, если возникло две или более ошибок в блоке ?

Как один из признаков возникновения двух ошибок можно считать получения в качестве номер ошибочного байта дробного числа, например если в блоке из нулей встретится 2 единицы (две ошибки), в третьем и четвёртом байтах, то Номер ошибочного байта = 3.5 но если 4 единицы, соответственно в 3, 4 и 5 байтах то Номер ошибочного байта = 4.


2 Разработка стенда контроля передаваемой информации

Для визуализации процесса помехоустойчивого кодирования можно разработать устройство, которое поможет понять принцип работы метода Хэмминга. Кодер – декодер будем разрабатывать на основе ИМС К555ВЖ1.

2.1 Разработка устройства кодирования информации методом Хемминга

Кодер, преобразует 32х битное слово в 38ми разрядный код Хэмминга, после чего слово хранится в памяти или передаётся по шинам и т.д. В процессе передачи или хранения в слове может произойти ошибка, поэтому декодер не просто декодирует слово, но и исправляет единичные ошибки. Процесс кодирования и декодирования можно представить в виде блок-схемы приведенной ниже.