Реферат Курсовая Конспект
Теоретичні положення - раздел Образование, Лабораторна робота №9. Код Хемінга. В Елементах Пам’Яті, Виготовлюваних У Вигляді Напвіпровідникових Віс, А Також...
|
В елементах пам’яті, виготовлюваних у вигляді напвіпровідникових ВІС, а також в процесорах підвищеної надійності використовується оперативний апаратний контроль за допомогою кодів Хемінга. Даний кодом виявляє і виправляє одноразові помилки. Кожній з 2n-1 ненульових комбінацій n-розрядного числа відповідає комбінація з n+k бітів. Значення перевірних бітів отримуються в результаті додавання за модулем 2 значень бітів у деяких визначених інформаційних розрядах, Із загальної кількості 2n-k-1 можливих помилок код Хеммінга може виявити та виправити 2k-1 помилок. Припустімо, що треба передати або обробити 15 різних послідовностей з одиниць та нулів. Без кодування для цього достатньо чотирьох інформаційних бітів (n=4). Потрібну кількість додаткових перевірних бітів k обчислюють з формули 2k-1 =n+k. Звідки визначають кількість перевірних розрядів та кількість одноразових помилок, які можуть бути виявлені та виправлені. У цьому випадку кількість додаткових розрядів k = 3, а кількість одноразових помилок – 2k-1 = 7.
Контрольні біти ki розташовують у послідовності інформаційних бітів uj на позиціях із номерами 2i-1 (табл. 1.).
Таблиця 1. Послідовність контрольних та інформаційних бітів у коді Хеммінга
… | |||||||||||
u11 | … | u6 | u5 | k4 | u4 | u3 | u2 | k3 | u1 | k2 | k1 |
Значення перевірних бітів ki обчислюється додаванням за модулем 2 значень бітів, у двійковому виразі номерів яких наявна одиниця в i-му розряді.
Для обчислення значення k1 потрібно додати за модулем 2 значення бітів із непарними номерами. Це біти на позиціях з номерами 3, 5, 7, 9, 11, 13, 15:
.
Для визначення k2 треба додати за модулем 2 біти, у двійковому виразі
номерів яких наявна одиниця у другому розряді, тобто 3, 6, 7, 10, 11, 14, 15:
Контрольний біт k3 визначається додаванням за модулем 2 бітів, у двійковому виразі номерів яких наявна одиниця у третьому розряді, тобто 5, 6, 7, 12, 13, 14, 15:
.
Аналогічно визначається k4 через біти з номерами: 9,10,11,12,13,14,15:
Визначення та виправлення помилок здійснюється k перевірками. При кожній перевірці додаються за модулем 2 біти послідовності інформаційних та контрольних бітів, двійкові номери яких мають одиницю в першому, другому, третьому і так далі розрядах. Якщо під час передавання не було збою, то результати перевірок дорівнюють нулю. Якщо збій відбувся, то хоча б одна перевірка не дорівнює нулю. У цьому випадку треба сформувати двійковий код з результатів перевірок, який вкаже на розряд, де відбувся збій. Молодший розряд коду результату перевірок формує перша перевірка, старший - остання. Інверсія біта в розряді з одержаним номером виправить помилку.
Приклад. Сформувати код Хеммінга, що виявляє і виправляє одноразову помилку у послідовності:
u4 | u3 | u2 | u1 |
Для формування коду Хеммінга необхідно к = 3 контрольні біти, які мають займати позиції з номерами 1, 2 і 4.
Послідовність з контрольними символами має вигляд:
u4 | u3 | u2 | k3 | u1 | k2 | k1 |
Значення контрольних бітів визначимо як:
Отже, послідовність, закодована за кодом Хеммінга, буде такою: 1100001. Нехай після передачі відбувся збій в одному розряді і прийнята послідовність 1110001.
Перша та друга перевірки дадуть значення 0, а третя - 1:
1.
2.
3.
Код 101, який створюють результати перевірок, вказує, що відбувся збій у п’ятому розряді. Якщо проінвертувати п’ятий розряд, то одержимо виправлену послідовність 1100001.
Лістинг 1. Приклад програми, яка реалізує код Хемінга для передачі повідомлення довжиною 7 бітів та розшифрування отриманого повідомлення кількістю 11 бітів:
uses crt;
const
data_len = 7;
type
PTBlock = ^TBlock;
TBlock = array[1 .. maxint] of byte;
function is_power(x: byte): boolean;
var bits: byte;
begin
bits := 0;
while x > 0 do begin
if (x and $01) = $01 then inc(bits);
x := x shr 1;
end;
is_power := (bits = 1);
end;
procedure print_block(X: PTBlock; const n: byte);
var i: byte;
begin
for i := n downto 1 do begin
if is_power(i) then textcolor(lightred)
else textcolor(lightgray);
write(X^[i]:4);
end;
writeln; textcolor(lightgray);
end;
var
ctrl_bits: byte;
block: PTBlock;
s: string;
check, i, pos: byte;
begin
ctrl_bits := 0;
repeat
inc(ctrl_bits);
until (data_len + ctrl_bits + 1) <= (1 shl ctrl_bits);
writeln('p = ', ctrl_bits);
GetMem(block, (data_len + ctrl_bits)*sizeof(byte));
FillChar(block^, (data_len + ctrl_bits)*sizeof(byte), 0);
Write('sent data [', data_len, '] bits: '); ReadLn(s);
pos := 1;
for i := 1 to data_len do begin
while is_power(pos) do inc(pos);
block^[pos] := (ord(s[data_len - i + 1]) - ord('0')); inc(pos);
end;
check := $00;
for i := 1 to (data_len + ctrl_bits) do
if block^[i] = 1 then check := check xor i;
i := 1;
while check > 0 do begin
block^[i] := (check and $01);
check := check shr 1;
i := 2 * i
end;
print_block(block, (data_len + ctrl_bits));
{ Перевірка правильності }
check := $00;
for i := 1 to (data_len + ctrl_bits) do
if block^[i] = 1 then check := check xor i;
writeln('checking error status [0 = no error]: ', check);
writeln;
Write('received data [', data_len + ctrl_bits, '] bits: '); ReadLn(s);
check := $00;
for i := 1 to (data_len + ctrl_bits) do
if s[(data_len + ctrl_bits) - i + 1] = '1' then check := check xor i;
writeln('checking error status [0 = no error]: ',
(data_len + ctrl_bits) - check + 1);
FreeMem(block, (data_len + ctrl_bits)*sizeof(byte));
ReadLn;
end.
При запуску програми вводиться послідовність бітів, які повинні бути передані. Програма кодує їх з використанням коду Хемінга, і виводить результат – послідовність бітів, яка готова до передачі (при цьому червоним кольором виділені «надлишкові» біти, які не несуть інформації, а використовуються тільки для знаходження (висліджування) помилок).
Потім вводиться рядок бітів, отримана приймачем інформації, і після її аналізу виводиться результат – чи є помилка, і в якому біті. (Біти нумеруються зліва направо)
Діалог програми:
sent data [7] bits: 1110011
1 1 1 1 0 0 1 1 1 1 0
checking error status [0 = no error]: 0
received data [11] bits: 11111011110
checking error status [0 = no error]: 5
– Конец работы –
Эта тема принадлежит разделу:
Теоретичні положення Контрольні біти ki розташовують у послідовності інформаційних бітів uj на позиціях із... ЗАВДАННЯ... Завдання Побудувати код Хемінга Задане число X Довжина розрядної сітки N Кількість контрольних розрядів...
Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Теоретичні положення
Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:
Твитнуть |
Новости и инфо для студентов