library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity A is
Port (
clk : in STD_LOGIC;
reset: in std_logic; -- reset input
counter: out std_logic_vector(3 downto 0) := "0000"-- output 4-bit counter
);
end A;
architecture Behavioral of A is
signal counter_up: std_logic_vector(3 downto 0) := "0000";
signal countOf : integer := -1;
signal count : integer := 0;
signal temp : std_logic := '0';
begin
-- up counter
process(clk)
begin
if(clk'event and clk='1') then
count <=count+1;
if(count = 50000000) then
temp <= not temp;
count <=1;
end if;
end if;
end process;
process(temp,reset)
begin
if(reset = '1') then
countOf <= 0;
else
if(temp = '1') then
if( countOf < 4) then countOf <= countOf + 1;
else countOf <= 0; end if;
if(countOf = 0) then counter_up <= "0000"; end if;
if(countOf = 1) then counter_up <= "0001"; end if;
if(countOf = 2) then counter_up <= "0010"; end if;
if(countOf = 3) then counter_up <= "0100"; end if;
if(countOf = 4) then counter_up <= "1000"; end if;
end if;
end if;
end process;
counter <= counter_up;
end Behavioral;
嗨我想制作一个从0到4的计数器。如你所见,我将时钟分为1 HZ,在临时和重置的过程中,我指定了所有条件,但它不计算如何ı想要。这很奇怪。我该如何解决?提前谢谢。
答案 0 :(得分:0)
你的process(temp, reset)
无法正常工作,因为你使它成为组合,这不是你在这个例子中所需要的。在模拟中工作正常,在硬件中根本不起作用。
您所写的内容会在硬件中生成循环:countOf
的状态取决于temp
的状态和 countOf
本身的状态。由于您的进程不包含时钟,因此countOf
的状态变化与门延迟允许的速度一样快(如果此代码将被正确合成)。
如果您的软件有任何好处,它会给您一个警告:
[Synth 8-614] signal 'countOf' is read in the process but is not in the sensitivity list
你应该从不忽略,因为在99%的情况下,这意味着你会得到不受欢迎的行为和/或模拟不匹配。
您需要做的是让temp
成为您的时钟。它是由时钟分频器生成的,所以从逻辑上讲,你几乎可以肯定它也是一个时钟。如果您将if (temp = '1') then
替换为if rising_edge(temp) then
,您的代码将按照需要运行。
附注:请删除use IEEE.STD_LOGIC_ARITH.ALL;
和use IEEE.STD_LOGIC_UNSIGNED.ALL;
。您根本不需要任何未签名的代码库,但IEEE.STD_LOGIC_ARITH
已弃用,不应再使用。它已经多年了。请改用IEEE.NUMERIC_STD
。