下面是一个简单的 3 位计数器。
当 reset(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;
下面是我得到的模拟结果:
结果,输出是正确的。但是在时间 rst = 1 和 output='001' 之间有一个时钟延迟。即当rst = '1' 时,计数器不会立即增加。
根据我的理解,只要 clk 或 rst 发生变化,就会执行进程。所以当 rst 从低变高时,就会发生一个事件。进程检查 clk 的上升沿是否为 YES。然后检查rst = 1,是。因此,通常计数器必须在该 clk 本身中增加。但事实并非如此。
问题:
- 为什么复位 = 1 和输出 = 001 之间有一个时钟周期延迟?
- 我的理解有什么问题?