【发布时间】:2012-11-19 13:36:38
【问题描述】:
下面是一个简单的 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 之间有一个时钟周期延迟?
- 我的理解有什么问题?
【问题讨论】:
-
糟糕,图片的问题似乎很小。请打开图片看清楚。
-
如果加法答案在下一个上升沿之前很久就可用,为什么它没有传递到输出并显示在模拟结果中?为什么要等到时钟的下一个上升沿?
-
问题是:它可用吗?它在哪里?它可以在触发器的 inputs 内部使用。切换复位使其在输出端可用。通常你只是不能探测 temp 寄存器,它与触发器的输入相同。
-
那么,有没有办法在 rst = 1 的同时增加计数器?
-
这样说吧:不。如果您可以在相同的时钟周期内输出,您将拥有无限快的机器。
标签: delay simulation counter vhdl