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

Как правильно передать информацию из одного клокового домена в другой?

Здравствуйте, господа.

 

Простенький вопрос.

 

Есть два клоковых домена, частоты никак между собой не связаны, но известно, что F1 примерно = 1.1*F2 .

 

Из домена F2 надо передать в домен F1 несколько сигналов (2..8), каждый из которых представляет из себя одиночный импульс (длительность импульса = 1 такту F2).

Известно, что длительность паузы между импульсами в одном сигнале очень большая (несколько тысяч тактов F2).

В разных сигналах импульсы могут приходить с задержкой в не меньше, чем 4 такта F2.

 

В домене F1 надо получить те же импульсы, но синхронизированные по F1.

Задержка между приходом импульса в домене F2 и уходом импульса, синхронизированного в F1 в несколько тактов - допустима.

 

Собственно, как такую вот вещь можно сделать максимально правильно - т.е. с использованием небольших ресурсов и с гарантией от метастабильности?

 

Xilinx, Virtex-5...

 

Всем заранее спасибо за ответы.

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


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

Кажись вот это

http://electronix.ru/forum/index.php?s=&am...st&p=534843

то что вам нужно

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


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

Поставить стандартное FIFO на 2..8 бит минимальной глубины (на LUT), писать только если один из битов ненулевой. С учетом соотношения тактовых частот доменов и пауз между импульсами в нем никогда не будет более одного слова. Это будет не самое (мягко говоря) оптимальное по площади решение, однако самое быстрое и беспроблемное: всю логику пересечения домена вам сделает тысячу раз проверенная мегафункция. А раз у вас Virtex-5 - то порядок потраченных ресурсов вас вряд ли озаботит.

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


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

Ну если передавать надо не на каждом такте, то можно так

signal buf : std_logic_vector(1 downto 0):="00";

.....

  process(clk)
  begin
  if clk'event and clk='1' then
     buf(0) <= input;
     buf(1) <= buf(0);
     if (buf="01")then
          output <= '1';
     end if;                
   end if;
  end process;

 

где clk - клок на который нужно пересадить Ваш импульс.

input - входной импульс,

output - импульс на частоте clk

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


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

удалил плохой код, написал новый. Оцените.

module  CC(input bit clkrc, dattr, output bit datrc);
  bit ff1, ff2;
  always @(posedge dattr, posedge datrc)
    if(datrc) ff1 = 0;
    else ff1 = 1;
  always @(posedge clkrc)
  begin
    ff2 <= ff1;
    datrc <= ff2 & ff1;
  end
endmodule

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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