Перейти к содержанию
    

Как передать все возможные значения счётчика из одного клокового домена в другой?

Есть первый клоковый домен. В нём реализован счётчик. Есть второй клоковый домен. Как можно передать все возможные значения счётчика во второй домен.

 

Классическая реализация подразумевает запрос - ответ с использованием синхронизаторов.

 

Есть ли решения позволяющие иметь на второй стороне все возможные значения счётчика.

 

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

 

Есть ли решения для большей разрядности и не зависящие от соотношения частот? Искажения кодов не допустимы. Пропуск кода или повторные коды само собой допустимы.

 

Т.е. вот такие результаты выходов вполне допустимы

1: 1-2-4-5-7-8-10-11-...

2: 1-1-2-2-2-3-3-4-4-4-4-...

 

Вопрос скорее теоретический. Любопытно возможно ли такое и как реализовать наиболее простым способом.

Возможно есть частные решения для передачи из домена с болей частотой в домен с меньшей. Или наоборот.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

 

Классика :

             ---clk_1---      |         ---  clk2  ---- 
счетчик -> bin_to_gray -> reg -> reg ...-> gray_to_bin -> reg

 

Успехов! Rob.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Код Грея (хорошо подходит для счетчиков).

2. Механизм рукопожатия (handshake).

3. FIFO.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Классика :
             ---clk_1---      |         ---  clk2  ---- 
счетчик -> bin_to_gray -> reg -> reg ...-> gray_to_bin -> reg

Классика допускает искажение кодов. Причём как в плюс так и в минус. Причём чем большая разрядность тем большее искажение будет.

 

1. Код Грея (хорошо подходит для счетчиков).
Он искажает коды
2. Механизм рукопожатия (handshake).
Как его применить для получения всех кодов?
3. FIFO.
Не очень понял идею? Что даст замена двух регистров на их аналог в виде памяти?

 

 

Пока я вижу вариантом такой:

Есть циклический буфер в который в домене один пишутся коды. На второй стороне идёт вычитывание из памяти по указателю с заранее сформированным инкрементом. Инкремент жёстко зависит от соотношения частот (некий аналог DDS). В результате имеем гарантированно стабильное чтение из памяти. Если правильно поборать фазировку сигналов :)

 

Можно ли как то формировать автоматически этот коэффициент для инкремента?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

FIFO не подойдёт, т.к. подразумевается разница частот, а значит буфер или переполнится или будет пустым.

module cnt_copy
(    input    clk1,
     input    clk2,             
     output reg    [7:0]    cnt1,
     output reg    [7:0]    copy2 );
reg    ready1 = 0;
reg    ready2 = 0;
reg    ready1_l1, ready1_l2;
reg    ready2_l1, ready2_l2;
reg    [7:0]    cnt1_l;
always @ (posedge clk1)
     begin
     ready2_l1 <= ready2; ready2_l2 <= ready2_l1;
     cnt1 <= cnt1 + 1;
     if (ready2_l2)
         begin
         if (~ready1)
             begin
             cnt1_l <= cnt1;    ready1 <= 1'b1;
             end
         end
     else
         begin
         ready1 <= 1'b0;
         end
     end    
always @ (posedge clk2)
     begin
     ready1_l1 <= ready1;    ready1_l2 <= ready1_l1;    
     if (ready1_l2)
         begin
         if (ready2)
             begin
             copy2 <= cnt1_l; ready2 <= 1'b0;
             end
         end
     else
         begin
         ready2 <= 1'b1;
         end
     end
endmodule

Результат

post-17402-1445340651_thumb.png

Указать таймбара стоит, как раз, на моменте, начиная с которого происходит передача значения "3". Далее тоже видно как передаются значения. С пропусками из-за синхронизации, но без искажения передаваемого значения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

 

Ну понеслись решения .....

Смотрим требования TC

 

... Искажения кодов не допустимы. Пропуск кода или повторные коды само собой допустимы.

 

Т.е. вот такие результаты выходов вполне допустимы

1: 1-2-4-5-7-8-10-11-...

2: 1-1-2-2-2-3-3-4-4-4-4-...

 

И почему тут классика не годится ???

 

Удачи! Rob.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

module cnt_copy
Это я так понял запрос ответ с синхронизацией. Многовато кодов пропускает :(

 

И почему тут классика не годится ???
Потому что классика с Греем искажает коды. И чем больше разрядность счётчика тем больше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это я так понял запрос ответ с синхронизацией. Многовато кодов пропускает :(
Да, это запрос-ответ. Но и

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

Чтобы пропускало меньше кода надо для счёта использовать не саму частоту тактирования, а поделенную на 2..4.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чтобы пропускало меньше кода надо для счёта использовать не саму частоту тактирования, а поделенную на 2..4.
Так каждый может :)))))

 

Интересно решить оригинальную задачу.

 

Вариант с двухпортовой памятью как идея очень даже ничего. Ищу другие.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Потому что классика с Греем искажает коды. И чем больше разрядность счётчика тем больше.
Это с какого перепугу она искажает? Вы код Грея с бинарным не перепутали?

 

Да, частота со счетчика должна быть гарантированно меньше, чем частота синхронизации в приемном домене. Это легко получить откинув младшие разряды (в исходном двоичном счетчике, до преобразования в код Грея)

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

FIFO не подойдёт, т.к. подразумевается разница частот, а значит буфер или переполнится или будет пустым.

 

У FIFO есть сигналы EMPTY, FULL. Если все сделать правильно, то пропусков не будет. Совсем.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это с какого перепугу она искажает? Вы код Грея с бинарным не перепутали?
Упс.... я вообще с чем то своим перепутал.... Согласен коды грея подходят если при частоте счёта меньше второй частоты.

 

Как быть если счёт идёт на большей частоте. И потеря младших бит не выход?

 

 

У FIFO есть сигналы EMPTY, FULL. Если все сделать правильно, то пропусков не будет. Совсем.
Если не секрет как именно их использовать? Я пока плохо понимаю саму идею.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как быть если счёт идёт на большей частоте. И потеря младших бит не выход?
В этом случае младшие биты будут отражать погоду на Марсе или фазу Луны. Ну или в крайнем случае нечто, зависящее от фаз клоков в 2х доменах, что мало отличается от фазы Луны.

Вам они точно нужны? :rolleyes:

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...