以下は、単純な 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' の間には 1 クロックの遅延があります。つまり、rst = '1' の場合、カウンターは瞬時にインクリメントしません。
私の理解によると、clkまたはrstの変更が発生するたびに、プロセスが実行されます。したがって、rst がローからハイに変化すると、イベントが発生します。プロセスは、clk の立ち上がりエッジが YES かどうかをチェックします。次に、rst = 1、YES かどうかを確認します。したがって、通常、カウンターはその clk 自体でインクリメントする必要があります。しかし、そうではありません。
質問:
- リセット = 1 と出力 = 001 の間に 1 クロック周期の遅延があるのはなぜですか?
- そして、私の理解の何が間違っていますか?