Серый код fifo, получающий количество элементов в буфере - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть 2 разные часы, один для чтения и один для записи. Я использую серый код для синхронизации указателей с дополнительными двумя триггерами для синхронизации на разных тактовых сигналах входного сигнала.

В статьях, которые я прочитал, показано, как определить полный и пустой сигнал, используя код Грея, сравнивая 2MSB для полного состояния и равенство для пустого состояния.

Однако мне нужно получить количество элементов в буфере, а не только полный или пустой сигнал. Можно ли это сделать с серым кодом?

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

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

Сначала: отредактируйте исходное сообщение и добавьте этот вопрос и информацию.

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

В-третьих: асинхронный FIFO использует серый код, потому что за один раз изменяется только один бит. Важно, что этот процесс является круговым. Таким образом, разница между вашим последним и вашим первым значением также отличается только на один бит:

Counter   Gray-code
  000       000
  001       001
  010       011
  011       010
  100       110
  101       111
  110       101
  111       100 <-- Last 
  000       000 <-- First again

Это работает тогда и только тогда, когда глубина (и, следовательно, счетчики) являются степенью двойки. Поэтому a-синхронный FIFO всегда имеет глубину, которая является степенью двойки.

Если вы должны иметь другую глубину, вы можете добавить синхронный FIFO в начало или конец. Однако, если подумать: FIFO - это просто эластичный буфер. Поведение, если оно, например, Глубина 16 записей или 12 записей не отличаются, кроме того, что у вас есть потенциал для хранения большего количества значений.

Последнее: как сказал суперкат: вы преобразовываете двоичный код в код Грея, переходите в другой домен часов, а затем снова переводите код Грея в двоичный код. В домене конечных часов вы можете безопасно сравнивать счетчики чтения и записи, чтобы определить уровень заполнения FIFO.
Если уровень необходим как на стороне чтения, так и на стороне записи, вы должны реализовать этот процесс дважды, по одному разу в каждом тактовом домене.

0 голосов
/ 28 апреля 2018

Самый понятный способ вычислить разницу между двумя значениями серого кода - это синхронизировать их с общими часами, преобразовать их в двоичные, а затем выполнить обычное двоичное вычитание из них. Хотя может быть возможно спроектировать полностью комбинаторную схему, которая вычисляла бы разницу между двумя значениями кода Грея таким образом, что если все биты одного конкретного значения стабильны, а один бит в другом значении изменяется, то только один бит на выходе изменится, а все остальные останутся стабильными, такой дизайн будет намного сложнее, чем тот, который просто синхронизирует оба счетчика, преобразует в двоичный файл и вычитает.

...