Цитата(scifi @ Jul 10 2010, 00:45)

Пришёл к некому решению. Поиск по патентам США привёл к патенту, в котором та же задача решена точно так же :-) Если надо, могу попробовать снова найти этот патент.
Если не сильно у Вас отниму время - то был бы благодарен за информацию.
Цитата(scifi @ Jul 10 2010, 00:45)

Я как-то раз решал похожую задачу: нужен был тикающий счётчик в EEPROM, и надо было сделать wear-leveling, то есть чтобы при каждом приращении счётчика менялся только 1 байт, и частота изменения байтов счётчика была приблизительно одинаковой. У Вас не та же задача?
Давайте я попробую обрисовать задачу, зачем мне это понадобилось.
Сразу скажу, что всё реализуется в ПЛИС. Есть счётчик (грубо говоря счётчик времени) с тактовой частотой 100 МГц, значения с его выхода поступают по шине в некий блок, в который заходит тактовая частота 30 МГц, другой нет. В этом блоке на частоте 30 МГц необходимо защёлкнуть значения времени, изменяющиеся с частотой 100 МГц. Поскольку частоты разные - при обычной бесхитростной реализации "в лоб" очень часто будет возникать метастабильность, гонки фронтов и т.п., в результате чего правильные значения времени будут защёлкиваться далеко не всегда. Поэтому невозможно гарантировать безошибочное защёлкивание показаний времени (пусть хотя бы с погрешностью, связанной с изменяющимся взаимным положением фронтов частот 100 МГц и 30 МГц), т.е. могут быть не только погрешности, но и грубые промахи отсчётов, когда, скажем, в результате метастабильности, неправильно защёлкнулся старший разряд.
Для подавления метастабильности зачастую используют код Грея, т.к. у него в один момент изменяется только 1 бит, и последовательно сменяющиеся значения могут приобрести ошибку всего на единицу: либо счётчик в момент защёлкивания останется в предыдущем состоянии (без изменений), либо защёлкнется новое значение. Однако применение кода Грея для борьбы с метастабильностью имеет смысл только, когда частоты сигналов приблизительно одинаковые, но фронты не синхронные.
В моём же случае частоты существенно разные: 100 МГц и 30 МГц. При использовании кода Грея я смогу получить изменение одного разряда с тактовой частотой в 2 раза ниже, чем 100 МГц, т.е. 50 МГц. А защёлкиваю я эти значения на частоте 30 МГц, т.е. ещё почти в 2 раза медленнее. Таким образом, из-за гонок фронтов, связанных с разностью длин связей отдельных разрядов шины данных, я опять не могу гарантировать отсутствие промахов (грубых ошибок) измерения временных отсчётов.
Ладно, если частота защёлкивания 30 МГц уже ближе к 50 МГц, уже можно что-то придумать. Но уже появился спортивный интерес найти универсальное решение, работающее в общем случае, не только, когда частоты близки друг к другу.
Вот тут и возникает потребность, как я писал в первом сообщении, в некоем коде Грея, только равномерном, интервал неизменности каждого разряда которого увеличивался бы с увеличением числа бит в коде. Т.е. берём 2-битный код - имеем неизменность по одной линии 2 такта. Берём 4-битный код - неизменность 4 такта. Берём 10-битный код - неизменность 10 тактов по одной линии. Ну может не так линейно, например, для 10 битов неизменность 7 или 8 тактов, но всё равно, чтобы интервал неизменности увеличивался с числом бит кода.
Ну и при этом нужно, чтобы свойство кода Грея оставалось: в каждом такте меняется только один бит.
Тогда: имея такой код, я получу тактовую частоту изменения сигнала по каждой линии шины данных в несколько раз (пусть в N) ниже исходной тактовой (в обычном коде Грея - всего в 2 раза, что меня не устраивает). В таком случае я смогу защёлкивать значения счётчика на частоте, в N раз меньшей тактовой частоты самого счётчика.
Согласны?
Цитата(petrov @ Jul 9 2010, 18:00)

Если из нескольких слов грея такой код составить?
Например
00 00
00 01
01 01
01 11
11 11
11 10
10 10
10 00
Спасибо, судя по Вашему примеру - то, что мне нужно.
... правда я пример понял, а как это образуется, какими формулами описывается и какие свойства (правда ли на всём диапазоне счёта будет изменяться не более 1 цифры за раз, правда ли частота повторения каждого разряда во всём диапазоне счёта ниже в несколько раз тактовой частоты исходного счётчика) у такого кода - не понял. Не разжуёте немножко теорию?
Цитата(Ant_m @ Jul 9 2010, 18:14)

Просто, мне кажется, что цифра 2 берется от того, что код бинарный. Если брать тринарный код, то цифра будет 3, т.е бит в коде будет меняться за 3 такта. Ну и так далее, т.е это число определяется реализацией системы счисления.
Видимо, не совсем так. В двоичной системе такое тоже возможно, как показал уважаемый
Oldring в
этом сообщении.