循环VHDL它不能按预期工作

时间:2017-12-20 14:54:37

标签: vhdl

在昨天和今天之后,我设法解决了一些问题,但我又被卡住了。 在进行计数器时,我已经设置了一个循环,使其从1到53计数,然后再次重置为零。当检查它是否正常工作时会出现问题我启动测试台并且信号根本没有更新。

-- Process incorporated in vhdl
entity semaforo is
Port ( sensor : in  STD_LOGIC;
       clk : in  STD_LOGIC;
       rst_n : in  STD_LOGIC;
       light_highway : out  STD_LOGIC_VECTOR (2 downto 0);
       light_farm : out  STD_LOGIC_VECTOR (2 downto 0));
 end semaforo;

architecture Behavioral of semaforo is

signal cuenta: std_logic_vector(6 downto 0):="0000000";

begin 

flip_flop: process (clk, rst_n)

begin

if (rst_n='0') then 

 light_highway <="001";

 light_farm <="100";

elsif (clk'event and clk='1') then 

 if (sensor='1') then   

  light_highway<="010";

 end if;

end if;

 end process;


contador : process (clk, rst_n)

begin

if rst_n = '0' then

  cuenta <= (others => '0');

elsif rising_edge(clk) then

  if sensor = '1' then

    if cuenta < 53 then

      cuenta <= cuenta + 1;

    else

      cuenta <= (others => '0');

    end if;  -- count/wrap

  end if;    -- clock enable

end if;      -- async reset/clock

 end process;

end Behavioral;

如果您删除了for并直接更新了计数器,如果它可以工作但是我需要计数器从第一次传感器开始累加=&#39; 1&#39;并且一旦帐户启动它就不会停止(即使传感器发出信号),直到达到极限。 还附上了测试平台。

2 个答案:

答案 0 :(得分:1)

此代码无法编译。但是,您的基本问题是进程如何工作以及循环。该过程继续执行直到它暂停(在这种情况下,在结束时)。当执行命中变量赋值时,变量立即更新。当执行命中信号时,分配计划在将来的某个时间点进行,进程暂停之后。查找增量周期和调度模型。

因此,在这种情况下,整个循环在一个激活过程期间,在时钟上升沿执行。对account的每个预定(&#39;非阻止&#39;)分配只是将之前的预定分配覆盖到account。对account的最后一次分配获胜,因此当我们到达流程结束时,调度程序只有一个预定的分配:它将{0}分配给account

修改

我认为您只是要求一个6位计数器,具有异步复位,计数启用和环绕。下面的通用代码。请注意,这需要VHDL 2008回读account输出以增加它。

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity E is
  port(
    clk     : in  std_logic;
    rst_n   : in  std_logic;
    sensor  : in  std_logic;
    account : out unsigned(5 downto 0));
end entity E;

architecture A of E is
begin
  counter : process (clk, rst_n)
  begin
    if rst_n = '0' then
      account <= (others => '0');
    elsif rising_edge(clk) then
      if sensor = '1' then
        if account < 53 then
          account <= account + 1;
        else
          account <= (others => '0');
        end if;  -- count/wrap
      end if;    -- clock enable
    end if;      -- async reset/clock
  end process;
end architecture A;

答案 1 :(得分:0)

VHDL没有像c ++这样的循环。删除循环语句。每次CLK上升沿发生时你的计数器都会计数。