Передача информации по каналу с решающей обратной связью
Способы передачи информации по каналам связи, использование помехоустойчивых кодов. Основные понятия о помехозащищенном кодировании. Модульная структура и работа кодера, декодера и их решателя, выбор их микросхем. Описание текста программы на языке VHDL.
Рубрика | Коммуникации, связь, цифровые приборы и радиоэлектроника |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 24.11.2010 |
Размер файла | 485,8 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
d -- минимальное кодовое расстояние;
r -- число обнаруживаемых ошибок;
s -- число исправляемых ошибок.
имеем 2 варианта:
1) r = 2, s = 1 - обеспечивает обнаружение двух ошибок и исправление одной;
2) r = 3, s = 0 - обеспечивает обнаружение тройных ошибок;
Выбираем вариант 1, так как вариант номер 2 не допустим по ТЗ (нет исправления ошибок).
Имеем алфавит в 256 символов, что потребует 9 разрядов, так как комбинацию 00000000 использовать не будем. Имеем k = 9.
Опеределим число контрольных символов :
n = k + m
Так как k = 9, то
Тогда для :
n = 9 + 5 = 14
Найдём образующий многочлен:
Выберем из таблицы 1.1. Пусть
1.4 Построение образующей матрицы
Из выше полученных расчетов мы знаем, что число информационных символов (бит) равно 9. Следовательно размерность единичной матрицы будет 9. Число проверочных символов m = 5, следовательно получим дополнительную матрицу, имеющую 9 строк и 5 столбцов.
Найдём дополнительную матрицу:
100000000|100111
100111 |------------------------------------------
--------------------
00111000111: 1-й остаток
----------------
01110001110: 2-й остаток
----------------
11100011100: 3-й остаток
100111
--------------
11111011111: 4-й остаток
100111
----------------
11001011001: 5-й остаток
100111
----------------
10101010101: 6-й остаток
100111
----------------
0110101101: 7-й остаток
----------------
11010011010: 8-й остаток
100111
----------------
10011010011: 9-й остаток
100111
----------------
000001
Итак, дополнительная матрица имеет вид:
m5 |
m4 |
m3 |
m2 |
m1 |
|
0 |
0 |
1 |
1 |
1 |
|
0 |
1 |
1 |
1 |
0 |
|
1 |
1 |
1 |
0 |
0 |
|
1 |
1 |
1 |
1 |
1 |
|
1 |
1 |
0 |
0 |
1 |
|
1 |
0 |
1 |
0 |
1 |
|
0 |
1 |
1 |
0 |
1 |
|
1 |
1 |
0 |
1 |
0 |
|
1 |
0 |
0 |
1 |
1 |
Составим образующую матрицу:
k9 |
k8 |
k7 |
k6 |
k5 |
k4 |
k3 |
k2 |
k1 |
m5 |
m4 |
m3 |
m2 |
m1 |
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
0 |
|
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
0 |
0 |
|
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
|
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
|
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
|
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
1 |
|
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
1 |
0 |
|
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
1 |
Нахождение всех комбинаций циклического кода достигается суммированием по модулю 2 всевозможных сочетаний строк образующей матрицы.
1.5 Расчет достоверности передаваемых сообщений
Достоверность - степень соответствия принятой информации переданной. Оценкой достоверности служит вероятность правильного приема, равная отношению числа правильно принятых символов сообщения к общему числу переданных символов.
1. Для симметричного канала с независимыми ошибками.
Согласно ТЗ, P10=P01 =0,5.
Для одиночных ошибок:
Для двух ошибок:
Общая вероятность:
Это означает, что на 1000 переданных символов 7 будут с ошибкой. Тогда для 1000 сиволов достоверность будет 993/1000=0,993 или 99,3%.
2. Для несимметричного канала с независимыми ошибками.
Согласно ТЗ, P10=0,3
P01 =0,7.
Пусть сообщение будет следующим G=11001010101011, а искаженное G1=01101010101011.
Общая вероятность:
Это означает, что на 1000 переданных символов 2 будут с ошибкой. Тогда для 1000 сиволов достоверность будет 998/1000=0,998 или 99,8%.
1.6 Выводы
В данной главе былы освещены теоретические основы для решения технического задания. Были описаны структура и специфика циклических кодов и методов кодирования. Таким образом, была подведена база для последующей реализации поставленной задачи на языке программирования, а также схемной реализации.
2. Техническая реализация кодера, декодера и решателей
2.1 Модульная структура кодера и его работа
Основу кодирующих устройств двоичных циклических кодов составляют регистры сдвига с обратными связями, позволяющие осуществлять как умножение, так и деление многочленов с приведением коэффициентов по модулю 2. Такие регистры также называют многотактными линейными переключательными схемами и линейными кодовыми фильтрами Хаффмена. Они состоят из ячеек памяти, сумматоров по модулю 2 и устройств умножения на коэффициенты многочленов множителя или делителя. В случае двоичных кодов для умножения на коэффициент, равный 1, требуется только наличие связи в схеме. Если коэффициент равен 0, то связь отсутствует. Сдвиг информации в регистре осуществляется импульсами, поступающими с генератора продвигающих импульсов. На вход устройств поступают только коэффициенты многочленов, причем начиная с коэффициента при переменной в старшей степени.
Как указывалось выше, образование циклического кода состоит из двух операций: умножения комбинации обычного двоичного кода G(X) на одночлен Xm и последующего деления этого произведения на выбранный образующий многочлен P(X). Полученные в остатке от деления контрольные символы приписываются к кодируемой комбинации. Таким образом, кодирующее устройство должно совмещать функции умножения и деления.
Рассмотрим методику построения кодирующего устройства. Требуется составить схему кодирующего устройства для многочлена:
P(X)=X5+X2+X+1.
Схематичное изображение кодирующего устройства представлено на рисунке 2.1.
Рис.2.1. Схематичное изображение кодирующего устройства
Схема, изображенная на рис. 2.1, работает следующим образом. В исходном состоянии ключ К1 находится в положении 1, а ключ К2 замкнут. Все подлежащие кодированию информационные символы, начиная со старшего разряда, поступают одновременно на выход и через сумматор на входе в схему кодирования. После того как пройдет последний символ k, ключ К1 переключится в положение 2, а ключ К2 размыкается. После этого регистр делает m шагов, равных числу ячеек, т.е. пять шагов. И весь остаток поступает на выход. Этот остаток представляет собой контрольные символы, следующие за информационными символами.
Рассмотрим подробнее процесс кодирования комбинации
Процесс кодирования комбинации G(X)= 000100000 с помощью кодера на рисунке 2.1, а показан в таблице 2.1.
В тактах 1-3 на вход поступают нули, поэтому в регистре ничего не меняется. Только в такте 4 единица кодируемого записывается в ячейки X0, X1, X2 и поступает на выход. В такте 5 на вход поступает нуль, поэтому в X0 поступает 0, и на выходе тоже 0. Из ячеек X0, X1, X2 единицы перемещаются в ячейки X1, X2, X3.
Аналогично и в такте 6, три единицы перемещаются далее вправо. На такте 7 единица из ячейки X4 поступает на сумматор по модулю 2 и складывается там с 0, поступающим с входа. Тогда, в результате сложения 1 и 0 по модулю 2 получается 1, которая поступает на остальные суммирующие элементы по модулю 2. В итоге во всех ячейках будут записаны 1. В тактах 7, 8, 9 просходит аналогично такту 6.
Таблица 2.1. Образование циклического кода
Номер такта |
Вход |
Состояние ячеек регистра |
Выход |
|||||
X0 |
X1 |
X2 |
X3 |
X4 |
||||
1 2 3 4 5 6 7 8 9 |
0 0 0 1 0 0 0 0 0 |
0 0 0 0 1 0 0 1 1 1 |
0 0 0 0 1 1 0 1 0 0 |
0 0 0 0 1 1 1 1 0 1 |
0 0 0 0 0 1 1 1 1 0 |
0 0 0 0 0 0 1 1 1 1 |
0 0 0 1 0 0 0 0 0 |
|
10 11 12 13 14 |
0 0 0 0 0 |
1 0 0 0 0 |
0 1 0 0 0 |
1 0 1 0 0 |
0 1 0 1 0 |
1 0 1 0 1 |
После такта 9 остаток R(X) оказывается записанным в ячейках регистра. После переключения ключа K1 в положение 2 и выключения ключа K2 этот остаток в последующие четыре такта переписывается на выход вслед за информационными символами.
2.2 Модульная структура декодера и его работа
Декодирование циклического-кода с обнаружением и исправлением нескольких ошибок. Метод такого декодирования был изложен в теоретическом введении. Рассмотрим теперь схемную реализацию декодирования комбинации 10000000010011, искаженную одним символом и принявшей вид 10010000010011. Декодер (рис.2.2) состоит из делителя, выполненного для деления на многочлен P(X)=X5+X2+X+1, и запоминающего устройства, представляющего собой регистр с сумматором символов k. Комбинация поступает одновременно на делитель и запоминающее устройство начиная со старшего разряда. Искаженный символ в комбинации отмечен почеркиванием. Вначале ключ K1 замкнут, а ключ К2 разомкнут. В таблице 2.2 показан процесс деления начиная с такта 6, так как в первые пять тактов происходит заполнение делителя и обратная связь еще не проявляется.
Рис. 2.2. Сруктурная схема декодирования циклического кода с исправлением одной ошибки.
В такте 6 единица с Х4 поступает на сумматоры по модулю 2, и в X0 записывается единица, нуль, находившийся в X0, сложившийся с единицей даст 1 и она запишется в X1 , единица из X1 сложившись с 1 даст нуль и этот нуль запишется в X2, нуль из X2 перейдёт в X3, а единица из X3 в X4. Далее аналогично.
Таблица 2.2. Работа делителя
Номер такта |
Делимое |
Состояние ячеек делителя |
Вес остатка |
|||||
X0 |
X1 |
X2 |
X3 |
X4 |
||||
6 7 8 9 10 11 12 13 14 15 16 17 18 |
0 0 0 0 1 0 0 1 1 |
1 0 0 0 0 1 0 0 1 1 0 1 1 |
1 1 0 0 1 1 1 1 0 0 1 1 0 |
0 1 1 0 1 0 1 0 1 1 0 0 0 |
0 0 1 1 0 1 0 1 0 1 1 0 0 |
0 0 0 1 1 0 1 0 1 0 1 1 0 |
3 3 3 3 1 |
В такте 14 синдром (остаток от деления) оказывается записанным в ячейках регистра (10101). Однако его вес W=3 больше числа исправляемых ошибок s, поэтому делитель делает еще один шаг (такт 15), в процессе которого снова осуществляется деление на многочлен Р(Х). Синдром 10110 опять имеет вес W=3. Только после 18 такта W=1=s. В этот момент ключ К1 размыкается, а ключ К2 замыкается и синдром с делителя начинает поступать на сумматор запоминающего устройства, у которого ключ К3 замкнут, а ключ К4 разомкнут.
Это устройство в такте 14 первого этапа полностью заполнилось, а на втором этапе его работы начался циклический сдвиг записанной информации (таблица 2.3). Так в такте 1 единица из ячейки X8 информационных символов переместилась в ячейку X0 контрольных символов m. В такте 2 эта единица передвинулась в ячейку X1, а ее место в ячейке занял следующий нуль и т. д.
Таблица 2.3. Работа ЗУ декодера
Номер такта |
Символы m |
Символы k |
|||||||||||||
X0 |
X1 |
X2 |
X3 |
X4 |
X0 |
X1 |
X2 |
X3 |
X4 |
X5 |
X6 |
X7 |
X8 |
||
14 1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
1 1 0 0 1 0 0 0 0 0 1 0 0 1 1 |
1 1 1 0 0 1 0 0 0 0 0 1 0 0 1 |
0 1 1 1 0 0 1 0 0 0 0 0 1 0 0 |
0 0 1 1 1 0 0 1 0 0 0 0 0 1 0 |
1 0 0 1 1 1 0 0 1 0 0 0 0 0 1 |
0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 |
0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 |
0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 |
0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 |
0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 |
1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 |
0 1 0 0 0 0 0 1 0 0 1 1 1 0 0 |
0 0 1 0 0 0 0 0 1 0 0 1 1 1 0 |
1 0 0 1 0 0 0 0 0 1 0 0 1 1 1 |
Первые четыре нуля синдрома, поступающие на сумматор, не влияют на работу запоминающего устройства. Лишь в такте 9 единица синдрома, складываясь по модулю 2 с ошибочной единицей символов k (обозначена подчеркиванием), «уничтожают» её, т. е. исправляют ошибку. Регистр запоминающего устройства продолжает переключаться до окончания второго цикла (этапа) его работы. После такта 14 ключи К2 и К3 размыкаются, а ключи К1 и К4 замыкаются: начинается считывание исправленной комбинации и одновременная запись новой.
Таким образом, декодирование состоит их двух этапов. На первом этапе осуществляются нахождение остатка и запись кодовой комбинации, на втором -- ее исправление и расстановка символов k и m на свои места.
2.3 Модульная структура решателя кодера и его работа
Решатель кодера должен выполнять следующие задачи: обеспечить связь с передающим устройством, передачу сигналов задержек при исправлении ошибок и повторных передачах информации. Также должен выполнять свою основную функцию - приём сигнала продолжения. Структурная схема решателя приведена на рисунке 2.3.
Рис. 2.3. Сруктурная схема решателя кодера.
Рассмотрим все случаи более подробно.
1. Сообщение проходит без ошибок. Решатель принимает сигнал продолжения (F_NXT). Ключ Кр открывается и начинает поступать следующее сообщение. Так как длина сообщения составляет 9 символов, то в конце такта 9 ключ Кр размыкается, и на передающее устройство поступает сигнал ожидания посылки сообщения (WAIT14). Далее решатель начинает ожидать сигнал продолжения.
2. Сообщение прошло с ошибкой. Пусть искажение произошло только в одном символе. Тогда решатель на 14 такте не получает сигнал продолжения. Ключ Кр размыкается. Решатель посылает сигнал ожидания на передатчик в течение 14 тактов (этап 2). За это время искаженная комбинация исправляется, и с решателя декодера приходит сигнал продолжения, Кр замыкается.
3. Сообщение содержит более одной ошибки. Всё происходит аналогично пункту 2, за исключением того, что и после 14 такта второго этапа ожидания он не получает сигнал продолжения и ключ Кр остается разомкнутым. Тогда ещё в течение 14 тактов (этап 3) решатель посылает на передатчик сигнал ожидания (WAIT14), но на кодер посылается сигнал повтора сообщения из буфера (RPT_CODE).
2.4 Модульная структура решателя декодера и его работа
Решатель декодера должен выполнять следующие функции: он должен после принятия сообщения декодером определить, есть ли ошибки в сообщении, если их нет, то отправить сигнал продолжения (F_NXT), в противном случае попытаться исправить ошибку и если ошибка не будет исправлена, то «отправить» сигнал повтора, вернее не отправить сигнал продолжения.
Структурная схема решателя декодера приведена на рисунке 2.4.
Определение ошибки заключается в нахождении остатка от деления R(X). Если остаток равен 0, в случае данной работы (00000), то сообщение было принято без ошибок, и посылается сигнал продолжения (F_NXT).
Если остаток будет иметь вес равный 1, то есть это следующие комбинации: 10000, 01000, 00100, 00010, 00001, тогда ошибка исправима, а значит не потребуется повтора передачи. После исправления ошибки будет послан сигнал продолжения.
Рис. 2.4. Сруктурная схема решателя декодера.
Если вес остатка будет больше 1, то исправление ошибки невозможно и решатель отправляет сигнал повтора (сигнал F_NXT = 0).
Входы R1…R5 подключаются к регистру делителя, а выходы (NXT, ERCOR) на блок коррекции ошибок.
2.5 Выбор микросхем для реализации кодера, декодера и решателей
Согласно технического задания кодер, декодер и решатели выполняются на ПЛИС (программируемые логические интегральные схемы). ПЛИС являются наиболее перспективными элементами, так как они вполне могут заменить десятки и сотни микросхем старых типов. Они может немного и уступают им по скорости, но в современных микросхемах этот недостаток практически устранен. Однако ПЛИС обладают огромным преимуществом перед обычными логическими схемами, что отражено в их названии «программируемые». Это означает, что теперь, легко производить модернизацию схем, так как при незначительной переработке какого-либо устройства, достаточно с помощью специального оборудования (программаторов) перезаписать ПЛИС. А при сборке на обычных элементах, может потребоваться полная переработка схемы, вплоть до изменения печатной платы и т.п., что значительно повысит расходы на перепроектирование схемы. Или легко будет в кодере/декодере использовать более сложные или наоборот более простые алгоритмы кодирования, в зависимости от помех, возникающих в линии связи.
Поэтому использование ПЛИС очень удобно в подобных системах передачи данных.
Ещё одним плюсом ПЛИС является компактность устройств, а также меньшее количество соединений на плате, что в свою очередь повышает надёжность устройства.
Важным достоинством ПЛИС является также создание собственных логических элементов на языках AHDL, VHDL и на уровне временных диаграмм. Например, решатель декодера был реализован именно на языке VHDL, текст программы которого приведен в приложении.
В данной работе были выбраны ПЛИС фирмы Altera. Кодер, декодер и решатели были смоделированы на ЭВМ с помощью специальной программы MAX+plus II фирмы Altera. Использование программы моделирования MAX+plus II позволило очень быстро спроектировать рабочие варианты кодера, декодера и решателей, а также смоделировать их работу.
Были выбраны следующие микросхемы: серии MAX 7000: EPM7032LC44-6 - на них реализован кодер и решатель, и серии MAX 9000: EPM9320LC84-15 - на ней реализован декодер и решатель. Для декодера была выбрана более «емкая» микросхема, так как, схема декодера гораздо сложнее схемы кодера, это также позволит в будущем реализовывать на ней и более сложные декодирующие устройства, например для кода с кодовым расстоянием более 5 (коды БЧХ), которые широко применяются в настоящее время, а кодер реализуется намного проще, что позволило применить менее «емкую» микросхему.
Выбор моделей микросхем.
Для реализации кодера, декодера и решателей нам понадобятся следующие элементы: ИЛИ (2, 3, 4, 6, 8, 12 входовые), И (2, 6 входовые), НЕ, 4-х разрядный счетчик типа 7493, двоично-десятичный дешифратор, D, RS и T - триггеры, 2-х входовое исключающее ИЛИ (XOR), решатель декодера, мультиплексор на 2 канала.
Опишем кратко каждый элемент.
1. ИЛИ. Выход равен 0, только когда все входы нулевые.
X1X2Y
000
011
101
111
2. И. Выход равен единице, только когда все входы равны 1.
X1X2Y
000
010
100
111
3. НЕ. Отрицание
X1Y
01
10
4. Счетчик.
Представляет собой двоичный четырехразрядный счетчик. Выход QA должен быть соединен со входом CLKB. CLKA подключается к генератору тактовых импульсов (ГТИ).
Счет Выходы
QAQBQCQD
00000
10001
20010
30011
40100
50101
60110
70111
81000
91001
101010
111011
121100
131101
141110
151111
Если RO1 и RO2 одновременно равны 1, то происходит сброс счетчика в 0, при любых других комбинациях RO1 и RO2 счетчик будет считать.
5. Двоично-десятичный дешифратор 4 входа - 16 выходов.
Входы A, B, C, D, выходы Q0-Q15. Преобразует двоичный код в десятичный.
Входы Выходы
D C B A Q15 Q14 Q13 Q12 Q11 Q10 Q9 Q8 Q7 Q6 Q5 Q4 Q3 Q2 Q1 Q0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
0 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
6. Триггеры.
RS-типа.
Работа триггера. При CLRN = 0 происходит установка триггера в 0, независимо от входа CLK, то есть Q = 0 (очистка).
Входы | Выход
CLRN CLK S R | Q
1 0 x x | хранит
1 0>1 0 0 | хранит
1 0>1 1 0 | 1
1 0>1 0 1 | 0
1 0>1 1 1 | запрещено
D-типа.
Работа триггера. При CLRN = 0 происходит установка триггера в 0, независимо от входа CLK, то есть Q = 0 (очистка).
Входы | Выход
CLRN CLK D | Q
1 0 x | хранит
1 1 x | хранит
1 0>1 1 | 1
1 0>1 0 | 0
6. Элемент исключающее ИЛИ (2х входовое).
Когда входы одинаковы, на выходе 0, если разные, то 1.
X1X2Y
000
011
101
110
7. Решатель декодера.
Представляет собой обыкновенный двоично-десятичный дешифратор на 5 входов - 32 выхода и шестивходовой элемент ИЛИ.
На вход подается остаток от деления. Если он равен 0, то активизируется выход Q0 (это соответствует сигналу NXT - ошибок нет), если вес остатка равен 1, то активны Q1, Q2, Q4, Q8, Q16 (это соответствует сигналу ERCOR - ошибка исправима).
8. Мультиплексор на два канала.
Выполняет роль коммутатора каналов. Используется как в кодере, так и в декодере.
Входы |Выход
S A B |Y
0 х 1 |1
0 х 0 |0
1 1 х |1
1 0 х |0
2.6 Описание функциональной схемы кодера и решателя кодера
Работа кодера и решателя кодера была описана выше. Поясним некоторые моменты.
При начале передачи передатчик начинает посылать новый пакет сообщений. Сначала посылается сигнал очистки памяти кодера и решателя (CLRN = 0). Затем он становится равен 1.
Далее начинает передаваться сообщение № 1 на вход решателя кодера (INF_IN), состоящее из 9 символов. Оно поступает на ключ Кр, который выполнен на элементах DD1.21 и DD1.22. Одновременно оно поступает и на кодер через ключ К2, реализованный на элементах DD2.13 и DD2.14.
В кодере предусмотрен буфер на 14 бит, в который записывается закодированное сообщение. Это позволит на аппаратном уровне осуществлять повтор сообщения, не «отвлекая» передатчик, в роли которого выступает ЭВМ. Это позволит при ошибках, не прерывать другие задачи, которые могут выполняться на данной ЭВМ и использовать её только в качестве источника информации, не нагружая дополнительными задачами. Можно было его сделать и на 9 бит, но емкость примененной микросхемы позволяет применить и 14 битный буфер. Буфер управляется ключами, которые выполняют необходимые коммутации, соединение с кодером, запись уже закодированного сообщения и т.п. Ключи реализованы на элементах DD2.4, DD2.3, DD2.2, DD2.34 и DD2.35. Элементы памяти выполнены на триггерах D-типа (элементы DD2.20 - DD2.33).
Отсчет количества бит сообщения производится с помощью счетчиков: DD1.9, DD1.17 - в решателе кодера и DD2.16 - в кодере.
Делитель предназначен для получения контрольных символов. Его работа была рассмотрена выше. Он выполнен на элементах DD2.5 - DD2.12.
Дешифратор и другие логические элементы используются для работы ключей и включения/выключения каналов передачи.
2.7 Описание функциональной схемы декодера и решателя декодера
Работа декодера и решателя декодера была описана выше. Поясним некоторые моменты.
При приеме первого сообщения пакета посылается сигнал очистки памяти кодера и решателя (CLRN = 0). Затем он становится равен 1.
Далее начинает приниматься сообщение № 1 на вход делителя и в память декодера (INFA), состоящее из 14 бит. Оно поступает на сумматор по модулю 2, который выполнен на элементе DD1.1 и соответственно оно поступает и в ОЗУ декодера. Память предназначена для хранения полученного сообщения.
Отсчет количества бит сообщения производится с помощью счетчиков: DD1.16, DD1.23.
Делитель предназначен для получения остатка от деления. С выходов делителя на дешифратор DD1.12 поступает остаток, соответственно при остатке с весом 0 посылается сигнал продолжения (NXT). Если вес остатка равен 1, то посылается сигнал ERCOR (ошибка исправима). Делитель выполнен на элементах DD1.1 - DD1.8.
Дешифратор (DD1.32) и другие логические элементы используются для работы ключей и включения/выключения каналов передачи.
2.8 Описание принципиальной схемы кодера и решателя кодера
Полученные кодер и решатель представляет собой микросхемы, с функциями, которые были описаны в функциональной схеме.
В итоге имеем две микросхемы, одна из них выполняет функции решателя, а другая функции кодера.
У решателя имеются следующие входы:
INF_IN - информационный;
CLRN - очистка памяти решателя;
CLK - вход генератора тактовых импульсов;
F_NXT - принимает сигнал о продолжении;
И имеются следующие выходы:
INF_OUT - информационный выход;
RPT_CODE - сигнал повтора;
WAIT14 - сигнал приостановки посыла информации с передатчика;
Далее идут выходы, которые несут чисто информационный характер для показа внутренней работы микросхемы и непосредственно не используются:
RES_CO - сигнал сброса счетчиков;
CN1…CN5 - разряды счетчика решателя;
Далее рассмотрим кодер.
Входы:
RPT - прием сигнала RPT_CODE;
CLRN - очистка памяти кодера;
CLK - вход генератора тактовых импульсов;
INFA - информационный вход;
Выход один, это OUT - посыл закодированного сообщения либо в линию связи (ЛС), либо на модулятор (в зависимости от вида устройства: если ЛС аналоговая, то на модулятор, если цифровая, то непосредственно в ЛС).
Также имеется разъем для соединения с ЛС и передающим устройством, а также для подвода питания.
Опишем работу полученного устройства.
Решатель.
Пусть с передатчика пришло сообщение 011001010. Сигнал F_NXT=0. Всё это время сигнал очитки памяти выключен (CLRN = 1). На такте 9, счетчик досчитает до 8 (01000), так как он начинает считать с нуля. За эти девять тактов всё полученное сообщение поступает на выход INF_OUT. После девятого такта включается сигнал WAIT14, потому что необходимо ещё закодировать сообщение.
Кодер кодирует сообщение, и посылает в течение 5 тактов пять контрольных символов. Допустим в декодер сообщение поступило с ошибкой. Сигнал F_NXT не пришел, то есть F_NXT=0 в течение всех 14 тактов. Тогда счетчик считает далее до 27 (11011), и всё это время на передатчик поступает сигнал приостанова посылки сообщения, так как идёт попытка исправления искаженного сообщения в декодере.
Пусть в декодере сообщение не исправилось, тогда сигнал F_NXT не приходит, то есть опять F_NXT=0. И соответственно после 9 такта на информационный выход ничего не поступает. Не получив на 28 такте сигнала F_NXT решатель сбрасывает счетчик решателя RES_CO=1, и послав на передатчик сигнал приостанова, отправляет на кодер сигнал повтора RPT_CODE = 1.
С буфера кодера в течение 14 тактов сообщение заново посылается в ЛС.
Пусть теперь сообщение в декодере было принято без ошибок. На 14 такте приходит сигнал F_NXT, решатель снова сбрасывает счетчик и принимает новое сообщение с передающего устройства, предварительно сбросив сигнал WAIT14 в нуль.
Соответственно далее всё происходит подобным образом. Более подробно работа решателя приведена в приложении на временной диаграмме.
Кодер.
Пусть с решателя кодера пришло сообщение 011001010. Сигнал повтора сообщения RPT_CODE=0. Всё это время сигнал очитки памяти выключен (CLRN = 1).
Кодер в начале первые 9 тактов просто выводит сообщение на выход. Одновременно оно записывается в память кодера. Затем посылает в течение 5 тактов пять контрольных символов. Допустим с решателя кодера поступает сигнал повтора посылки сообщения RPT_CODE=1. Тогда в течение 14 тактов кодер уже из памяти отсылает в ЛС (вывод OUT) сообщение заново.
Соответственно далее всё происходит подобным образом. Более подробно работа решателя приведена в приложении на временной диаграмме.
2.9 Описание принципиальной схемы декодера и решателя декодера
Полученные декодер и решатель представляет собой микросхему, с функциями, которые были описаны в функциональной схеме.
В итоге имеем микросхему, которая выполняет функции решателя и декодера.
У ней имеются следующие входы:
INFA - информационный;
CLK - вход генератора тактовых импульсов;
И имеются следующие выходы:
OUT - информационный выход;
F_NXT - посыл сигнала о продолжении передачи;
Далее идут выходы, которые несут чисто информационный характер для показа внутренней работы микросхемы и непосредственно не используются:
F_ERCOR - сигнал об исправимости искаженного сообщения;
ERCOR - промежуточный сигнал об исправимости искаженного сообщения;
CLRN_OUT - сигнал очистки памяти декодера;
ТТК34 - управление ключами;
RES_CO - сигнал сброса счетчиков;
CN1…CN5 - разряды счетчика декодера;
Также имеется разъем для соединения с ЛС и передающим устройством, а также для подвода питания.
Опишем работу полученного устройства.
1. Пусть из ЛС (INFA) поступило сообщение 01100000010111. Всё это время сигнал очистки памяти выключен (CLRN_OUT = 1). На 14 такте проверяется остаток от деления. Он получился равным 0, так как в конце 14 такта появляется сигнал NXT. Это означает, что сообщение принято без ошибок, поэтому вырабатывается импульс F_NXT и поступает в обратный канал, и RES_CO, который сбрасывает счетчик в нуль.
2. Теперь рассмотрим исправление ошибки. Допустим поступило искаженное сообщение 01000000010111. Искаженный символ отмечен подчеркиванием. До 14 такта всё происходит аналогично пункту 1, но на 14 такте нет сигнала NXT, что означает ненулевой остаток. Также и сигнал ERCOR (ошибка исправима) не равен 1, поэтому происходят циклические сдвиги сообщения в памяти декодера и происходит деление. Вот на такте 17 появляется сигнал ERCOR = 1. И появляется сигнал F_ERCOR (для дальнейшего срабатывания NXT). На такте 22 сообщение исправляется и появляется сигнал NXT. И соответственно на 28 такте появляется импульс F_NXT и RES_CO.
Далее в следующие 14 тактов происходит отправка исправленного сообщения на выход в приемник 01100000010111 (OUT) и одновременное чтение следующего сообщения.
3. И теперь самый «плохой» случай, когда искажения более, чем в одном символе, то есть сообщение нельзя будет исправить. Пусть на вход поступило следующее сообщение: 11000000010111
До 28 такта всё аналогично пункту 2, за исключением того, что не появляются сигналы NXT, ERCOR и соответственно F_NXT, F_ERCOR. На 28 такте происходит сброс счетчика, очистка памяти CLRN_OUT = 0 и чтение сообщения заново (так как на решатель кодера не приходит импульс F_NXT).
Соответственно далее всё происходит подобным образом. Более подробно работа решателя приведена в приложении на временных диаграммах.
2.10 Выводы
В данной главе представлено описание работы кодирующего, декодирующего и решательных устройств, их функциональное изображение. Приведено их описание, а также представлен набор микросхем, используемых для реализации принципиальных схемы кодера с решателем и декодера с решателем.
3. Описание программных средств, разработанных в ходе реализации проекта
3.1 Структура системы
Для решения задачи был применен наиболее простой подход. Был взят наиболее простой язык высокого уровня Паскаль.
Для данной разработки в программе должны содержаться массивы для хранения требуемых для работы переменных:
Для конкретной реализации в программе должны содержаться массивы для хранения требуемых для работы алгоритма переменных: CODE - массив разрядов, входящих в сообщение, должен вводиться пользователем (9 разрядов - информационные). И массив G_CODE для закодированного сообщения (9 разрядов - информационные, 5 разрядов - проверочные).
Проект также должен содержать справку об авторе, о назначении данной программы, а также о том, как с ней работать.
3.2 Входные данные, форма представления результатов
Входными данными является код, который вводит пользователь. Код вводится следующим образом: имеется 9 символов, по умолчанию они нули. С помощью курсорных клавиш перемещается курсор по символам и при нажатии клавиши пробел значение символа меняется на противоположное, то есть 1 на 0, а 0 на 1.
Результаты приведены в виде закодированного сообщения с помощью циклического кода (14,9).
3.3 Спецификация на программу в целом.
Программа выполняет следующие функции:
1. Кодирование кодовой последовательности с помощью циклического кода (14,9);
2. Вывод закодированного сообщения (информационные и контрольные символы);
3. Возможность пользователя «искажать» закодированное сообщение для дальнейшего декодирования;
4. Декодирование закодированного сообщения и исправление ошибок в искаженном сообщении.
Итак, входные данные:
Code:Array[1..k]Of Boolean; - массив начальной кодовой комбинации;
Выходные данные:
G_Code:Array[1..n]Of Byte; - закодированная кодовая комбинация;
Константы:
a:Array[1..k,1..n]Of Byte=((0,0,0,0,0,0,0,0,1,0,0,1,1,1),
(0,0,0,0,0,0,0,1,0,0,1,1,1,0),
(0,0,0,0,0,0,1,0,0,1,1,1,0,0),
(0,0,0,0,0,1,0,0,0,1,1,1,1,1),
(0,0,0,0,1,0,0,0,0,1,1,0,0,1),
(0,0,0,1,0,0,0,0,0,1,0,1,0,1),
(0,0,1,0,0,0,0,0,0,0,1,1,0,1),
(0,1,0,0,0,0,0,0,0,1,1,0,1,0),
(1,0,0,0,0,0,0,0,0,1,0,0,1,1)); - образующая матрица;
stepen=6; - степень образующего многочлена=6, т.к. порядковый номер степени начинаем отсчитывать не с 0, а с 1;
Polynom:Array[1..stepen]Of byte=(1,0,0,1,1,1); - образующий многочлен.
3.4 Системные требования
Минимальные:
Процессор: 80486-33
Память: 4 Mb RAM
Видеопамять: 512Kb DRAM
Свободное место на жестком магнитном диске: 1 Mb
Операционная система: DOS 3.30 или выше.
3.5 Спецификация на программу в целом.
Программа соответствует требованиям технического задания. Она успешно кодирует, декодирует и исправляет введенную двоичную последовательность при помощи кодов. Созданный удобный дружественный интерфейс - понятен и прост. Кроме того комментарии позволяют быстро разобраться в программе и при необходимости внести в нее поправки.
В программе широко использовались элементы технологии TOP-DOWN.
Процедуры написанные для данной программы могут быть в дальнейшем использоваться в других программах.
4. Результативная часть
4.1 Тестирование
Тестирование - это процесс, посредством которого проверяется правильность программы. Его цель - показать, что программа правильно работает в соответствии с проектными спецификациями.
При тестировании проверялась работа каждого модуля в отдельности, а также всей программы в целом. Было проведено несколько тестирований, после каждого из которых проводилась доработка программы и устранение ошибок. Тестирование проводилось из расчета на то, программой могут пользоваться неопытные пользователи, которые непредсказуемы в работе с программой.
На первом этапе тестирования вводилось несколько новых данных, и с ними проводились различные операции. Результаты этого тестирования показали правильную работу модуля, обеспечивающего ввод данных (проверялась защита от некорректного ввода и запоминание данных в память),
Результаты тестирования показали устойчивую работу программы .
Тестирование показало, что программа полностью соответствует техническому заданию. Верно разработаны алгоритмы и реализованы процедуры кодирования, декодирования и исправления ошибок.
При тестировании мы получили следующие примеры выполнения программы и алгоритма, что подтверждает правильность задания программы (в данном случае применялся метод черного ящика):
Приведем тестовую таблицу с введенными кодами, закодированными последовательностями, то есть покажем соответствие между входными и выходными данными.
Таблица 4.1. Тестирование программы
Введенный код |
Код с проверочными символами |
Передаваемый код |
Декодированный код |
|
101010101 |
10101010111100 |
11101010111100 |
10101010111100 |
|
010000001 |
01000000111101 |
01000000111001 |
01000000111101 |
|
010100000 |
01010000001111 |
01010000000011 |
невозможно декодировать |
|
111111110 |
11111111000101 |
11111111000101 |
11111111000101 |
4.2 Описание пользовательского интерфейса
После запуска программы на экране появляется меню, содержащее 4 пункта:
1. Кодировка
2. Помощь
3. О программе
4. Выход
После активации пункта номер 1 открывается окно, отображающее процессы кодирования и декодирования.
4.3. Инструкция пользователю.
Изменение кода происходит с помощью курсорных клавиш и клавиши пробел. Нажатием Enter пользователь подтверждает введенную кодовую комбинацию. Далее отображается закодированное сообщение. Его можно «искажать» по усмотрению пользователя. Дальнейшее нажатие клавиши Enter приведет к декодированию сообщения, если это возможно, в противном случае выводится соответствующее сообщение.
4.4 Выводы
Написанная программа полностью соответствует ТЗ, правильно кодирует и декодирует циклический код (14,9), а также исправляет ошибки.
5. Заключение
В результате проделанной работы была построена математическая модель помехозащищенного циклического кода (14,9), который кодирует информацию так, что при приеме может быть обнаружено две ошибки и одна из них исправлена. Данный код кодирует передаваемое сообщение из 9 бит, количество различных сообщений - более 256 (согласно ТЗ).
Математическая модель данного кода представляет собой программу, написанную с помощью языка Borland Pascal 7.0. Составленная программа работает в соответствии с техническим заданием и позволяет кодировать и декодировать вводимые сообщения.
Также в данной работе были разработаны структурная схема передачи данных с решающей обратной связью, функциональные и принципиальные схемы кодера и декодера с решателями в соответствии с техническим заданием.
Полное описание проведенной работы с пояснительными рисунками, таблицами и различными расчетами содержатся в данной расчетно-пояснительной записке. Графическая часть записки - структурная, функиональная и принципиальная схемы - выполнена в соответствии с требованиями ЕСКД и вынесены в приложение. А также к расчетно-пояснительной записке прилагаются документированный текст программы, перечень элементов, используемых для построения принципиальных схем, текст программы решателя декодера, написанный на языке VHDL и техническое задание.
Также было проведено моделирование работы кодера, декодера и решателей на программе MAX+plus II, где были получены соответствующие временные диаграммы, которые также вынесены в приложение.
На основании вышеизложенного материала можно сделать вывод, что задача, поставленная в техническом задании, - выполнена.
Текст программы на языке VHDL для решателя декодера
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
ENTITY dec5 IS
PORT
(R1, R2, R3, R4, R5: IN STD_LOGIC;
ERCOR, NXT: OUT STD_LOGIC);
END dec5;
ARCHITECTURE decoder5 OF dec5 IS
BEGIN
process (R1, R2, R3, R4, R5)
begin
if (R1='0' and R2='0' and R3='0' and R4='0' and R5='0') then
ERCOR<='0';
NXT<='1';
elsif (R1='1' and R2='0' and R3='0' and R4='0' and R5='0') then
ERCOR<='1';
NXT<='0';
elsif (R1='0' and R2='1' and R3='0' and R4='0' and R5='0') then
ERCOR<='1';
NXT<='0';
elsif (R1='0' and R2='0' and R3='1' and R4='0' and R5='0') then
ERCOR<='1';
NXT<='0';
elsif (R1='0' and R2='0' and R3='0' and R4='1' and R5='0') then
ERCOR<='1';
NXT<='0';
elsif (R1='0' and R2='0' and R3='0' and R4='0' and R5='1') then
ERCOR<='1';
NXT<='0';
else
ERCOR<='0';
NXT<='0';
end if;
end process;
END decoder5;
Документированный текст программы
program shhh;
uses Crt;
const
On=516; {курсор включён}
Off=1600; {курсор выключен}
n=14; {общее число символов сообщения}
k=9; {число информационных символов}
s=1; {число исправляемых символов}
{Образующая матрица}
a:Array[1..k,1..n]Of Byte=((0,0,0,0,0,0,0,0,1,0,0,1,1,1),
(0,0,0,0,0,0,0,1,0,0,1,1,1,0),
(0,0,0,0,0,0,1,0,0,1,1,1,0,0),
(0,0,0,0,0,1,0,0,0,1,1,1,1,1),
(0,0,0,0,1,0,0,0,0,1,1,0,0,1),
(0,0,0,1,0,0,0,0,0,1,0,1,0,1),
(0,0,1,0,0,0,0,0,0,0,1,1,0,1),
(0,1,0,0,0,0,0,0,0,1,1,0,1,0),
(1,0,0,0,0,0,0,0,0,1,0,0,1,1));
stepen=6; {степень образующего многочлена=6, т.к.
порядковый номер степени начинаем
отсчитывать не с 0, а с 1 }
{Образующий многочлен :
X^5 + X^2 + X + 1}
Polynom:Array[1..stepen]Of byte=(1,0,0,1,1,1);
MenuColor=3; {цвет активного пункта меню}
GroundColor=white; {цвет фона}
CodeLine=5; {номер строки ввода кода}
G_CodeLine=6; {номер строки закодированного сообщения}
D_CodeLine=8; {номер строки искажённого сообщения}
C_CodeLine=7; {номер строки исправленного сообщения}
Begin_Line=34; {номер столбца начала строк}
var
menu_p:array[1..18] of string[19]; {массив названий пунктов меню}
n_pun,from:byte; {текущий номер пункта меню}
n_z:integer; {количество записей в базе данных}
key:char; {нажатая клавиша}
i,j,x:byte; {счетчик}
Code:Array[1..k]Of Boolean; {начальная кодовая комбинация}
G_Code:Array[1..n]Of Byte; {закодированная кодовая комбинация}
(* ИНИЦИАЛИЗАЦИЯ *)
PROCEDURE init;
begin
menu_p[1]:=' КОДИРОВКА';
menu_p[2]:=' ПОМОЩЬ ';
menu_p[3]:=' О ПРОГРАММЕ';
menu_p[4]:=' ВЫХОД ';
menu_p[5]:=' СПРАВКА ';
menu_p[6]:=' АВТОР ';
menu_p[7]:=' ДА ';
menu_p[8]:=' НЕТ ';
end;
(* процедура работы с курсором *)
Procedure Cursor(q:Integer);
Begin Asm
mov AH,01h
mov CX,q
Int 10h
End End;
(* Процедура рисования простого окна *)
PROCEDURE win(x1,y1,x2,y2,color:byte);
begin
textbackground(color);
window(x1,y1,x2,y2);
clrscr;
end;
(* Процедура рисования окна с рамкой, тенью и заголовком *)
PROCEDURE wind(x1,y1,x2,y2,foncol,textcol:byte;zagl:string);
var pos:byte; {позиция х для заголовка окна}
i,j:integer; {счетчики}
begin
window(1,1,80,25);
textbackground(cyan);
textcolor(darkgray);
for i:=y1 to y2+2 do
begin
gotoxy(x1-1,i);
for j:=x1-1 to x2+4 do
write(chr(177));
end;
win(x1-2,y1-1,x2+2,y2+1,foncol);
textcolor(textcol);
gotoxy(3,1);
for i:=1 to x2-x1+1 do
write(chr(205));
gotoxy(3,3-y1+y2);
for i:=1 to 1+x2-x1 do
write(chr(205));
for i:=1 to y2-y1+1 do
begin
gotoxy(2,i+1);
writeln(chr(186));
end;
for i:=1 to 1+y2-y1 do
begin
gotoxy(4+x2-x1,i+1);
write(chr(186));
end;
gotoxy(2,1);
write(chr(201));
gotoxy(2,y2-y1+3);
write(chr(200));
gotoxy(x2-x1+4,1);
write(chr(187));
gotoxy(x2-x1+4,y2-y1+3);
write(chr(188));
pos:=3+((x2-x1) div 2)-(length(zagl) div 2);
gotoxy(pos,1);
write(zagl);
window(x1,y1,x2,y2);
end;
(* Процедура "Нажмите любую клавишу" *)
PROCEDURE wait_key;
var w_k:char; {ожидаемая клавиша}
begin
win(1,25,80,25,white);
textcolor(black);
write(' Нажмите любую клавишу');
w_k:=readkey;
if w_k=#0 then w_k:=readkey;
end;
(* Процедура вывода "справки" *)
PROCEDURE spravka;
begin
wind(27,3,75,13, white,black,' Справка ');
textcolor(black);
write;
WriteLn('Данная программа позволяет закодировать сооб-');
WriteLn('щение с помощью циклического кода с корректиру-');
WriteLn('ющей способностью d=4. Первые 9 символов -');
WriteLn('информационные, остальные 5 - контрольные.');
WriteLn;
WriteLn('Программа написана студентом 4 курса СФ МЭИ(ТУ)-');
WriteLn('Власовым А.В. в качестве приложения к выпускной');
writeln('работе.');
wait_key;
writeln;
win(1,1,80,24,cyan);
end;
(* Процедура вывода помощи-используемые клавиши *)
PROCEDURE helper;
begin
wind(9,4,59,15,white,black,' Помощь ');
textcolor(0);
writeln('Используемые клавиши:');
writeln;
writeln(' F1 - помощь');
writeln(' Esc - отмена, выход');
writeln(' "Пробел" - ввод символа кода : [0,1]');
writeln(' BackSpace - Удаление предыдущего символа');
writeln;
wait_key;
win(1,1,80,24,cyan);
end;
(*Процедура вывода информации об авторе *)
PROCEDURE avtor;
begin
wind(16,7,60,15,white,black,' Об авторе ');
textcolor(0);
writeln;
writeln(' Студент : Власов А.В.');
writeln(' Группа : ВМ-2-00');
writeln(' Руководитель : Каевченко М.А.');
writeln;
writeln;
writeln(' Смоленск 2004 г.');
wait_key;
win(1,1,80,24,3);
end;
(* Процедура вывода подсказки в нижней строке *)
PROCEDURE vnizu;
begin
win(1,25,80,25,white);
textcolor(black);write(' ',chr(24),chr(25),' ¦ ',chr(27),chr(26),' ¦ ');
textcolor(red);write('Enter ');
textcolor(black);write('Выбор ¦ ');
textcolor(red);write('F1 ');
textcolor(black);write('Помощь ¦ ');
textcolor(red);write('Esc ');
end;
(*Процедура выхода из программы *)
PROCEDURE final(var from:byte);{номер пункта меню, на котором находились}
var n_p:byte;{номер позиции в меню выхода}
i:integer; {счетчик}
begin
win(4,from+2,20,from+2,white);
textcolor(black);
write(menu_p[from]);
win(4,6,19,6,3);
textcolor(white);
write(' ВЫХОД');
n_p:=1;
repeat
repeat
vnizu;textcolor(black);write('Отмена выхода');
wind(29,10,42,11,white,black,'');
for i:=1 to 2 do
begin
if i=n_p then
begin
textbackground(3);
textcolor(white);
end
else begin
textbackground(white);
textcolor(black);
end;
if i=2 then write(menu_p[8])
else writeln(menu_p[7]);
end;
key:=readkey;
if key=#0 then key:=readkey;
case key of
#80:begin {Вниз}
n_p:=n_p+1;
if n_p>2 then n_p:=1;
end;
#72:begin {Вверх}
n_p:=n_p-1;
if n_p<1 then n_p:=2;
end;
#27,#75:begin {Esc}
n_p:=2;
break;
end;
end;
until (key=#13) or (key=#77);
case n_p of
1:begin
cursor(on);
textcolor(lightgray);
win(1,1,80,25,0);
halt;init;
end;
2:begin
win(1,1,80,25,3);
exit;
end;
end;
until false;
end;
(*Процедура вывода меню для пункта "О программе" *)
PROCEDURE o_progr;
var n_p:byte;{номер позиции в меню выхода}
i:integer; {счетчик}
begin
n_p:=1;
repeat
repeat
vnizu;textcolor(black);write('Выход');
wind(26,9,37,10,white,black,'');
for i:=1 to 2 do
begin
if i=n_p then
begin
textbackground(3);
textcolor(white);
end
else begin
textbackground(white);
textcolor(0);
end;
if i=2 then write(menu_p[6])
else writeln(menu_p[5]);
end;
key:=readkey;
if key=#0 then key:=readkey;
case key of
#80:begin {Вниз}
n_p:=n_p+1;
if n_p>2 then n_p:=1;
end;
#72:begin {Вверх}
n_p:=n_p-1;
if n_p<1 then n_p:=2;
end;
#27,#75:begin {Esc}
win(1,1,80,24,3);
exit;
end;
end;
until (key=#13) or (key=#77);
case n_p of
1:begin {справка}
spravka;
exit;
end;
2:begin {отмена выхода}
avtor;
exit;
end;
end;
until false;
end;
(* процедура выхода *)
Procedure Quit;
begin
clrscr;
cursor(off);
init;
n_pun:=1;
win(1,1,80,25,3);
repeat
repeat
vnizu;
textcolor(0);
write('Выход');
wind(4,3,20,6,white,0,'');
for i:=1 to 4 do
begin
if i=n_pun then
begin
textbackground(3);
textcolor(white);
end
else begin
textbackground(white);
textcolor(0);
end;
if i=4 then write(menu_p[4])
else writeln(menu_p[i]);
end;
from:=4;
key:=readkey;
if key=#0 then key:=readkey;
case key of
#27:begin {Esc}
from:=n_pun;
n_pun:=4;
break;
end;
#59:helper; {F1}
#80:begin {Вниз}
n_pun:=n_pun+1;
if n_pun>4 then n_pun:=1;
end;
#72:begin {Вверх}
n_pun:=n_pun-1;
if n_pun<1 then n_pun:=4;
end;
end;
until (key=#13) or (key=#77);
case n_pun of
{1:visio;}
2:helper; {помощь}
3:o_progr; {о программе}
4:final(from); {выход}
end;
until false;
end;
(* процедура ввода кода *)
Procedure Input;
Begin
X:=2;
GotoXY(Begin_Line+x,CodeLine-1);
Write('k9k8k7k6k5k4k3k2k1m5m4m3m2m1');
For i:=1 to k Do
Begin
GotoXY(Begin_Line+X+2*(i-1),CodeLine);
If Code[i]Then Write('1')Else Write('0');
End;
TextBackGround(MenuColor);
GotoXY(Begin_Line+X,CodeLine);
If Code[x div 2]Then Write('1') Else Write('0');
Repeat
Key:=ReadKey;
Case Key of
#0:Begin
Key:=ReadKey;
TextBackGround(GroundColor);
GotoXY(Begin_Line+X,CodeLine);
If Code[x div 2]Then Write('1') Else Write('0');
Case Key of
#77:If X<2+(k-1)*2 Then X:=X+2 else x:=2;
#75:If X>2 Then X:=X-2 else x:=2+(k-1)*2;
End;
TextBackGround(MenuColor);
GotoXY(Begin_Line+X,CodeLine);
If Code[x div 2]Then Write('1') Else Write('0');
End;
#27:quit;
{begin clrscr; cursor(off);init; final(from); end;}
#32:Begin
Code[x div 2]:=Not Code[x div 2];
GotoXY(Begin_Line+X,CodeLine);
If Code[x div 2]Then Write('1') Else Write('0');
End;
End;
Until Key=#13;
TextBackGround(GroundColor);
GotoXY(Begin_Line+X,CodeLine);
If Code[x div 2]Then Write('1') Else Write('0');
End;
(* процедура кодирования сообщения *)
Procedure Coder;
Begin
For i:=1 to n do G_Code[i]:=0;
For i:=1 to k do Begin
If Code[k+1-i] Then Begin
For j:=1 to n Do Begin
G_Code[j]:=G_Code[j]+a[i,j];
If g_Code[j]=2 Then G_Code[j]:=G_Code[j]-2;
End;
End;
End;
For i:=1 to n Do Begin
GotoXY(Begin_Line+2*i,G_CodeLine);
Write(G_Code[i]);
End;
End;
(* процедура сдвига кода влево *)
procedure Left;
begin
x:=G_Code[1];
for i:=1 to n-1 do G_Code[i]:=G_Code[i+1];
G_Code[14]:=x; {!!!!!!!!!!15!!!!!!111}
end;
(* процедура сдвига кода вправо *)
Procedure Shift_Rigth;
Begin
x:=G_Code[14];{!!!!!!!!!!!15!!!!!!!!1}
For i:=n downto 2 do G_Code[i]:=G_Code[i-1];
G_Code[1]:=x;
End;
(* процедура декодирования *)
Procedure decoder;
Var b:Array[1..n] of byte;
w,AmountShift:byte;
Begin
AmountShift:=0;
Repeat
w:=0;
For i:=1 to n Do b[i]:=G_Code[i];
For i:=1 to n-stepen+1 Do
Begin
If b[i]=1 Then
Begin
For j:=i to stepen+i do
Begin
b[j]:=b[j]+Polynom[j-i+1];
if b[j]=2 Then
b[j]:=0;
End;
End;
End;
For i:=1 to n do If b[i]=1 Then Inc(w);
If w>s Then
Begin
Left;
Inc(AmountShift);
End
Else
Begin
For i:=1 to n Do
Begin
G_Code[i]:=G_Code[i]+b[i];
If G_Code[i]=2 then G_Code[i]:=0;
End;
w:=0;
End;
Until (w=0) Or (AmountShift=n);
If w=0 Then
Begin
While AmountShift>0 Do
Begin
Dec(AmountShift);
Shift_Rigth;
End;
For i:=1 to n Do
Begin
GotoXY(Begin_Line+2*i,D_CodeLine);
write(G_Code[i]);
End;
End
Else
Begin
GotoXY(Begin_Line+2,D_CodeLine);
Write('Невозможно расшифровать комбинацию');
End;
End;
(* процедура изменения кода *)
Procedure Change_Code;
begin
x:=2;
For i:=1 to n Do Begin
GotoXY(Begin_Line+X+2*(i-1),C_CodeLine);
If G_Code[i]=1Then Write('1')Else Write('0');
End;
TextBackGround(MenuColor);
GotoXY(Begin_Line+X,C_CodeLine);
If G_Code[x div 2]=1Then Write('1') Else Write('0');
Repeat
Key:=ReadKey;
Case Key of
#0:Begin
Key:=ReadKey;
TextBackGround(GroundColor);
GotoXY(Begin_Line+X,C_CodeLine);
If G_Code[x div 2]=1Then Write('1') Else Write('0');
Case Key of
#77:If X<2+(n-1)*2 Then X:=X+2 else x:=2;
#75:If X>2 Then X:=X-2 else x:=2+(n-1)*2;
End;
TextBackGround(MenuColor);
GotoXY(Begin_Line+X,C_CodeLine);
If G_Code[x div 2]=1Then Write('1') Else Write('0');
End;
#27:Exit;
#32:Begin
G_Code[x div 2]:=1-G_Code[x div 2];
GotoXY(Begin_Line+X,C_CodeLine);
If G_Code[x div 2]=1 Then Write('1') Else Write('0');
End;
End;
Until Key=#13;
TextBackGround(GroundColor);
GotoXY(Begin_Line+X,C_CodeLine);
If G_Code[x div 2]=1Then Write('1') Else Write('0');
end;
(*Процедура ввода и обработки кодового сообщения*)
procedure visio;
Begin
Cursor(Off);
Init;
Repeat
ClrScr;
wind(2,3,78,24,white,black,' Кодирование ');
GotoXY(3,12);
TextColor(0);
GotoXY(3,codeLine);
Write('Посылаемый код :');
GotoXY(3,G_codeLine);
Write('Закодированный код :');
GotoXY(3,C_codeLine);
Write('Измененный код :');
GotoXY(3,D_codeLine);
Write('Декодированный код :');
Input;
Coder;
Change_Code;
decoder;
Repeat
Key:=ReadKey;
If Key=#27 Then exit;
Until Key=#13;
Until False;
End;
(* ГЛАВНЫЙ МОДУЛЬ *)
(* Вывод меню.Вызов соответствующих модулей *)
begin
cursor(off);
init;
n_pun:=1;
win(1,1,80,25,3);
repeat
repeat
vnizu;
textcolor(0);
write('Выход');
wind(4,3,20,6,white,0,'');
for i:=1 to 4 do
begin
if i=n_pun then
begin
textbackground(3);
textcolor(white);
end
else begin
textbackground(white);
textcolor(0);
end;
if i=4 then write(menu_p[4])
else writeln(menu_p[i]);
end;
from:=4;
key:=readkey;
if key=#0 then key:=readkey;
case key of
#27:begin {Esc}
from:=n_pun;
n_pun:=4;
break;
end;
#59:helper; {F1}
#80:begin {Вниз}
n_pun:=n_pun+1;
if n_pun>4 then n_pun:=1;
end;
#72:begin {Вверх}
n_pun:=n_pun-1;
if n_pun<1 then n_pun:=4;
end;
end;
until (key=#13) or (key=#77);
case n_pun of
1:visio;
2:helper; {помощь}
3:o_progr; {о программе}
4:final(from); {выход}
end;
until false;
end.
Подобные документы
Классическое шифрование передачи криптографического ключа. Протоколы квантовой криптографии, их сущность и содержание. Анализ возможности передачи конфиденциальной информации по квантовым каналам связи. Способы исправления ошибок при передаче информации.
курсовая работа [394,3 K], добавлен 08.05.2015Представление и классификация кодов, построение кода с заданной коррекцией. Характеристика корректирующих кодов (код Хемминга, код БЧХ). Разработка схемотехнической реализации кодера и декодера. Выбор способа представления информации в канале передачи.
курсовая работа [131,1 K], добавлен 02.01.2011Метод обработки сигналов, предназначенный для увеличения надежности передачи по цифровым каналам. Кодирование с исправлением ошибок. Двоичный канал связи. Появление фиксированной одиночной ошибки. Поиск при декодировании. Параметры помехоустойчивых кодов.
реферат [44,0 K], добавлен 11.02.2009Исследование основных принципов цифровой системы передачи непрерывных сообщений с импульсно-кодовой модуляцией по каналу с шумом. Расчет источника сообщения, дискретизатора, кодера, модулятора, канала связи, демодулятора, декодера, фильтра-восстановителя.
курсовая работа [545,1 K], добавлен 10.05.2011Проектирование среднескоростного тракта передачи между источниками и получателями данных. Использование системы с решающей обратной связью, непрерывной передачей и блокировкой приемника для повышения верности передачи. Квадратурная амплитудная модуляция.
курсовая работа [2,4 M], добавлен 19.11.2012Функции основных блоков структурной схемы системы передачи дискретных сообщений. Определение скорости передачи информации по разным каналам. Принципы действия устройств синхронизации, особенности кодирования. Классификация систем с обратной связью.
курсовая работа [478,7 K], добавлен 13.02.2012Проектирование и разработка многоканальной когерентной системы передачи дискретной информации (СПДИ), предназначенной для передачи цифровых сигналов от М-однотипных источников информации по одному или нескольким арендуемым стандартным аналоговым каналам.
курсовая работа [1,1 M], добавлен 26.08.2010Проектирование устройства преобразования цифровой информации в аналоговую и наоборот для цифрового магнитофона. Описание используемых интегральных микросхем. Разработка структурной и принципиальной схемы цифрового канала звукозаписи без кодера и декодера.
курсовая работа [1,8 M], добавлен 18.10.2010Повышение верности передачи информации, ввод дополнительной избыточности. Статистика ошибок. Основные определения и понятия теории кодирования. Способность кода исправлять ошибки. Классификация помехоустойчивых кодов. Код Хемминга, циклические коды.
реферат [66,4 K], добавлен 01.11.2011Характеристика кодирования как средства защиты и повышения достоверности передачи информации по каналу связи. Частотный диапазон Bluetooth и способ кодирования пакета в цифровых системах связи. Классификация кодов, их параметры и оптимальные значения.
презентация [146,0 K], добавлен 22.10.2014