VHDL。检查开关以重置计数器。 elsif工作,如果没有

时间:2018-03-03 22:16:33

标签: vhdl counter reset

有人可以解释为什么会有效:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity Switches_LEDs is
Port ( switches : in STD_LOGIC_VECTOR(5 downto 0);
LEDs : out STD_LOGIC_VECTOR(7 downto 0);
CLK_100MHz : in STD_LOGIC
);
end Switches_LEDs;
architecture Behavioral of Switches_LEDs is
    signal counter : STD_LOGIC_VECTOR(29 downto 0) := (others => '0');
begin
clk_proc: process(CLK_100MHz)
    begin
    LEDs <= counter(29 downto 22);
    if (switches(0) = '0') then
        counter <= (others => '0');
    elsif rising_edge(CLK_100MHz) then
        counter <= counter+1;
    end if;
end process;
end Behavioral;

而不是这个:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity Switches_LEDs is
Port ( switches : in STD_LOGIC_VECTOR(5 downto 0);
LEDs : out STD_LOGIC_VECTOR(7 downto 0);
CLK_100MHz : in STD_LOGIC
);
end Switches_LEDs;
architecture Behavioral of Switches_LEDs is
    signal counter : STD_LOGIC_VECTOR(29 downto 0) := (others => '0');
begin
clk_proc: process(CLK_100MHz)
    begin
    LEDs <= counter(29 downto 22);
    if (switches(0) = '0') then
        counter <= (others => '0');
    end if;
    if rising_edge(CLK_100MHz) then
        counter <= counter+1;
    end if;
end process;
end Behavioral;

另外,为什么我不需要“声明”clk_proc中的开关? 对于包含大量代码的问题有一个警告......所以...添加单词。

1 个答案:

答案 0 :(得分:1)

在一个过程中,最后一次分配获胜。 在您的代码中,计数器开关都不在敏感列表中,因此我会发现一些意外行为。

如果您需要异步重置,那么您应该使用如下模板:

process(clk, reset)
begin
  if reset condition then

  elsif clock event then

  end if;
end process;

如果您需要同步重置,那么:

process(clk)
begin
  if clock event then
    if reset condition then

    else

    end if;
  end if;
end process;

你应该移动 LED&lt; = counter(29 downto 22); 也可能已经没过了。