因此,通过我自己的研究,我了解如果我们在流程中分配信号,它将在流程后更新。现在,如果我们直接为输出分配一个值,它还会在进程后更新吗? 我附上两个版本作为一个简单的例子来证明我的意思。
版本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 :(得分:1)
首先,以下内容并不完全正确,但对大多数RTL流程来说都是正确的:
进程内的信号直到进程后才会更新 饰面
实际规则是:
直到下一个增量周期才会更新信号。
WRT一个进程,一个进程不允许delta循环通过,除非进程暂停等待或退出并暂停在敏感列表中。大多数RTL进程都有敏感列表或顶部只有一个等待语句,因此,对于RTL代码,我们到达你的&#34;不是真的&#34;。
WRT到你的C:
c <= temp;
该分配中仍有一个增量循环。如果有帮助,该语言通过以下转换定义并发分配的执行:
process (temp) is
begin
c <= temp;
end process ;
这将帮助您了解WRT您的简单RTL规则发生了什么。
答案 1 :(得分: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;
答案 2 :(得分: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端口映射方面。