nabbla (nabbla1) wrote,
nabbla
nabbla1

Categories:

Счётчик в кодах Грея

Очередная шлея под хвост попала. В принципе, мне такие счётчики ВОТПРЯМЩАС не нужны, так, "идейки" всякие бредовые, но вот захотелось. Вообще, я тут "на чемоданах сижу", вот-вот на поезд в Питер, за фотоприёмными матрицами, и чем-то серьёзным в это время заниматься все равно не получается.

Так вот, я с удивлением обнаруживаю, что готового библиотечного модуля счётчика в кодах Грея от Альтеры/Интела нет (по кр. мере под Flex10k), и "гугление" (точнее DuckDuckGo - "кряканье?") практически ничего не дало. Есть видюшки от вездесущих индийцев, где они на примере счётчиков Грея объясняют, как разрабатывается конечный автомат, но там 2-3 бита всего, и как "автоматически" расширить на большее - непонятно. Несколько раз натыкался на модули, где выходы ОБЫЧНОГО БИНАРНОГО СЧЁТЧИКА преобразовывались в коды Грея, либо ещё веселее - в регистре хранился текущий выход в коде Грея, он преобразовывался в бинарный, прибавлялась единичка, результат назад в Грея - и на вход этого регистра. Мазохисты, блин!



Сколько-нибудь полезная информация нашлась на сайте Интела, в виде сгрызенных им обломков сайта Альтеры. А именно, предлагался модуль 8-битного счётчика Грея на VHDL, а ещё некий Application Brief 135, подсказывающий, как можно очень эффективно реализовать такой счётчик на Flex 8000, на языке AHDL, альтеровский язык, позволяющий залезть в "потроха" логических элементов и напрямую указать, что и как там коммутировать. Вот только это должен был быть комментарий к файлу, который нужно было достать через BBS, по указанному телефону. 1994 год, чо :) Без файла не шибко понятно, что к чему.

Так что самое время предложить свою параметризуемую реализацию такого счётчика, но сначала чуть расскажу, что это вообще такое и для чего нужно.


При обычном счёте в двоичном коде, да и в любом другом, случаются моменты, когда сразу много разрядов должны переключиться одновременно. Типа того, как на часах 23:59:59 должны смениться 00:00:00. На микросхемах малой степени интеграции очень любили делать "асинхронные" счётчики, где тактовой частотой для следующего делителя частоты выступает выход предыдущего. Они же "счётчики пульсаций", ripple counters. Они самые простые, но имеют нехорошую особенность, что каждый следующий разряд переключается с некоторым запозданием относительно предыдущего. И если мы попытаемся записать время в тот момент, когда младший разряд переключился, а старший ещё нет, мы вполне можем получить 23:00:00, что НА ЧАС отличается от истинного значения.

На ПЛИС делать такие штуки категорически не рекомендуется, вместо них используют синхронные счётчики, где на каждый триггер подаётся одна и та же тактовая частота, но используется вход "разрешения счёта", который исходя из младших разрядов определяет "заблаговременно" (перед фронтом тактовой частоты), каким битам надо переключиться, а каким нет!

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

Главное, не использовать такие сигналы для асинхронного сброса и установки - на то они и асинхронные, что могут и на очень коротенький, случайно сформированный импульс, отреагировать! Ну и когда нужно так или иначе передать информацию на цепи, работающие от другой тактовой частоты (crossing clock domain), может случиться много весёлого.

Дак вот, давным давно придумали код, который назвали кодом Грея. По закону Арнольда, придумал его вовсе не Грей, как и закон Арнольда придумал вовсе не Арнольд :) Так вот, можно перебрать все возможные 2N состояний, каждое по одному разу (т.е тем или иным способом "сосчитать" их), и при этом при каждом переходе к следующему состоянию у нас будет меняться ТОЛЬКО ОДИН БИТ.

"Ручками" оно строится так. 1-битные коды Грея - это просто
0
1

Ну, почему бы и нет.

При добавлении следующего бита, мы сначала берём эту же последовательность, только добавляем ноль в старшем бите:
00
01

А потом эту последовательность В ОБРАТНОМ ПОРЯДКЕ, с добавленной единицей:

11
10


Итого, 2-битные коды Грея выглядят так:
00
01
11
10

Как видно, действительно каждый раз переключается всего один бит.

Приведём теперь 3-битные коды:
000
001
011
010
110
111
101
100


и так далее.

Используя счёт в кодах Грея, можно решить проблему с "комбинаторным мусором", когда при переключении между состояниями проскакивают неверные значения, как у нас между 23:59:59 и 00:00:00 вдруг промелькнуло 23:00:00. Тут уж заведомо, даже если биты приходят с некоторой задержкой, мы в любой момент времени получим либо ПРЕДЫДУЩЕЕ состояние, либо ТЕКУЩЕЕ. Никакого другого вдруг появиться не может.

Поэтому и дешифраторы будут работать "чисто".

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

При условии, конечно, что счётчик в кодах Грея столь же прост, как обычный двоичный, и нам не нужно делать арифметику в кодах Грея.


Продолжение следует...
Tags: ПЛИС, программки, работа, странные девайсы
Subscribe

Recent Posts from This Journal

  • Так ли страшно 0,99969 вместо 1?

    В размышлениях о DMA, о возможных последствиях "смешивания" старых и новых значений при выдаче целевой информации, опять выполз вопрос: насколько…

  • Как продлить агонию велотрансмиссии на 1500+ км

    Последний раз о велосипедных делах отчитывался в середине мая, когда прошёл год "велопробегом по коронавирусу". Уже тогда я "жаловался", что…

  • DMA для QuatCore

    Вот фрагмент схемы нашего "процессорного ядра" QuatCore: Справа сверху "притаилась" оперативная память. На той ПЛИС, что у меня есть сейчас…

  • "МКО через UART" в железе - 2

    Продолжим проверять этот модулёк. "Для закрепления пройденного", снова запрашиваем телеметрию, сначала 1 слово данных (командное слово 0x3701, и…

  • "МКО через UART" в железе

    Долго мучали эту штуковину на симуляции, пора уже в макет это прошить и посмотреть, как оно себя поведёт. Оставлю "основную схему" (процессор, SPI,…

  • "Ошибка на единицу" при передаче CRC

    В прошлый раз обнаружили нехорошую вещь: при передаче данных от нашего устройства, CRC начинает работать одним словом раньше, чем надо, и результат…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 7 comments