为什么在简单计数器中延迟1个时钟周期

Abi*_*n K 1 simulation counter delay vhdl

下面是一个简单的3位计数器.

当复位(rst)为0时,计数器值为"000",否则每个时钟的上升沿递增1.

 LIBRARY ieee;
 USE ieee.std_logic_1164.all;
 use IEEE.std_logic_unsigned.all;
 use IEEE.numeric_std.all;
 ---------------------------------------------
 ENTITY counter IS
 PORT (clk : IN STD_LOGIC;
    rst : in std_logic;
       digit : out std_logic_vector (2 downto 0)
       );
 END counter;
 ---------------------------------------------
 ARCHITECTURE counter OF counter IS
 BEGIN

 count: PROCESS(clk,rst)
 VARIABLE temp : std_logic_vector(2 downto 0);
 BEGIN
 IF (clk'EVENT AND clk='1') THEN
     if (rst = '1') then
        temp := temp + "001";
     else
        temp := "000";
     END IF;
 END IF;
 digit <= temp;
 END PROCESS count;
 END counter;
Run Code Online (Sandbox Code Playgroud)

以下是我得到的模拟结果:

在此输入图像描述

在结果中,输出是正确的.但是在时间rst = 1和输出='001'之间存在一个时钟延迟.即,当rst ='1'时,计数器不会立即增加.

根据我的理解,每当clk或rst发生变化时,都会执行流程.因此,当rst从低变为高时,会发生事件.进程检查clk的上升沿是否为YES.然后检查rst = 1,是.所以通常计数器必须在clk本身中递增.但事实并非如此.

问题:

  1. 为什么在reset = 1和output = 001之间有一个时钟周期延迟?
  2. 我的理解有什么不对?

Bri*_*ond 5

"rst"的最可能原因是由一个时钟进程产生,由相同的"clk"信号计时.

所以"rst"在"clk"之后出现一个delta周期.当"rst"发生变化时,它会唤醒进程,但"clk'event"处于上一个delta周期,因此"if"语句将不会执行.

在下一个时钟边沿,rst = 1,因此计数器按预期工作.

三个小问题:

  • 值得命名的是复位信号rst_n,以便更清楚它是一个低电平有效复位!
  • rst真的不需要在灵敏度列表中
  • 布尔表达式周围不需要括号