有时我们需要对一些来自Process之外的条件执行一些顺序过程。我们可以为这种情况声明一些控制信号,例如:
Architecture ...
Signal C : std_logic;
begin
Process(SomeInputs)
begin
C <= '1';
end Process;
Process(Clock)
Variable Counter : Integer := 0;
begin
if (Clock'Event and Clock = '1') then
if C = '1' then
Counter := Counter + 1;
if Counter = 10 then
Counter := 0;
C <= '0';
end if;
end if;
end if;
end Process;
end;
end ... ;
在这种情况下,信号C是多源的,无法合成。
另一个例子是复位信号,当复位来自进程外部或组件外部时,我们无法反转它。
一种方法是制作这样的状态机:
Process(Clock)
begin
if (Clock'Event and Clock = '1') then
case Current_State is
when State_X =>
Current_State <= State_Y;
when State_Y =>
if C = '1' then
Current_State <= State_X;
else
Current_State <= State_Y;
end if;
...
end case;
end if;
end Process;
或者处理这种情况的另一种方法是声明这样的临时信号:
Architecture ...
Signal MySignal, MyTempSignal : std_logic_vector(N downto 0);
begin
Process(Clock)
Variable Counter : Integer := 0;
begin
if (Clock'Event and Clock = '1') then
if MySignal /= MyTempSignal then
Counter := Counter + 1;
if Counter = 10 then
Counter := 0;
MyTempSignal <= MySignal;
end if;
end if;
end if;
end Process;
end ...;
对于临时信号,我们可以在某些信号发生变化时进行一些处理。
另一种方法是在过程的灵敏度列表中添加条件信号,但是当过程与时钟一致时,它很难处理它们。
主要问题是每个信号必须来自1个来源(在一个过程中),问题是:
当我们需要一些控制信号时,处理这种情况的最佳可合成方法是什么,例如重置&#39; ?
答案 0 :(得分:2)
流程与责任有关。进程负责驱动一个或多个输出。如果一个进程遵守由另一个源(例如按钮)创建的复位信号,那么一个进程就不允许反转这样的复位,因为它不是它的责任!任何其他信号也是如此。
因此,假设重置是由另一个进程生成的,而不是由硬连线按钮生成的:在这种情况下,您必须“询问”驱动过程以使置位信号无效。
因此,让我们假设两个进程都实现了状态机,在这种情况下,我们现在处于以下领域:如何在状态机之间实现握手协议。
通常,你有一个:
还有更多的协议和名称。
答案 1 :(得分:1)
为了处理与同一信号交互的多个进程,我通常会这样做:
如果多个进程必须执行相同的操作(例如重置),则只需为每个进程声明一个信号,然后对它们进行OR或将它们全部置于条件中。
示例:
architecture ar of comp is
signal sig, sig_rst1, sig_rst2, sig_set : std_logic;
begin
sig_management:process(clk)
begin
if rising_edge(clk) then
if sig_rst1 = '1' OR sig_rst2 = '1' then
sig <= '0';
elsif sig_set = '1' then
sig <= '1';
end if;
end if;
end process;
set_proc:process(clk)
begin
if rising_edge(clk) then
sig_set <= '0';
if (condition) then
sig_set <= '1';
end if;
end if;
end process;
-- Do the same for sig_rst signals
end architecture;