控制信号变化时计数器不递增

Counter is not incremented when controlling signal changes

我用 VHDL 实现了一个简单的计数器 0 到 255 设计。它在FPGA板上按预期工作,但是当我在Modelsim中模拟它时,当我强制key(0)更改时计数器不添加。有什么想法吗?

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

ENTITY PROC_TEST     IS
  PORT(
    CLOCK_50: IN STD_LOGIC;
    KEY: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
    LEDR: OUT STD_LOGIC_VECTOR(9 DOWNTO 0)
    );
END PROC_TEST;

ARCHITECTURE MAIN OF PROC_TEST IS
  SIGNAL COUNTER: INTEGER RANGE 0 TO 255;
BEGIN

  LEDR(7 DOWNTO 0)<= STD_LOGIC_VECTOR (TO_UNSIGNED(COUNTER,8));

  PROCESS (CLOCK_50)
  BEGIN
    IF (KEY(0)'EVENT AND KEY(0) = '0')THEN
      COUNTER<=COUNTER + 1;
    END IF;
  END PROCESS;
END MAIN;

进程敏感度列表中缺少信号 KEY(0)。当您为 FPGA 综合代码时,通常会出现警告。

只有一个进程executes/resumes:

  • 模拟启动后,
  • 每当敏感列表中的信号之一发生变化时。

因此,您的进程仅在 CLOCK_50 发生变化时执行,而不是在您在模拟器中强制对 KEY(0) 进行更改时执行。因此,您必须将代码更改为:

PROCESS (KEY(0))

进行此更改后,仿真输出如下,将 10 MHz 时钟应用于 KEY(0)


进一步说明:

如您在我的模拟屏幕截图中所见,信号 LEDR(9)LEDR(8) 具有未定义的 ('U') 值。发生这种情况是因为您忘记在架构中分配它们。这也应该通过合成来表示。通常,合成器只是将“0”(逻辑低电平)分配给输出,这可以通过以下方式明确实现:

LEDR(9 downto 8) <= "00";

其他输入信号在我的模拟中具有未定义的值,因为这些是未使用的输入并且我没有对其应用任何波形。