Vhdl 在进程中的异步信号中,设置时间是一个问题吗?

Vhdl 在进程中的异步信号中,设置时间是一个问题吗?,vhdl,xilinx,Vhdl,Xilinx,当信号包括在灵敏度列表中时,每次信号改变时都会执行该过程。比如说, -- 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; ——状态存储

当信号包括在灵敏度列表中时,每次信号改变时都会执行该过程。比如说,

-- 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;
——状态存储器
--同步复位
过程(clk)
开始
如果(rst='1'),则

p_state通常,VHDL用于描述最底层的设计。在这个抽象级别上,设置和保持时间被忽略。由于会议设置和保持时间通常更多地取决于设计的物理布局,而不是逻辑,因此在验证设计逻辑时,这种假设通常是合理的

当您编写具有不完整的敏感度列表的VHDL
过程
块时,您将面临模拟和合成之间存在差异的风险,因为合成工具通常会忽略敏感度列表。因此,您确实有两种选择:

-- 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)
开始
如果(rst='1'),则
p_状态“0”);
elsif(上升沿(clk))然后

p_state您的示例不是同步重置

这是一种无效的异步重置实现,因为进程敏感度列表中缺少
rst
。在模拟中,它可能看起来像一个同步复位,但合成忽略了灵敏度列表,合成了一个异步复位


我假设
初始化
是一个定义的状态,而不是一个信号,否则您会遇到另一个问题(重置值应始终保持不变,且不依赖于另一个信号)。

如果我正确理解了您的问题,您会担心设置时间(因此,也包括触发器的保持时间)。这些时间指的是数据输入,而不是复位输入,是防止亚稳态和实现正确数据存储所需的时间


非同步复位强制输出为零,而不考虑任何其他信号,在触发器的晶体管级,覆盖任何数据或时钟相关信息。

您能回顾并澄清您的问题吗;我无法准确理解您的问题。Bts。上面的代码将给您一个关于信号的综合警告
rs灵敏度列表中缺少t
初始化
。带有“异步重置”的示例灵敏度列表中缺少上述
初始化
。此外,使用依赖于外部信号的异步重置值可能会在某些FPGA技术中出现问题。@MortenZdk捕捉得很好…我没有注意到重置没有使用常量。@MortenZdk我假设
初始化
不是一个信号,但复位后要启动的状态。