Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как правильно передать информацию из одного клокового домена в другой?
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Koluchiy
Здравствуйте, господа.

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

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

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

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

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

Xilinx, Virtex-5...

Всем заранее спасибо за ответы.
Kuzmi4
Кажись вот это
http://electronix.ru/forum/index.php?s=&am...st&p=534843
то что вам нужно
DmitryR
Поставить стандартное FIFO на 2..8 бит минимальной глубины (на LUT), писать только если один из битов ненулевой. С учетом соотношения тактовых частот доменов и пауз между импульсами в нем никогда не будет более одного слова. Это будет не самое (мягко говоря) оптимальное по площади решение, однако самое быстрое и беспроблемное: всю логику пересечения домена вам сделает тысячу раз проверенная мегафункция. А раз у вас Virtex-5 - то порядок потраченных ресурсов вас вряд ли озаботит.
Mad_max
Ну если передавать надо не на каждом такте, то можно так
Код
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
ViKo
удалил плохой код, написал новый. Оцените.
Код
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
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.