我是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...
在此错误消失后,我对设备进行了编程。但输出(leds)表现得很疯狂。他们有时会静止几秒钟,有时只是快速闪过。我无法弄清楚我的错误在哪里。我很感激任何帮助,一些初学者教程非常感谢(我发现的链接指向了xilinx的文档,对于初学者来说,它们看起来相当复杂)。
答案 0 :(得分:1)
你没有时钟。一旦满足 COUNT_EN 和 DIRECTION 条件, count_int 变量将尽可能快地增加...实际上是时间当个别位改变时,可能会使整个事物完全不稳定和不正确。
你应该总是使用时钟......只是为了让FPGA能够正确地计时。
在这种情况下,请将时钟恢复...然后添加新信号 COUNT_EN_LAST 。保存旧的 COUNT_EN 每次通过时钟进程。仅在 COUNT_EN ='1'和 COUNT_EN_LAST ='0'时递增。
事实上,你接下来会发现你需要“去抖”输入。物理按钮/开关“弹跳”,每按一次按钮即可为您提供多个开启事件。为此,您只需将 COUNT_EN_LAST 设为一个向量(例如5长),每次都将新值移入其中(“COUNT_EN_LAST&lt; = COUNT_EN_LAST(3 downto 0)&amp; COUNT_EN; “),仅在 COUNT_EN_LAST =”01111“时或在它们全部为1之前递增。您需要的矢量长度将根据您的时钟速度以及开关在稳定到新状态之前反弹的时间而改变。
答案 1 :(得分:1)