0

我对 VHDL 和 XILINX ISE 非常陌生。我将 13.2 版用于 Xilinx ISE。

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

  • 方向
  • 数数

计数输入将分配给一个按钮,我希望计数器在按下按钮时根据方向输入向上或向下计数。在此之前,我已经编写了一个示例 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 的文档,对于初学者来说它们似乎相当复杂)。

4

2 回答 2

1

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

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

在此处输入图像描述

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

于 2013-03-19T12:47:13.993 回答
1

你没有时钟。一旦满足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(3 downto 0) & COUNT_EN;"),并且仅在COUNT_EN_LAST = "01111"时增加,或者就在它们全为 1 之前。您需要的向量长度将根据您的时钟速度以及开关在稳定到新状态之前可以反弹多长时间而改变。

于 2013-03-18T19:51:36.547 回答