我想制作一个简单的vhdl代码,在led开启之前延迟20秒。我使用信号计数器来延迟20秒,但我注意到非常奇怪的事情,如果我没有在延迟之前声明LED已经关闭,那么led将始终开启。
看两个代码(时钟是50MHz):
在此代码中,led始终为ON。
library ieee;
use ieee.std_logic_1164.all;
entity check is
port(clk : in std_logic;
led : out std_logic);
end check;
architecture arc of check is
signal counter : integer range 0 to 100e6;
begin
process(clk)
begin
if rising_edge(clk) then
if counter<500e6 then
counter<=counter+1;
else
led<='1';
end if;
end if;
end process;
end arc;
在此代码中,led仅在20秒后开启。
library ieee;
use ieee.std_logic_1164.all;
entity check is
port(clk : in std_logic;
led : out std_logic);
end check;
architecture arc of check is
signal counter : integer range 0 to 100e6;
begin
process(clk)
begin
if rising_edge(clk) then
if counter<500e6 then
counter<=counter+1;
led<='0';
else
led<='1';
end if;
end if;
end process;
end arc;
答案 0 :(得分:0)
你应该初始化计数器和led。在模拟中,当您不这样做时,每个未初始化信号的值将为“U”,这意味着您无法确定它在实际系统中将具有什么值。可以是0或1。 您可以在端口声明中使用:='0'。
可能led始终打开,因为根据此代码,如果计数器&lt; 500e6,'led'的值无关紧要,否则它为1,因此编译器简化了它,因为程序设置的唯一值为' led'是'1'。