Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> VHDL

Построение надежного таймера в VHDL: подсчет тактовых циклов до часов

В более ранних уроках мы использовали оператор wait for для задержки времени в симуляции. Однако wait for нельзя использовать в производственных дизайнах, потому что реальную схему нельзя приказать приостановиться. Практический способ измерения времени в VHDL-модуле — подсчет тактовых циклов.

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

Эта статья является частью серии базовых уроков VHDL.

Мы реализуем счетчик, который увеличивается на каждом фронте нарастающего тактового сигнала. Когда счетчик достигает значения частоты тактового сигнала, прошла одна секунда и вторичный счетчик «Секунды» увеличивается. Подобный подход используется для минут (инкремент после 60 секунд) и часов (инкремент после 60 минут). Дополнительные счетчики могут быть объединены в цепочку для дней, недель или месяцев, ограниченных только ресурсами ПЛИС/ASIC и требуемой шириной счетчика.

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

Упражнение: Реализация таймера

Следующий VHDL-тестбенч демонстрирует простой тактовый сигнал 10 Гц для сохранения разумного времени симуляции. DUT — это таймер, выводящий сигналы Seconds, Minutes и Hours.

library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity T18_TimerTb is end entity; architecture sim of T18_TimerTb is -- Slow clock for fast simulation constant ClockFrequencyHz : integer := 10; -- 10 Hz constant ClockPeriod : time := 1000 ms / ClockFrequencyHz; signal Clk : std_logic := '1'; signal nRst : std_logic := '0'; signal Seconds : integer; signal Minutes : integer; signal Hours : integer; begin -- Device Under Test (DUT) i_Timer : entity work.T18_Timer(rtl) generic map(ClockFrequencyHz => ClockFrequencyHz) port map ( Clk => Clk, nRst => nRst, Seconds => Seconds, Minutes => Minutes, Hours => Hours); -- Clock generator Clk <= not Clk after ClockPeriod / 2; -- Testbench sequence process is begin wait until rising_edge(Clk); wait until rising_edge(Clk); -- Release reset nRst <= '1'; wait; end process; end architecture; 

Ниже приведен сам модуль таймера. Он считает тики, секунды, минуты и часы, сбрасывая все счетчики при утверждении отрицательного сброса (nRst).

library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity T18_Timer is generic(ClockFrequencyHz : integer); port( Clk : in std_logic; nRst : in std_logic; -- Negative reset Seconds : inout integer; Minutes : inout integer; Hours : inout integer); end entity; architecture rtl of T18_Timer is -- Count clock periods signal Ticks : integer; begin process(Clk) is begin if rising_edge(Clk) then if nRst = '0' then Ticks <= 0; Seconds <= 0; Minutes <= 0; Hours <= 0; else if Ticks = ClockFrequencyHz - 1 then Ticks <= 0; if Seconds = 59 then Seconds <= 0; if Minutes = 59 then Minutes <= 0; if Hours = 23 then Hours <= 0; else Hours <= Hours + 1; end if; else Minutes <= Minutes + 1; end if; else Seconds <= Seconds + 1; end if; else Ticks <= Ticks + 1; end if; end if; end process; end architecture; 

Волновые формы подтверждают корректную работу: Seconds увеличивается каждый тик, Minutes после 60 секунд, и Hours после 60 минут.

В симуляции мы запустили 50-часовой тест с run 50 hr в ModelSim, используя 10 Гц тактовый сигнал для управления временем выполнения. Настройка частоты тактового сигнала в тестбенче — распространенная стратегия для ускорения верификации.

В реальном оборудовании цепочка счетчиков должна завершиться в течение одного тактового периода. По мере роста ширины счетчика задержка распространения увеличивается, потенциально превышая период и вызывая нарушения таймингов. Точный предел зависит от семейства ПЛИС/ASIC и скорости тактового сигнала.

Ключевые выводы

Переходите к следующему уроку для продвинутых функций таймера.

VHDL

  1. Создание списков строк в VHDL: лучшие практики и пример
  2. Создание Tcl-управляемого тестбенча для VHDL-модуля кодового замка
  3. Корректное завершение симуляции VHDL-тестбенча
  4. Реализация PWM-контроллера в VHDL: проектирование, симуляция и FPGA-демо
  5. Генерация случайных чисел в VHDL: от Uniform к OSVVM
  6. Проектирование надежного кольцевого буфера FIFO на VHDL в блочной ОЗУ
  7. Как создать самопроверяющийся тестбенч в VHDL — практическое руководство
  8. Реализация динамического связного списка в VHDL с защищенными типами и указателями доступа
  9. Использование внутрипроцессных процедур для более чистого проектирования FSM на VHDL
  10. Освоение функций VHDL: практическое руководство по эффективному дизайну