Pull to refresh

Элемент задержки на VHDL. Другой взгляд

Programming microcontrollers *
Sandbox
Доброго дня.
Ответ на топик "Элемент задержки на VHDL" подготовлен для того чтобы дать представление о возможных реализациях задержек сигналов в ПЛИС.

Схемы с асинхронным сбросом нисколько не хуже синхронных схем. Но только в том случае, когда у Вас есть твердые знания в временных задержках между сигналами, приходящими на вход и рассчитанные временные задержи для вашей реализации в вашей ПЛИС. Но тут же теряется главное преимущество ПЛИС — возможность добавить новую функциональность в схему или поменять используемые контакты для ввода-вывода сигналов, так как для каждой новой реализации придется учитывать ее новые временные задержки и не факт что они Вам подойдут.

В случае схемы из топика «Элемент задержки на VHDL» задержка будет почти требуемой только в особом случае — фронт reftime идет сразу после фронта опорной частоты. Да и зачем эта навороченная логика?

Гораздо проще, если нужна малая задержка, поставить несколько D-триггеров с синхронизацией от опорной частоты. В данном случае задержка будет кратной периоду опорной частоты clk20Mhz. В приведенном ниже примере при отсутствии сигнала сброса при каждом фронте сигнал B повторит сигнал А, сигнал С повторит сигнал B. Задержка между сигналами А и С будет в два периода опорной частоты. Добавить новых D-тригеров для достижения нужной задержки.

  1. process (clk20Mhz,reset,A) --процесс со списком чувствительности сигналов  
  2.   begin    
  3.    if reset = '1' then  
  4.     B <= '0';  
  5.     C <= '0';      
  6.    elsif (clk20Mhz'event and clk20Mhz = '1') then  
  7.     B <= A;  
  8.     C <= B;  
  9.    end if;  
  10.  end process;  


В случае, когда требуется получить задержку меньше опорной частоты (то есть тактировать триггеры на более высокой частоте), то придется применить Digital Clock Manager. На вход блока подаем опорную частоту и параметры новой частоты (есть готовый выход удвоенной частоты, но можно вывести частоту умноженную на соотношение целых коэфициентов; деление частоты тоже возможно). Полученную частоту используем для тактирования процесса с триггерами и получения задержки менее периода опорной частоты входящей в ПЛИС от кварцевого генератора.

Возможно легко получить удвоенную частоту и без DCM, используя вместо условия возникновения фронта сигнала (clk20Mhz'event and clk20Mhz = '1') условие изменения сигнала (clk20Mhz'event), то есть при каждом фронте или спаде опорной частоты, но важно, чтобы период высокого уровня был равен периоду низкого уровня.

Третий случай, когда необходимо получить задержку на время намного превосходящее период опорной частоты. Неразумно тратить целый DCM на создание «медленной» частоты. Гораздо выгоднее создать счетчик. При отсутствии сигнала сброса по каждому фронту логический вектор, хранящий в себе значение отсчитанных тактов будет увеличиваться, пока не выполнится условие достижения заданной нами константы x«FF» равной десятичному числу 255 и сигнал А поменяет свое значение на противоположное. Это простой делитель опорной частоты в частоту сигнала А с коэффициентом 254. Спасибо Ocelot за замечание, это простой делитель опорной частоты на счетчике — каждый подсчёт до 256 отмечает половину периода новой частоты. Полученная частота будет в 512 раз меньше опорной. Хотя никто не запрещает в ПЛИС использовать логический вектор из большего числа разрядов, но тут возрастет сложность в разводке. Лучше использовать каскад счетчиков.

  1. process (clk,reset)  
  2.  begin  
  3.   if reset = '1' then  
  4.    A <= '0';  
  5.    count <= (others=>'0'); -- обнуляем все разряды логического вектора count  
  6.   else  
  7.    if rising_edge(clk) then  
  8.     if count=x"FF" then  
  9.      count <= (others=>'0');  
  10.      A <= not A;  
  11.     else  
  12.      count <= count + 1;  
  13.     end if;   
  14.    end if;  
  15.   end if;  
  16. end process;  



В заключении, в синхронных схемам реализуемых в ПЛИС задержка всегда кратна периоду частоты. В случае синхронных входных сигналов можно получить задержку с точностью не более времени распространения сигнала в ПЛИС между каскадами триггеров. В случае асинхронных входных сигналов, можно получить задержку не менее и не более времени кратного периодам опорной частоты. Для этого и делается умножение частоты для сужения временного интервала задержки.

И стоит приглядеться к самосинхронным схемам — за ними будущее ПЛИС.

Спасибо.
Tags:
Hubs:
Total votes 12: ↑11 and ↓1 +10
Views 8.1K
Comments Comments 4