【发布时间】:2014-11-16 02:03:50
【问题描述】:
我是 VHDL 新手,我正在为以下想法而苦苦挣扎。我想我仍然误解了 VHDL 中计数器和计时器的概念。我将用一个简单的闪烁 LED 二极管来解释它。 (顺便说一句,我正在学习 Spartan-3E FPGA 套件。)
这是我的代码(我还没有使用重置)
entity top_level is
Port( clk : in STD_LOGIC;
led1 : out STD_LOGIC);
end top_level;
architecture Behavioral of top_level is
signal timer : STD_LOGIC_VECTOR(25 downto 0) := "00000000000000000000000000";
signal reset: boolean:= false;
begin
process (clk)
begin
led1 <= '1';
if clk='1' and clk'event then
if reset <= true then
timer <= (others => '0');
end if;
timer <= timer + 1;
end if;
if timer <= "11100100111000011100000000" then
led1 <= '0';
end if;
end process;
end Behavioral;
振荡器频率为 50 MHz,因此一个周期为 20 ns。如果我想用 LED 闪烁 1.2 秒(产生 60 000 000 个周期),我需要创建一个 26 位向量。所以我创建了一个由 clk 更改触发的进程。
我认为应该做什么:
第一行代码是对 led1 的逻辑 1 赋值。所以 led1 应该点亮,直到计数器不会计算 60 000 000 个周期。当计数器计数 60 000 000 个周期时,LED 逻辑状态应切换到 0,这意味着没有光。由于 26 位数的最大值为 67 108 863,因此 LED 应点亮 60 000 000 个周期,并在剩余的 7 108 863 个周期内关闭。不是吗?
它的作用:我的印象是,它有点颠倒了。 LED 大部分时间是关闭的(67 108 063 次循环)并点亮 7 108 863 次循环。为什么会这样?我真的不明白。
其他问题:我怎样才能实现只运行一次/两次/...?例如。我想用我的 LED 闪烁 3 次然后将其关闭。因为据我所知,在达到最大 26 位数后,时间向量将从头开始计数(从 0 开始)。以此类推,无穷无尽。
【问题讨论】:
-
您确定 LED 的接线方式与您的想法一致吗?如果它是有线的(阴极到引脚,阳极到 +V,通过电阻),那么它会在“0”时点亮,在“1”时熄灭。
标签: count vhdl counter fpga timing