2017-02-20 72 views
0

因此,通过我自己的研究,我明白如果我们在过程中分配信号,它将在过程后更新。现在,如果我们直接分配一个输出值,那么在进程之后它也会被更新或者没有? 我附上两个版本作为一个简单的例子来说明我的意思。在过程中分配信号与分配实际输出之间的区别

版本1:

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

entity testing is 
port(
    clk : in std_logic; 
    a : in std_logic; 
    b : in std_logic; 
    c : out std_logic 
); 

end testing; 

architecture arch of testing is 

signal temp: std_logic; 

begin 

process(clk) 

begin 

    if(rising_edge(clk)) then 

     if(a = '1' and b = '1') then 

      temp <= '1' 

     end if; 

    end if; 

end process; 

c <= temp; 

end arch; 

现在另一个版本:

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

entity testing is 
port(
    clk : in std_logic; 
    a : in std_logic; 
    b : in std_logic; 
    c : out std_logic 
); 

end testing; 

architecture arch of Intermediate is 

begin 

process(clk) 

begin 

    if(rising_edge(clk)) then 

     if(a = '1' and b = '1') then 

      C <= '1'; 

     end if; 

    end if; 

end process; 

end arch; 

是否有一个时间差在这里?在第二个版本中,C会比第一个版本高吗?

回答

0

C将在第二个示例中与您的第一个示例相比稍早分配。此外,使用较少的资源,因为在第二个示例中没有中间寄存器(temp)。

在第一个例子中,将temp上时钟的下降沿被分配,并且C是一个并行分配(即,一旦temp变化,C变化)。但是,实际上,由于信号传播,在temp更改之后,此分配会发生一些“少量时间”。

在第二个示例中,您直接分配到C,这将发生在时钟下降沿。

我知道你所提供的例子是人为的,但你可以达到同样具有:

process(clk) 
begin 
    if rising_edge(clk) then 
     c <= a and b; 
    end if; 
end process; 
0

仿真周期重新开始,直到等待暂停执行各每一道工序。当前时间的其他事件导致增量循环,否则模拟时间前进到下一个预定事件。仿真周期一直持续到事件停止或停止。

并行语句具有等效的详细过程或块和过程。详细的设计层次结构是通过信号事件进行通信的过程的集合。

c可能会在第一个例子中出现一个增量周期,因为连续的信号分配没有中间延迟。 Delta循环不消耗simulation time,而是产生顺序语句的并发性。

版本1有一个来自并发信号赋值语句的第二个进程,并使用一个附加信号,表示模型的更多执行时间和使用更多资源。版本1本身并不代表重要的负担。在大量这样的进程或大量事件中,模型执行时间和内存利用率的差异可以测量。

如果你通常会看到一个中介信号就是信号值除带动端口本地计算。您不能读取模式输出接口信号的值。 (设计单位是独立分析的,实际的有效值的位置在分析时是未知的,实际是关联的在细化处,端口代表在港口协会中的形式)

参见IEEE Std 1076-2008, 11.并发语句10.5.2简单的信号赋值语句; 10。2等待语句; 14.制定和执行;特别是14.5制定一份声明部分和14.5.5其他并行声明; 14.7模型的执行,特别是14.7.5模型执行; 6.5.2接口对象声明; 6.5.7.3港口地图方面; 14.3.5港口地图方面。

1

首先,以下是不完全正确的,但它是正确的大多数RTL流程:

过程中的信号不更新,直到 完成

实际规则的过程后,是:

一个信号不会更新,直到下一个增量循环。

WRT一个进程,一个进程不允许增量循环通过,除非该进程在等待时暂停或退出并暂停在敏感列表中。大多数RTL过程都有灵敏度列表,或者顶部只有一个等待语句,因此,对于RTL代码,我们会得出“不太真实”的结论。

WRT你分配到C:

c <= temp; 

还有在分配δ周期。如果有帮助,语言通过以下变换定义并发任务的执行:

process (temp) is 
begin 
    c <= temp; 
end process ; 

这将帮助你明白发生了什么WRT您简单的RTL规则。

相关问题