当信号包含在灵敏度列表中时,每次信号改变时都会执行该过程。例如,
-- State Memory
-- Synchronous Reset
process (clk)
begin
if (rst = '1') then
p_state <= initialization;
elsif (rising_edge(clk)) then
p_state <= n_state;
end if;
end process;
但是,如果rst包含在灵敏度列表中,它将变为异步复位。我现在的问题是,当第一个被断言时。该过程已执行。但第一个信号是否已经稳定,使得第一个信号的值为“1”?
答案 0 :(得分:2)
您的示例不是同步重置。
这是异步重置的无效实现,因为进程敏感性列表中缺少rst
。在模拟中,它可能看起来像同步复位,但是合成会忽略灵敏度列表并合成异步复位。
我认为initialization
是一个已定义的状态而不是一个信号,否则你会遇到另一个问题(复位值应始终保持不变,而不依赖于另一个信号)。
答案 1 :(得分:0)
通常,VHDL用于描述register transfer level的设计。在此抽象级别,忽略设置和保持时间。由于满足设置和保持时间通常更多地取决于设计的物理布局而不是逻辑,因此在验证设计逻辑时,这种假设通常是合理的。
当您编写具有不完整敏感性列表的VHDL process
块时,您会冒模拟和合成之间存在差异的风险,因为综合工具通常忽略敏感性列表。因此,您真的有两个选择:
-- Asynchronous Reset
process (clk, rst)
begin
if (rst = '1') then
p_state <= (others => '0');
elsif (rising_edge(clk)) then
p_state <= n_state;
end if;
end process;
-- Synchronous Reset
process (clk)
begin
if (rising_edge(clk)) then
if (rst = '1') then
p_state <= (others => '0');
else
p_state <= n_state;
end if;
end if;
end process;
您不应该使用异步重置模式实现同步重置,然后从敏感度列表中省略rst
。
答案 2 :(得分:0)
如果我理解你的问题,你会担心触发器的设置时间(以及保持时间)。这些时间是指数据输入,而不是复位输入,是防止亚稳态和实现正确数据存储所必需的。
无论其他信号如何,同步复位都会强制输出为零,在触发器的晶体管级别覆盖任何数据或时钟相关信息。