Назад в библиотеку

Моделирование логики, управляемой по фронту

Авторы: 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 должна следовать проверка на это условие. Это предполагает управлением реализацией проекта на аппаратуре. Асинхронное поведение соответствует работе конечного автомата.