Авторы: Peter J. Ashenden, Jim Lewis
Автор перевода: Беседа Д.Г.
Источник: Peter J. Ashenden, Jim Lewis. The Designer's Guide to VHDL. - 3rd ed. - Burlington: Library of Congress Cataloging-in-Publication Data, 2008. - p. 642 - 647
Опсиание:Приведено описание последовательной модели, управляемой по фронту сигнала и приведены примеры реализации таких моделей.
Моделирование последовательной модели, управляемой фронтом синхросигнала, реализуется процессами. Стандарт синтеза предоставляет большую гибкость при моделировании последовательной логики с управлением по фронту, поэтому не все средства синтеза реализуют полный набор возможностей. Предполагается, что назначение сигнала или переменной происходит под контролем условия синхронизации, которое подразумевает приход фронта сигнала. Для определения переднего фронта сигнала существуют следующие выражения:
Для спадающего фронта:
Можно использовать одно из этих условных выражений внутри процесса. Синхросигнал должен быть в списке чувствительности процесса. Любое назначение сигнала или переменной, которое находится внутри оператора if, является синхронным назначением, поскольку оно контролируется условием синхронизации. Оператор if может содержать другие (асинхронные) условия. Операторы назначения внутри таких операторов if, называются асинхронными операторами назначения, так как они контролируются не условиями синхронизации. Операторы в выражениях в правой стороне операторов назначения (синхронных и асинхронных), подразумевают соединение комбинационной логики со входами регистров. Можно включать и другие последовательные операторы внутри процесса помимо операторов назначения. Эти операторы управляют потоками данных от контроля продвижения сигналов до назначения. Таким образом, подразумеваются комбинационные устройства, например, мультиплексор, которые выдают информацию на входы регистров операторами назначения. Однако, существуют некоторые ограничения. Например, нельзя произвольно включать операторы wait, также нельзя ссылаться на синхросигналы в операторах назначения.
Пример 1 Регистр со срабатыванием по фронту
Одна из самых простых форм процесса, представляющего работу регистра, срабатывающего по фронту:
simple_reg : process ( clk ) is begin if clk'event and clk = '1' then reg_out <= data_in; end if; end process simple_reg;
В этом процессе, назначение reg_out – синхронное присваивание, которое контролируется передним фронтом сигнала синхронизации. Процесс представляет собой работу регистра с синхросигналом clk, входным сигналом data_in и выходным сигналом reg_out.
Пример 2 Регистр со срабатыванием по фронту с синхронными управляющими входами
Можно включать более сложные операторы внутрь условного оператора if, чтобы промоделировать схемы с синхронными управляющими сигналами. Например, следующий процесс моделирует работу регистра с синхронными сигналами reset и enable, управляющим соединением памяти с двумя выходными сигналами:
dual_reg : process( clk ) is begin if rising_edge(clk) then if reset = '1' then q1 <= X"00"; q2 <= X"0000"; elsif en = '1' then q1 <= d1; q2 <= d2; end if; end if; end process dual_reg;
В этом случае все назначения выходных сигналов синхронны и управляются по переднему фронту синхросигнала. Вложенный оператор if выбирает между сбросом, обновлением или сохранении текущих значений на выходе регистра. Средство синтеза может сделать вывод, что такой регистр обновляет сигнал на выходе при каждом приходе переднего фронта синхросигнала посредством мультиплексора, на вход которого поступают: 0-вое значение сигнала, входы данных регистра и выходы регистра (обратная связь). Другой способ – если целевое устройство поддерживает регистры с раздельными управляющими сигналами reset и enable, средство синтеза может использовать эти сигналы по конкретному назначению (а не как адресные входы мультиплексора). В разделе 21.7 описано как можно использовать атрибуты для выбора типа реализации.
Пример 3 Счетчики, как регистры с с арифметическими операциями
Можно скомбинировать вычислительную логику и работу с памятью в одном процессе. Вычислительная логика представлена выражениями в операторах назначения. Счетчики хорошо иллюстрируют этот подход. Следующий процесс представляет собой инкрементирующий/декрементирующий счетчик с синхронными сбросом, загрузкой и сигналом разрешения счета:
signal d_in, count : unsigned(11 downto 0); ... up_down_counter : process(clk) is begin if rising_edge(clk) then if reset = '1' then count <= X"000"; elsif load_en = '1' then count <= d_in; elsif count_en = '1' then if dir = '1' then count <= count + 1; else count <= count - 1; end if; end if; end if; end process up_down_counter;
Наращивание шага можно осуществлять параллельными операторами назначения, чтобы в любой момент можно было получить значение сигнала счета.
Tc <= '1' when std_match(count, X "111") else '0';
Пример 4 Регистр с асинхронными управляющими сигналами
Если реализуемая технология предусматривает регистры с асинхронными управляющими сигналами, можно представить их процессами, содержащими асинхронные назначения. Например, следующий процесс представляет регистр с асинхронным сигналом сброса:
reg: process (clk, reset) is begin if reset = '1' then q <= "0000"; elsif rising_edge(clk) then q <= d; end if; end process reg;
В этом процессе, первое назначение не контролируется синхросигналом; следовательно, это асинхронное назначение, а reset должен быть включен в список чувствительности процесса. Второе назначение синхронно и представляет собой модель поведения регистра, срабатывающего по фронту.
Пример 5 Сдвиговый регистр с асинхронным и синхронным управлением
Можно объединить асинхронное и синхронное управление в одном процессе. Например, сдвиговый регистр с асинхронным сбросом и синхронной параллельной загрузкой:
shift_reg: process(clk, reset) is begin if reset = '1' then q <= "00000000"; elsif rising_edge(clk) then if load_en = '1' then q <= d_in; else q <= q(6 downto 0) & d_s; end if; endif; end process reg;
Необходимо обратить внимание, что сигнал load_en не включен в список чувствительности, так как это синхронный управляющий сигнал.
Стандарт синтеза позволяет использование более сложных структур чем тех, что были приведены в предыдущих примерах. Например, можно последний пример переписать следующим образом:
RegProc5: process(clk, reset) begin if (en = '1' and rising_edge(clk)) or reset = '1' then if reset = '1' then Q <= '0'; -- async assignment elsif en = '1' and rising_edge(clk) then -- sync condition Q <= D; -- sync assignment end if; end if; end process;
Таким образом, как правило, можно анализировать управляющие потоки в процессе и определять, какое из назначений синхронно, а какое асинхронно. Средства синтеза, обычно, более требовательны к тому, что будет использоваться. Чаще, лучше писать процесс в более развернутом стиле (пример 5).
Возвращаясь к особенностям процесса, процессы со списком чувствительности эквивалентны процессам с операторами wait, которые также чувствительны к сигналам. Средства синтеза позволяют представлять поведение чувствительности к фронту, используя явный оператор wait в процессе с некоторыми ограничениями. Стандарт синтеза определяет достаточно сложные правила к структурам таких операторов wait. Стандарт включает в себя сигналы, которые можно использовать в списке условия on и условия until. (Условие for не разрешено, так как оно подразумевает особое распределение времени). Сегодняшние средства синтеза более строгие, так как арбитражная система, которая определяет управляющую логику для общих случаев, разрешенных стандартом, очень сложная.
Самый простой способ, разрешенный синтезирующим устройством, – использовать оператор wait первым оператором процесса, с условием ожидания фронта синхроимпульса в операторе until. В текущем процессе нельзя больше использовать оператор wait или упоминать фронт синхросигнала, а также в процедурах, вызываемых из текущего процесса.
Пример 6 Регистр, срабатывающий по фронту с явным оператором wait
Регистр, срабатывающий по фронту с синхронным сигналом сброса можно представить следующим образом:
reg : process is begin wait until rising_edge(clk); if reset = '1' then q <= X"00"; elsif en = '1' then q <= d; end if; end process dual_reg;
Назначение сигнала q происходит только после прихода переднего фронта сигнала clk. Тем не менее, синхронные управляющие сигналы – reset и en.
Пример 7 Явный оператор wait с асинхронным управлением
Стандарт синтеза позволяет написать следующий процесс, который показывает асинхронное управление с использованием явного оператора wait.
reg: rocess is begin wait until reset = '1' or rising_edge(clk); if reset = '1' then q <= X"00"; elsif risng_edge(clk) then if en = '1' then q <= d; end if; end if; end process;
Асинхронное условие включено в оператор wait. За оператором wait следует оператор if, который проверяет и асинхронное условие, и фронт синхроимпульса. Таким образом, в этом примере, reset – асинхронный управляющий сигнал, а en – синхронный управляющий сигнал. Хотя это поддерживается стандартом синтеза, не все средства синтеза поддерживают этот метод, вместо ограничивающего условия в операторе wait поддерживаются условия определения фронта синхроимпульса.
Стандарт синтеза разрешает процессы, которые включают сложные явные структуры оператора wait, но также, как и в предыдущем примере, не все средства синтеза поддерживают такую структуру оператора. В общем случае, аппаратное обеспечение для таких процессов включает блоки конечных автоматов. Таким образом устройства должно отслеживать прогресс среди операторов от одного цикла к следующему. В сравнении с процессом, который содержит только один оператор wait (явный или неявный), который всегда реализует один полный проход по всему теле процессу для каждого фронта синхроимпульса.
Условия для процесса с несколькими операторами wait требуют, чтобы каждый оператор ожидал одного условия, в частности, они должны ожидать одного фронта конкретного синхросигнала. В этом есть смысл, поскольку оператор wait, по сути, управляет переходами конечного автомата в предполагаемой аппаратуре. Если оператор wait включает асинхронные условия (пример 7), то за каждым оператором wait должна следовать проверка на это условие. Это предполагает управлением реализацией проекта на аппаратуре. Асинхронное поведение соответствует работе конечного автомата.