我遇到以下环形振荡器代码的问题:
entity OSCILLATOR is
port( OUTPUT: out std_logic
);
end entity OSCILLATOR;
architecture structural of OSCILLATOR is
component DEL_INV is
generic(D: time);
port( INPUT: in std_logic;
OUTPUT: out std_logic
);
end component DEL_INV;
signal conn: std_logic := '0';
signal conn1: std_logic := '1';
signal conn2: std_logic := '0';
signal de: time := 2 ns;
begin
INV1: DEL_INV generic map(de) port map (conn, conn1);
INV2: DEL_INV generic map(de) port map (conn1, conn2);
INV3: DEL_INV generic map(de) port map (conn2, conn);
OUTPUT <= conn;
end architecture;
尤其是在模拟时,输出始终为U。 有人可以解释为什么吗?
答案 0 :(得分:2)
分配给信号conn*
的初始值(确保在仿真中定义良好的起始条件)在启动时被{{1}上的'U'
驱动的OUTPUT
覆盖}}模块,因此模拟最终陷入所有DEL_INV
中。
一种解决方案是使用一个允许不同初始U
的泛型通过DEL_INV
模块处理初始值,然后在OUTPUT
上使用该初始值,直到该值是定义为OUTPUT
或'0'
,可以通过'1'
函数进行检测。
为此更新的代码如下所示。请注意,我在is_x
中添加了Renaud Pacalet针对for all: DEL_INV use entity work.DEL_INV(s);
和逆变器(not
)的建议。
DEL_INV