不要分别计算vhdl

时间:2017-12-09 06:06:56

标签: vhdl fpga

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,在临时和重置的过程中,我指定了所有条件,但它不计算如何ı想要。这很奇怪。我该如何解决?提前谢谢。

1 个答案:

答案 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