用VHDL和Xilinx设计带按钮开关的计数器

用VHDL和Xilinx设计带按钮开关的计数器,vhdl,fpga,xilinx,spartan,Vhdl,Fpga,Xilinx,Spartan,我对VHDL和XILINX ISE非常陌生。我使用Xilinx ISE的13.2版 我想用以下输入设计一个非常简单的计数器: 方向 计数 计数输入将分配给一个按钮,我希望按下按钮时计数器根据方向输入向上或向下计数。在此之前,我已经编写了一个VHDL示例。它有一个时钟输入,并根据时钟输入计数。现在我想让它在我按下按钮时计数,而不是同步计数 以下是我的VHDL代码(请告诉我我的代码是否存在逻辑或任何其他缺陷): 我需要更改最后一行,因为我遇到了错误: This will not allow th

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

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

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

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

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

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

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

你没有时钟。一旦满足COUNT\u ENDIRECTION条件,COUNT\u int变量将尽可能快地增加。。。事实上,单个比特改变的时间可能会使整个事情变得完全不稳定和不正确

你应该一直使用时钟。。。只是为了让FPGA获得正确的时序

在这种情况下,请将时钟拨回。。。然后添加一个新信号最后一次计数。保存每次通过计时过程的旧计数。仅当COUNT\u EN='1'COUNT\u EN\u LAST='0'时增加


事实上,接下来您会发现需要对输入进行“去抖动”。物理按钮/开关“反弹”,并在每次按下一个按钮时为您提供多个off on事件。为此,您只需将COUNT\EN\u LAST设置为一个向量(比如5长),每次都将新值移入其中(“COUNT\u EN\u LAST根据您的描述,我知道您不是在寻找一个向量

您需要的是计数按钮开关触发的计数器。以下RTL应能工作:


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

看来,我认为“简单”的东西比前一个简单的时钟示例更复杂:)当我尝试你在黑板上说的话时,我会让你知道的。谢谢你的时间:)我知道这篇文章很旧,但下面的图片中有一个严重的错误!显示的去抖动逻辑只是一个边缘检测。真正的去抖动逻辑需要一个定时器和一个FSM来过滤输入信号中的小故障(称为去抖动)。
#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...