1 Отредактировано LeoN (11-11-2018 19:07)

Тема: MFM кодек

Навеяно этим и этим.

Предлагаю "закрепить" для однозначного мыслеизъявления и однозначного понимания кого-либо:

1. Терминология и обозначение. "Данные", "бит данных" - именно данные, и ничего другого! Обозначаем дефолтным или зеленым цветом "01010011", "01010011", "$53", "$53" и т.д. Скорость передачи 250 кб/с (хотя в АГАТе ~257 кб/с, но это не принципиально), значит длительность нуля равна длительности единицы и равна 4 мкс.


2. Терминология и обозначение. Физические/электрические "сигналы/импульсы на разъёме дисковёрта" обозначаем красным цветом. Примеры: "...010110111011..." (смотрим осциллограммы чтения/записи в даташитах дисковёртов), "...RNRNNRNNNRNN...".

а) "0" - логический ноль, соответствует напряжению, близкому к 0 Вольт (насколько выходной буфер с открытым коллектором сможет прижать к земле), то, что мы видим мультиметром или осциллографом, активное состояние сигнала (инверсная логика). Он же "R" (он же просто "R") - "current Reverse", смена направления тока. Важно! "0" и "R" - это импульс, может быть периодическим ("...RNRNRNRN...", "...RNNRNNRNN...", "...RNNNRNNNRNNN...) и непериодическим ("...RNRNN...", "...RNNRNNN...", "...RNRNNRNNN..."), зависит от самих записываемых/читаемых данных.

б) "1" - логическая единица, соответствует напряжению, близкому к напряжению питания (обычно 5 Вольт), обеспечивается притягиванием резистором к питалову, пассивное состояние сигнала (инверсная логика), именно так мы видим мультиметром или осциллографом. Он же "N" (или просто "N"), он же "Idle", он же "простой" (не от слова "просто", а от слова "стоять").

в) Длительность импульса "0" (или "R", или "R") - не более половины длительности бита данных, то есть <= 2мкс. При записи зависит от контроллера (частота тактирования секвенсера, мощность выходного каскада, номинал подтягивающего резистора на стороне дисковода), а при чтении от дисковода (усилители аналогового сигнала, тактирование и логика работы оцифровщика, номинал подтягивающего резистора на стороне контроллера). На практике значительно меньше половины длительности бита данных (в даташитах дисководов это оговорено), а у HD-дисководов даже меньше четверти длительности бита данных (это при 250 кб/с, а при 500 кб/с - меньше половины).

г) Длительность простоя (считаю, что термин "пауза" здесь не уместен) "1" (или "N", или "N") - не менее половины длительности бита данных, то есть >= 2 мкс.

д) Сумма длительности импульса "R" и длительности простоя "N" до следующего импульса "R" ("R"+"N"="RN", "0"+"1"="01") равна ровно длительности бита данных, то есть 4 мкс - одинарный интервал.

е) Сумма длительности импульса "R" и длительности двойного простоя "NN" до следующего импульса "R" ("R"+"NN"="RNN", "0"+"11"="011") равна ровно длительности полутора бит данных, то есть 6 мкс - полуторный интервал.

ж) Сумма длительности импульса "R" и длительности тройного простоя "NNN" до следующего импульса "R" ("R"+"NNN"="RNNN", "0"+"111"="0111") равна ровно длительности двух бит данных, то есть 8 мкс - двойной интервал.


3. Терминология и обозначение. MFM-кодирование/представление, обозначаемое в разных источниках то цифрами "0" и "1", то символами "R" и "N". Реверс тока обозначают "R" или "1", простой обозначают "N" или "0". Предлагаю выделять синим цветом. Примеры: "...RNRNNRNNNRNN...", что то же самое как "..101001000100...". Очевидно, что "...010110111011..."="...RNRNNRNNNRNN..."="...RNRNNRNNNRNN..."="...RNRNNRNNNRNN..."="..101001000100...". Длительности так же, как и в 2. в)-ж).


4. Терминология и обозначение. "Бит данных" и "бит синхронизации" в MFM-потоке здесь.

а) "Бит данных" - смотрим пункт 1, и ничего более!

б) Это в FM-потоке всегда есть однозначная информация о синхронизации, поэтому там как бы можно применить термин "бит синхронизации". А в MFM-потоке это не так... Считаю, что этот термин здесь вообще не приемлим. Лично у меня в голове не укладывается, как информация о синхронизации может меняться... Вы можете себе представить, чтобы у UART-а стартовый бит был то 0, то 1, в зависимости от данных?... И так же со стоповым битом, в зависимости от данных?... Ну Вы же знаете как реагирует UART на такие ситуации! Frame Error!!!


5. Владимир, вот ты расписал у себя и про синхросбой, и про два варианта дешифратора. Есть вопрос к тебе: предположим, что кортроллер уже успешно прочитал синхросбой и эпилог (или пролог? забыл уже... ну тот, который в начале) поля данных, читает данные. А там у нас идут $F5, $55, $99, то есть ...11110101 01010101 10101010..., то есть ...0101010100010001 0001000100010001 0100010001000100... Как он среагирует на это?

Турбо АГАТ-9/16 (ЦП 65C802, 5 Махов, dual-port SRAM).

