В 1948 году в Victoria University of Manchester начались работы по созданию экспериментальной вычислительной машины Manchester Mark-1. Это была одна из первых машин с хранимой программой. В 1949 году работы были завершены, машина работала. Позже, в 1951 году, на на ее базе была выпущена коммерческая версия Ferranti Mark 1.
Однако, нас сегодня будет интересовать не собственно эта машина (безусловно чрезвычайно интересная!), а ее устройство для хранения программы - магнитный барабан. Точнее, использованный для его создания способ кодирования информации.
Основная память Manchester Mark 1 была построена на запоминающих ЭЛТ - трубках Вильямса. А магнитный барабан позволял хранить дополнительные страницы памяти. Причем одна дорожка барабана хранила две страницы памяти, два блока по 32 слова состоящих из 40 бит.
Если вам интересна сама машина, то очень кратко о ней можно почитать, например, по этой ссылке
А мы оставим машину в покое и сосредоточимся на интересующей нас теме.
Планируется, что цикл будет состоять из трех частей.
Первую часть вы сейчас читаете. Она является, по большей части, описательной. С небольшим историческим экскурсом. При этом основной упор делается не на теорию.
Вторая часть будет посвящена кодированию. Это простая операция, и именно она чаще всего описывается в статьях и учебниках. Однако, практическая реализация существенно отличается от простейших теоретических схем.
Третья часть будет посвящена декодированию. И вот это уже описывается гораздо реже. И основной упор опять будет сделан на практические аспекты, а не на сухую теорию.
Магнитная запись информации и связанные с ней трудности
В статье
Внешняя память ЭВМ. Магнитные ленты. Просто о сложном
я достаточно подробно рассказал о магнитной записи информации. Правда применительно к магнитной ленте, но сам принцип записи один и тот же.
Магнитный барабан в Manchester Mark 1 можно рассматривать как несколько коротких склеенных в кольца однодороженых магнитных лент. И для таких лент метод записи, о кодировании тут говорить сложно, NRZ оказывается неприменим. Это, безусловно, понимали и разработчики магнитных барабанов.
Простейшим вариантом реализации записи было использование тонального кодирования. Однако, плотность записи получается низкой. Но это не основная проблема. Что бы выделить из тонального сигнала отдельные биты требуется дополнительный сигнал - тактовые импульсы (синхроимпульсы). Это требует или дополнительной дорожки, возможно, одной на барабан, или механического датчика, например, зубцов на краю барабана.
Нужен был какой то другой способ кодирования записываемой информации, который позволял бы объединить информацию и синхроимпульсы на одной дорожке. Причем этот способ должен быть устойчив к еще одной проблеме - скорость вращения барабана не была постоянной. Колебания скорости были небольшими и относительно медленными, из-за инерционности барабана как механической конструкции.
И такой способ был предложен Томасом (G. E. Thomas), который тогда был студентом присоединившимся к группе разработчиков. Немного позже, уже в 1949 году, Томас впервые опубликовал этот способ. К сожалению, я не смог найти копии оригинальной статьи, поэтому и ссылки на нее не будет...
Способ оказался очень удачным. Настолько, что используется и сегодня, пусть и с некоторыми изменениями. Причем далеко не только в магнитной записи. Свое название, Манчестерский код (Manchester code), способ получил по названию университета, в стенах которого он и был разработан. Сам Томас тоже не был забыт, хотя во многом остался в тени. Но об этом чуть позже.
А пока давайте поподробнее рассмотрим, как же этот код устроен.
Фазовое кодирование (модуляция)
В основу Манчестерского кода положено изменение фазы сигнала, а не какой то определенный его уровень. Поэтому и сам способ кодирования является фазовым. И именно так он был изначально описан. Однако, фазовое кодирование (модуляцию) заметить в Манчестерском коде не так просто. Поэтому давайте рассмотрим немного подробнее.
В коде Manchester информация передается не уровнями, а изменением уровня. На первый взгляд, изменение небольшое. Да еще и все усложняющее. Но на самом деле, это позволило решить почти все проблемы.
Обратите внимание, что Manchester-II это именно способ кодирования информации. Он никаким образом не определяет способ физического представления сигнала в процессе передачи (записи/воспроизведения). В статье мы будем говорить об уровнях напряжения только по причине удобства. На самом деле, важно только направление изменения. Причем даже не важно, что именно изменяется, хоть на иллюстрациях и показано изменение напряжения. Это может быть и напряжение, и ток, и яркость, и т.д.
Давайте сначала определим два абстрактных уровня, как и договорились, напряжения. Высокий уровень будем обозначать HI (high), а низкий LO (low). Причем уровень LO совершенно не обязательно соответствует нулю. Нам не важны не только конкретные значения уровней, но и их знак. Для простоты на иллюстрациях напряжения будут положительными.
Может возникнуть вопрос, почему просто не обозначить LO как "0", а HI как "1"? Все просто, напряжения уровней не обязаны соответствовать логическим уровням. А "0" и "1" мы обозначаем именно логические уровни.
В коде Manchester значение имеет не просто факт изменения уровня сигнала, но и направление изменения. Например, это может быть уменьшение или увеличение напряжения или тока. Два возможных направления изменения соответствуют двум возможным состояниям двоичного бита. Остается только договориться, что чему будет соответствовать. И здесь возможны два варианта
На иллюстрации я показал мгновенное изменение уровня сигнала, что будет соответствовать прямоугольным импульсам. На самом деле, уровень сигнала может изменят куда более плавно. И, как немного позже увидим, сигнал может быть даже синусоидальным. При этом направление изменения остается верным.
В общем то, большой разницы между вариантами и нет. Фактически, современный вариант просто является инверсным по отношению к варианту Томаса. Поэтому в дальнейшем будет рассматривать современный вариант кодирования. А тема инверсии нам еще встретится.
Пока действительно не видно, какое отношение к нашему способу кодирования имеет фазовая модуляция. Потерпите, очень скоро мы все увидим.
Однако, записываемая/передаваемая информация состоит из нескольких отдельных бит. Поэтому нужно ввести понятие битового интервала, или окна, соответствующего времени передачи одного бита. И изменение уровня сигнала должно происходить внутри соответствующего битового интервала. В идеальном случае, в середине интервала.
У тут у нас возникает проблема если соседние биты имеют одинаковое состояние. Например, после записи/передачи бита в состоянии "0" уровень сигнала уже LO. Эта проблема может быть решена просто и элегантно. При необходимости, если два соседних бита одинаковы, уровень сигнала меняется не только в середине битового интервала, но и на границе интервалов. Эта смена уровня на границе интервалов является "технической", то есть, не несет информационного смысла.
Вот теперь мы готовы посмотреть, как будет выглядеть сигнал при записи/передаче последовательности одинаковых бит
Одинаковые уровни сигнала, одинаковая частота. Если у нас не от чего отталкиваться, вообще невозможно определить, что именно записывается/передается. Все так плохо? Нет.
Давайте еще раз посмотрим на битовый интервал. По сути, он соответствует периоду несущей частоты. И мы, можем, как ранее и говорилось, представить сигнал в синусоидальной форме, для наглядности. Вот так
Теперь хорошо видно, что передача нулей и единиц отличается именно фазой сигнала. Фактически, это не просто фазовый сдвиг, а инверсия фазы. Но что это нам дает? Чем это лучше?
Дело в том, что фазовые соотношения сохраняются и при изменении амплитуды сигнала, и при изменении частоты. То есть, фазовое кодирование (модуляция) является более устойчивым именно к тем помехам, которые больше всего мешали при создании магнитного барабана. Все таки техника тех лет была гораздо менее совершенна, чем сегодняшняя.
Теперь понятно, почему сам метод кодирования является фазовым. Остается выяснить, когда именно выполняется фазовая манипуляция, когда фаза сигнала изменяется. Для этого рассмотрим запись/передачу байта информации.
Сначала классический, показанный в большинстве статей и учебников, вид сигнала в Манчестерском коде
Что же такого в этом сигнале интересного? Сразу бросается в глаза, что на границах бит с разным состоянием уровень сигнала не изменяется. Действительно, в этом просто нет необходимости. Но именно это отсутствие изменения уровня сигнала на границе различающихся бит и свидетельствует о мгновенном изменении фазы сигнала!
То есть, фазовая манипуляция выполняется именно на границе различающихся бит. Не при передаче бита, а между битами с разными состояниями. Вот тот же самый сигнал в синусоидальном виде
Это тот же самый сигнал в коде Manchester-II. Но только теперь у нас несущая частота, в данном случае синусоидального сигнала, модулируется сдвигом (инверсией) фазы на границах бит.
То есть, если вернуться к магнитным барабанам, мы можем использовать тональный генератор (генератор синуса звуковой частоты) и фазовый модулятор для получения синусоидального сигнала звуковых частот, который можно напрямую подавать на усилитель записи. Напомню, что цифровой записи в то время еще не существовало, а вот магнитная запись звука уже была.
Фазовый модулятор может быть очень простым, так как нужна лишь инверсия фазы. Например, можно использовать усилительный каскад на триоде (техника была только ламповая) с одинаковыми резисторами в цепи анода и катода. Снимаемые с анода и катода сигналы будут равны по амплитуде, но противоположны по фазе. Поэтому остается лишь добавить управляемый записываемыми битами переключатель, который и будет определять фазу выходного сигнала. Разумеется, переключатель должен быть синхронизирован по фазе с тональным генератором.
Таким образом, предложенный, и использовавшийся в реальности, метод кодирования записываемой на магнитный барабан информации соответствовал техническим возможностям тех лет. Более того, он определялся этими возможностями.
Кодирование и декодирование будут темами последующих статей. Но вы увидите, что даже современный аппаратный способ кодирования использует по сути тот же самый "переключатель фазы", только уже не ламповый.
Но какие же в кода Manchester-II есть плюсы, что он применяется и по сей день? Давайте разберемся. Но сначала небольшое, почти лирическое, отступление.
Магнитная запись как разновидность канала передачи данных
Давайте посмотрим на двух человек ведущих переписку, обычную, на бумаге. Один человек пишет письмо, кодирует информацию, и передает его почтальону/курьеру, то есть, в канал передачи информации. Второй человек, получает письмо от почтальона, из канала передачи информации, и читает его, декодирует информацию.
Согласитесь, именно так обычно представляется канал передачи информации. Есть отправитель, есть получатель, есть канал передачи со средствами доставки. Но давайте немного изменим ситуацию. Пусть отправитель не сам пишет письмо, а диктует его секретарю. Изменилось ли что-нибудь?
С точки зрения передачи информации ничего не изменилось. Да, теперь отправитель использует другой способ кодирования, голос. Но секретарь все равно выполнит еще одно кодирование, из голоса на бумагу. Дальнейшее идентично. Мы можем добавить секретаря у получателя, можем добавить этапы доставки пешком, на лошади, пароходе, самолете, с точки зрения отправителя и получателя, если говорить о передаче информации, изменений не будет.
По прежнему есть передаваемая информация, которая должна дойти до получателя. Все остальное это уже детали и тонкости реализации канала связи, которые "истинного джентльмена не интересуют". Точно так же, сегодня вас не интересует (за очень редким исключением) каким путем информационный пакет дойдет от вашего компьютера до компьютера вашего корреспондента.
Точно так же, магнитная запись может восприниматься как часть канала передачи информации. Ведь письмо может быть голосовым, записанным на магнитофон. И передаваться почтальону будет не конверт, а кассета с магнитной лентой.
Точно так же, ничего не изменится, если отправитель и получатель будет одним и тем же человеком. Просто информация будет перемещаться не в пространстве, а во времени.
Обратите внимание, кодирование это не шифрование!
На самом деле, кодирование и декодирование часто входит в состав каналообразующего оборудования. Но оно может быть и отдельным. Например, цифровой накопитель на магнитной ленте (НМЛ) может подключаться напрямую к ЭВМ и осуществлять кодирование/декодирование самостоятельно. А бытовой магнитофон при подключении к ПК требует внешнего кодера/декодера.
Преимущества кода Manchester-II
Разработанный в далеком 1948 году (опубликован в 1949) используется и сегодня, например, при передаче данных в компьютерных сетях. Безусловно, первоначальный вариант был переработан и усовершенствован, но статья не об этом.
Отсутствие постоянной составляющей
Это было одной из целей при разработке метода кодирования. Но это важно далеко не только для магнитной записи. Каналы связи часто делают электрически изолированными. Для развязки могут использоваться различные способы. Например, в Ethernet используется трансформаторная развязка
Передача постоянной составляющей через трансформатор невозможна. Но в коде Manchester-II сигнал не замирает на одном уровне дольше, чем на один битовый интервал. А значит, передача через трансформатор возможна, если конечно правильно подобрать его параметры.
При использовании Manchester-II для физической передачи через RS-485 (да, такое возможно) часто используется оптронная развязка. А значит, постоянная составляющая проблемой не является. Но тут могут оказаться полезными другие плюсы манчестерского кодирования.
А вот для передачи через радиоканал отсутствие постоянной составляющей очень важно. Более того, можно непосредственно модулировать высокочастотную несущую, например, в радиочастотных метках.
Ограниченный спектр частот
Использование фазовой модуляции несущей частоты (инверсия фазы) приводит к появлению в выходном сигнале дополнительной составляющей с частотой в два раза ниже несущей. При этом форма сигнала, на самом деле, не имеет значения.
Именно этот факт и привел к тому, что в первых (зачастую самодельных) ПК, использовавших бытовые магнитофоны для хранения программ и данных, метод кодирования часто назывался F/2F. Хотя это было именно манчестерское кодирование.
Всего две частотные составляющие, в сигнале синусоидальной формы, позволяют легко отфильтровывать возникающие в канале связи помехи. Кроме того, это уменьшает и создаваемые самим каналом связи помехи. Что может быть очень важным, например, для радиоканала.
Но важно не только это. Сигнал прямоугольной формы имеет бесконечный спектр частот. Однако, для Manchester-II нам достаточно обеспечить возможность передачи несущей частоты. То есть, частоты соответствующей передаче последовательности бит одного состояния. На выходе канала связи форма сигнала будет далеко не прямоугольной, но ее легко восстановить с помощью компаратора.
То есть, требования к частотным свойствам канала связи у Manchester-II не самые высокие. Более того, можно относительно легко отстраиваться от низкочастотных помех, что мы и увидим в статье о декодировании. А это полезно для устранения влияния помех, например, с частотой питающей сети.
Синхронизация
Код Manchester-II устойчив к некоторой разнице тактовых частот передатчика и приемника. В том числе, к небольшим, и относительно плавным, изменениям тактовой частоты передатчика. То есть, можно говорить, что он обладает свойством самосинхронизации частот (но не информации). Но это не побитовая синхронизация, как иногда говорят.
Давайте еще раз взглянем на сигнал в коде Manchester-II, точнее, на некоторые временные соотношения
У нас обязательно будет перепад уровня в середине битового интервала и, возможно, на границе битовых интервалов. Мы можем измерять времена между перепадами. И эти времена будут меду собой относительно жестко связаны. В идеальном случае, разница будет двухкратной. А значит, мы можем совершенно четко различать две возможные длительности.
Это дает нам возможность получить именно длительность Т, прямым измерением или делением на два. Т соответствует основному временному параметру кода Manchester-II - половине длительности битового интервала. И этот важнейший параметр мы можем определять прямо в процессе приема и декодирования сигнала.
То есть, мы имеем возможность подстройки тактовой частоты приемника в процессе передачи данных. Или даже возможность определить неизвестную заранее тактовую частоту передатчика.
Это весьма полезное свойство. И обеспечивается оно благодаря тому, что сигнал в коде Manchester-II содержит не только информацию, но сигнал синхронизации (тактирования). Как это получается, мы узнаем из следующей статьи.
Обратите внимание, синхронизация действительно не побитовая. То есть, резкое изменение частоты несущей во время передачи одного-двух бит приведет к ошибочному чтению. Но плавное изменение частоты несущей, например, вызванное плаванием частоты вращения диска/барабана, или скорости протяжки ленты, к ошибке не приведет.
Минусы и проблемы
Плюсы кода Manchester-II несомненны. Но есть и недостатки.
Высокая сложность
В своем первоначальном варианте, в памяти на магнитных барабанах, реализация кодирования была хоть не простой, но не столь и сложной. Как, примерно, было реализовано кодирование я уже говорил. В декодере использовалась фазовая автоподстройка частоты, которая в то время уже была известна.
Но полноценная современная реализация декодера совсем не так проста. Причем кодер довольно прост, по этой причине часто его описанием и ограничиваются. Тем не менее, реализация упрощенных вариантов вполне возможна.
И здесь я вынужден сделать важное замечание для тех читателей, которые (как обычно) будут заявлять, что "нужно просто использовать готовые решения и не забивать голову"... Я не призываю собирать все на дискретной логике или писать свои программные реализации. Я рассказываю, как все это устроено, и как работает. Для тех, кому это нужно или интересно. В конечном итоге, кто то должен ведь и разрабатывать те самые "готовые решения", которые будут использовать остальные.
Синхронизация информации
Да, сам по себе код Manchester-II самосинхронизирующийся. Но проблема в том, что если мы подключимся к линии связи в произвольный момент времени, то "понимать" передаваемую информацию сможем далеко не сразу. Проблема заключается в том, мы не будем знать, чему соответствует встретившийся перепад уровня сигнала, середине битового интервала (информация), или является межбитовым (техническим).
Однако, мы можем подстроиться под тактовую частоту передатчика измеряя длительность временных интервалов принимаемого сигнала. Это позволит определить и момент середины битового интервала, так как окончание интервала длительностью 2Т в принимаемом сигнале однозначно соответствует середине битового интервала.
С этого момента мы уже сможем выделять отдельные биты из принимаемого сигнала, а значит, получать информацию. Однако, эта информация может быть недостоверной. И причина здесь кроется в возможной инверсии.
Инверсия
Вспомните два варианта кодирования состояний "0" и "1", которые показаны на самой первой иллюстрации статьи. Если между передатчиком и приемником сигнал инвертируется нечетное количество раз, и полученная информация окажется инвертированной. Сам код Manchester-II к инверсии сигнала не устойчив.
В случае накопителя с несъемным магнитным носителем, того же магнитного барабана, количество инверсий сигнала обычно контролируемо и определяется схемотехникой. А значит, проблемы не будет. Не будет проблемы и в том случае, если параметры записи на съемный носитель четко определены стандартом.
Однако, например, для бытового магнитофона фаза сигнала на выходе усилителя воспроизведения может оказаться инверсной по отношению к фазе подаваемого на вход усилителя записи сигнала. Причем даже на том же самом магнитофоне. Стандартом это не определяется, а на запись/воспроизведение звука не влияет.
Для проводной линии связи монтажник может перепутать провода. Или независимость от полярности подключения может требоваться техническим заданием. Поэтому проблема инверсии сигнала, не решаемая на уровне самого кодирования Manchester-II, является достаточно актуальной.
Решить проблему помогает передача какого-либо специального признака позволяющего определить возникновение инверсию. Но такой признак не должен встречаться в самой передаваемой информации. А это сама по себе проблема, если передается произвольная двоичная информация.
Можно создать достаточно длинную последовательность байт признака, но это не даст 100% гарантий. Гораздо лучше другой способ - разделить передаваемую информацию на отдельные блоки и предварять каждый блок специальным заголовком четко определенного формата.
Не правда ли, звучит очень знакомо? Если между информационными блоками делать небольшую паузу, то мы сможем легко определить начало очередного блока. Небольшая преамбула из нулевых байт позволит заранее подстроить частоту тактирования. А признаком может быть, например 55AA (шестнадцатиричное число). Если признак встретится где либо еще в информационном блоке, ничего страшного не произойдет. Отдельно анализируется только заголовок блока.
Если получено именно 55АА, то инверсии нет. Если получено АА55, то сигнал инвертирован и нам нужно инвертировать все содержимое информационного блока.
Этот пример показывает, как не решаемые на одном из уровней реализации проблемы могут быть решены на более высоком уровне. Более глубоко погружаться в вопросы не связанные непосредственно с кодированием Manchester-II мы не будем. В конечном итоге мы рассматриваем само кодирование, а не передачу информации в общем и целом.
Заключение
В первой части мы очень кратко обзорно, рассмотрели некоторые важные и интересные вопросы и самого кода Manchester-II и его практического применения. Причем я старался показать и некоторые исторические аспекты, которые привели как к появлению самого способа кодирования, так и тому, что он применяется до сих пор.
В следующий раз мы будем рассматривать вопросы связанные с построением кодера Manchester-II. Причем коснемся и аппаратной, и программной реализаций.