【问题标题】:Loop VHDL It does not work as expected循环 VHDL 它没有按预期工作
【发布时间】:2017-12-20 14:54:36
【问题描述】:

在经历了昨天和今天之后,我已经设法解决了一些问题,但我又陷入了困境。 在做计数器时,我放了一个循环,使其从 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 并简单地直接更新计数器(如果它有效),但我需要计数器从第一次传感器 = '1' 开始累加,并且一旦帐户启动它就不会停止(即使传感器信号),直到达到极限。 还附上了测试平台的截图。

【问题讨论】:

标签: vhdl


【解决方案1】:

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

因此,在这种情况下,整个循环在进程的一次激活期间执行,在时钟上升沿。对account 的每个计划(“非阻塞”)分配都会简单地覆盖对account 的先前计划分配。最后一个分配给account 获胜,所以当我们到达进程的最后时,调度程序有一个计划分配:它分配零给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' 的第一时刻开始计数的计数器如何根据每个脉冲加起来,然后在传感器信号发生变化时加起来?基本上我需要构建传感器,以便某些交通信号灯在某些脉冲中改变状态。很抱歉,不清楚,但我是 vhdl 以及论坛中的新编程人员。
  • @Anónimo salvaje:“如果传感器信号发生变化,加起来”并没有什么意义。我假设您的意思是“仅在设置传感器信号时才计数”,在这种情况下,请参阅上面的编辑。 HTH。
  • 我不鼓励在实体端口接口使用异步重置和unsigned。我建议初始化account
  • 异步与同步重置的选择取决于几个因素。对于 Xilinx 器件,Xilinx 目前推荐同步,但不是出于特别令人信服的原因;多年来,他们的建议发生了变化。参见 Keating&Bricaud 进行相当全面的比较,甚至参见 Cummings。未签名没有问题,尤其是设备内部;自从外部工具不理解 unsigned 以来已经有很多年了。 account 被重置;尝试任何进一步的仅 sim 初始化是没有意义的。
  • 感谢大家的帮助。我附上了我当前测试平台的图像以及我希望构建的内容以澄清它。我需要在第二个 3 中,当传感器变为 1 时,计数器连续计数到 53(除非 rst_n 发生变化),以便在另一个过程(例如帐户为 13)之后更改信号量的值。给您带来的不便,我深表歉意ibb.co/nwqGaRibb.co/dwU9vR
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多