2 Отредактировано Voldemar0 (11-11-2018 20:19)

Re: MFM кодек

Я ещё не расписал. Это только одна глава, а их будет больше. И я нигде и никому не сообщал о том, что вообще закончил даже эту. На сайте ссылок на них нет, разве что из скрипта обновлений.

Про два варианта дешифратора не понял. Откуда два варианта? В смысле вг93 и агат ?

Про F5..55..99  тоже не понял, а в чём проблема -то? Расшифрует.
Если ты про 100010001 - это нормальная последовательность.

100010001
dsdsdsdsds
1 0 1 0 1

Правила синхронизации не нарушены, нормально всё.

Только что значит "А там у нас идут" ? У кого "нас" ? агат или что?
Потому что у агата сигнатуры полей 6a 95 и 95 6a. Хотя контроллер агата никаких ограничений не накладывает на них.


И про "бит синхронизации". Само слово "синхронизация" идёт из агатовских мануалов. Текст же про агат.
Там есть такое "синхросбой", "запись синхросбоя" и т.д. Cуть всех этих явлений именно в искажении потока таким образом, чтобы дешифратор попал в нетипичное, для обычного нормального чтения, состояние. Достигается это подменой (или дополнением) вот этого самого бита - я и называю его битом синхронизации.

Если говорить о работе агатовского дешифратора и синхронизации фазы приёма бита, то он синхронизуется по каждому фронту принятой единицы, будь то бит данных или бит ... как его назвать тогда ? тактирования ?

Можно привести ещё один довод за такое название: этот бит ставится в единицу в тот момент, когда среди данных появляется много нулей. Много нулей - это (даже если забыть о полосе пропускания дисковода) шанс для дешифратора потока рано или поздно рассинхронизоваться. Т.е. когда, наконец, появится единица,
есть вероятность, что декодер уже уйдёт по фазе настолько далеко, что ошибётся в числе прошедших нулей.
И таки тогда этот самый бит без названия становится синхронизующим работу дешифратора.

3

Re: MFM кодек

Владимир, не злись, пожалуйста. И не нервничай, пожалуйста.
Лично у меня есть определенные непонятки. Ты выложил измышления, вроде как ты разобрался в этом, вот я и пытаюсь прояснить эти непонятки для себя...

Вот два непонятных момента:

1. Есть ...10001..., контроллер может совершенно штатно декодировать в ...101... (однозначная ситуация в отличие от ...101010101010...->...000000... и ...010101010101...->...111111...), и эта же сигнатура ...10001... используется для синхросбоя... Как это?

2. Как определить начало байта?

Турбо АГАТ-9/16 (ЦП 65C802, 5 Махов, dual-port SRAM).

4 Отредактировано Voldemar0 (12-11-2018 05:26)

Re: MFM кодек

Поток чтения бьётся на равные отрезки времени t. В каждый отрезок времени на входе предполагается либо логический ноль либо единица (логика автомата может корректировать фазу и она выравнивает длительность единиц на входе, но пока это не важно).

Дешифратор имеет счётчик бит. Также он имеет несколько фаз (состояний), в которые переходит в зависимости от нескольких, ранее
принятых бит. Фаз всего 8. Я их ещё буду описывать на сайте. Но если совсем просто: каждый чётный бит считается битом данных, каждый нечётный - битом синхронизации. Таким образом можно для простоты считать, что фазы всего две - чётная и нечётная.

Если комбинация 10001 заходит на дешифратор с чётной фазы - то она валидная и декодируется в последовательность 101. Если с нечётной, то уже при обработке четвёртого бита автомат меняет фазу и сбрасывает счётчик принятых бит.
Сброс счётчика - это синхронизация по выходящим битам (ну или по байтам).

В любом случае последняя единица будет задвинута в накопительный регистр как декодированный бит данных, а фаза сменится на нечётную. Это - синхронизация по входящим битам.

Сброс счётчика бит (обычно он считает вверх до 8) - это и есть выделение начала байта. Так как именно по переполнении этого счётчика декодированный байт передаётся в регистр хранения, откуда его может забрать драйвер.

Пример кода расшифровки синхронизации:

ibuf - байт с ib_cnt накопленными входящими битами
obuf - байт с ob_cnt декодированными битами
prev_v, v, t  - промежуточные переменные

    while ib_cnt > 1 do begin
      t := ibuf shr (ib_cnt - 2);  // Получили очередные два бита из входных данных
      case t of
        0: v := 0;
        1: v := 1;
        2: v := 0;
        3: RunError(3);  // двух соседних единиц быть не может
        else RunError(2); // ошибка логики программы
      end;  // v - декодированный бит данных

      if prev_v or v or t = 0 then begin // Если все три переменных равных нулю
        // Сихросбой, пропускаем один входной бит и сбрасываем счётчики бит выходного потока
        ob_cnt := 0;
        obuf := 0;
        dec(ib_cnt); // меняем фазу декодирования
        sync := True; // выставляем флаг сбоя синхронизации
      end else begin
        // Всё путём, добавляем полученный бит, выщёлкиваем два бита и идём дальше
        addbito(v);
        dec(ib_cnt, 2);
      end;
      ibuf := ibuf and mask[ib_cnt];

      prev_v := v;
    end;