【问题标题】:Counter with push button switch design using VHDL and Xilinx使用 VHDL 和 Xilinx 的按钮开关设计计数器
【发布时间】:2014-02-16 22:59:45
【问题描述】:

我对 VHDL 和 XILINX ISE 非常陌生。我使用 Xilinx ISE 版本 13.2。

我想设计一个非常简单的计数器,输入如下:

  • 方向
  • 计数

计数输入将分配给一个按钮,我希望计数器在按下按钮时根据方向输入向上或向下计数。在此之前,我已经编写了一个示例 VHDL。它有一个时钟输入,它根据时钟输入进行计数。现在我希望它在我按下按钮时计数,而不是同步计数。

这是我的 VHDL 代码(请告诉我我的代码是否存在逻辑缺陷或任何其他缺陷):

entity counter is
    Port ( COUNT_EN : in  STD_LOGIC;
           DIRECTION : in  STD_LOGIC;
           COUNT_OUT : out  STD_LOGIC_VECTOR (3 downto 0));
end counter;

architecture Behavioral of counter is

signal count_int : std_logic_vector(3 downto 0) := "0000";
begin
process 
begin
    if COUNT_EN='1' then
        if DIRECTION='1' then   
            count_int <= count_int + 1;
        else
            count_int <= count_int - 1;
        end if;
    end if;
end process;
COUNT_OUT <= count_int;
end Behavioral;

我使用 Spartan xc3s500e 并相应地放置了输入。下面是我的 .ucf 文件:

#Created by Constraints Editor (xc3s500e-fg320-5) - 2013/03/18
NET "COUNT_EN" LOC = K17;
NET "COUNT_OUT[0]" LOC = F12;
NET "COUNT_OUT[1]" LOC = E12;
NET "COUNT_OUT[2]" LOC = E11;
NET "COUNT_OUT[3]" LOC = F11;
NET "DIRECTION" LOC = L13;
#Created by Constraints Editor (xc3s500e-fg320-5) - 2013/03/18
NET "COUNT_EN" CLOCK_DEDICATED_ROUTE = FALSE;

我需要更改最后一行,因为我收到了错误:

This will not allow the use of the fast path between the IO and the Clock...

在消除此错误后,我对设备进行了编程。但是输出(LED)表现得很疯狂。它们有时静止几秒钟,有时只是快速闪烁。我无法弄清楚我的错误在哪里。我将不胜感激,非常感谢一些初学者教程(我找到的链接将我指向 xilinx 的文档,对于初学者来说它们似乎相当复杂)。

【问题讨论】:

    标签: vhdl fpga xilinx spartan


    【解决方案1】:

    根据您的描述,我了解到您不是在寻找Asynchronous Counter

    您需要的是依靠按钮开关触发的计数器。下面的 RTL 应该可以工作:

    如果 HDL 编码有任何困难,请告诉我。

    【讨论】:

    • 我知道这篇文章很老了,但是下面的图片有一个严重的错误!显示的去抖动逻辑只是边缘检测。真正的去抖逻辑需要一个计时器和一个 FSM 来过滤输入信号的毛刺(称为去抖)。
    【解决方案2】:

    你没有时钟。一旦满足 COUNT_ENDIRECTION 条件,count_int 变量将尽可能快地增加......实际上是时间个别位的变化可能会使整个事情变得完全不稳定和不正确。

    您应该始终使用时钟...只是为了让 FPGA 获得正确的时序。

    在这种情况下,将时钟调回...然后添加一个新信号 COUNT_EN_LAST。保存旧的 COUNT_EN 每次通过时钟进程。仅在 COUNT_EN = '1'COUNT_EN_LAST = '0' 时增加。

    事实上,接下来您会发现您需要“去抖动”输入。物理按钮/开关“弹跳”,每次按下按钮即可为您提供多个关闭事件。为此,您只需将 COUNT_EN_LAST 设为一个向量(例如 5 长),每次将新值转移到其中 ("COUNT_EN_LAST ),并且仅在 COUNT_EN_LAST = "01111" 或它们全为 1 之前递增。您需要的向量长度将根据时钟的速度以及开关在稳定到新状态之前可以弹跳的时间而改变。

    【讨论】:

    • 看来我认为“简单”的东西比以前的简单时钟示例更复杂:) 当我尝试你在黑板上说的话时,我会告诉你的。感谢您的宝贵时间:)
    猜你喜欢
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多