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

  • Так есть ли толк в ковариационной матрице?

    Задался этим вопросом применительно к своему прибору чуть более 2 недель назад. Рыл носом землю с попеременным успехом ( раз, два, три, четыре),…

  • Big Data, чтоб их ... (4)

    Наконец-то стряхнул пыль с компьютерной модели сближения, добавил в неё код, чтобы мы могли определить интересующие нас точки, и выписать…

  • Потёмкинская деревня - 2

    В ноябре 2020 года нужно было сделать скриншот несуществующей программы рабочего места под несуществующий прибор, чтобы добавить его в документацию.…

  • Великая Октябрьская резня бензопилой

    Сегодня прокатился прочистить Абрамцевскую просеку. Как обычно, с приключениями. Выезжал на велосипеде, а вернулся на самокате. Первый раз по этим…

  • Очередная несуразность в единицах измерения

    Когда-то я написал программу PhysUnitCalc - калькулятор, умеющий работать с размерностями. Мне казалось, что я наступил уже на все грабли, которые…

  • Big Data, чтоб их... (3)

    "В предыдущих сериях": мой прибор выдаёт 6 значений: 3 координаты и 3 угла, т.е все 6 степеней свободы твёрдого тела. Причём ошибки измерения этих 6…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 7 comments