【问题标题】:VHDL Counter using switch on 7-segment - not working使用 7 段开关的 VHDL 计数器 - 不工作
【发布时间】:2014-12-04 15:04:09
【问题描述】:

我正在尝试编写一个显示在七段显示器上的简单计数器(0 到 9)。它递增的方式是通过一个开关 - 从逻辑 0 变为逻辑 1,逻辑 1 将其递增 1。还有一个休息功能,旨在将计数器重置为 0。

我在这里查看并整理了我的大部分代码。我在编译时在 ModelSim 上对此进行了模拟,它按预期工作。但是,当我将代码下载到我的 DE0 板时,它不起作用 - 我什至无法描述它的作用,因为它是如此随机且没有可辨别的模式(随机 LED 会亮起,随机数会出现等)。

重置(将计数器设置为 0 并将 0 输出到 7 段)工作正常!

到目前为止,这是我的代码:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity Lab_1 is port (
  switch : in  std_logic;
  rst    : in  std_logic;
  sseg   : out std_logic_vector(7 downto 0));
end Lab_1;

architecture top of Lab_1 is
  signal counter : unsigned (3 downto 0) := "0000";
begin

  display : process(switch, rst) is
  begin
    if rst = '1' and rst'last_value = '0' then
      counter <= "0000";
    elsif switch = '1' and switch'last_value = '0' then
      counter <= counter + 1;
    end if;
    case counter is
      when "0000" => sseg <= "11000000";
      when "0001" => sseg <= "11111001";
      when "0010" => sseg <= "10100100";
      when "0011" => sseg <= "10110000";
      when "0100" => sseg <= "10011001";
      when "0101" => sseg <= "10010010";
      when "0110" => sseg <= "10000010";
      when "0111" => sseg <= "11111000";
      when "1000" => sseg <= "10000000";
      when "1001" => sseg <= "10010000";
      when others => sseg <= "11111111";
    end case;
  end process;

end top;

如果出了什么问题,任何帮助将不胜感激?

编辑:

这是我为大学课程做的一项作业。这个问题实际上想要一种通过按下按钮/开关然后重置它来保持两个“团队”得分的方法。我想如果我可以有一个简单的计数器,那么我可以很容易地(我希望!)通过为 2 支球队计分。

DE0 板确实有去抖动的按钮 - 但是当我更改代码以便它使用按钮时,7 段将显示一个随机值/模式,同时按下按钮然后更改为另一个随机值/松开按钮时的图案。

【问题讨论】:

  • 欢迎来到 Stack Overflow。当问题基于家庭作业时提及通常是一种很好的做法,因此回答者可以确定他们想要提供多少解决方案。
  • 您是否在 DE1 板上使用物理开关?如果是这样,您可能会在线路上遇到很多故障,这些故障正在破坏您的计数器逻辑。查找“去抖动 FPGA 上的开关”以了解如何解决此问题。
  • 另外,我不相信 'last_value 是可综合的。您应该考虑另一种方法来进行正边缘检测。但首先要解决你的去抖问题。
  • @Russell:Altera QII 接受合成'last_value,但只是返回信号的反转值,例如not switch,在只有“0”和“1”的合成设计中听起来是正确的。
  • sseg 是十进制的,g 到 a。对于模拟,计数器不在敏感度列表中,您的显示在 switch 或 rst 上的下一个事件之前不会更新。 “随机”显示症状听起来像是开关和去抖动按钮中的去抖动问题。来自 Terasic Altera DE0 Board 用户手册“仅 PCB 10-0100730-A0 版本包含去抖电路”,4.2 使用 LED 和开关,第 4 段。代码开关作为时钟,检查警告 'last_value 可能被忽略。

标签: vhdl counter seven-segment-display


【解决方案1】:

关于如何继续前进的一些建议:

  1. 设计中没有时钟,但出于多种原因需要时钟 下面列出,所以添加一个时钟端口列表基于一个可用的时钟 在 DE0 参考板上。

  2. 在计数器的上升沿创建一个时钟进程以更新计数器 时钟。

  3. 开关输入通常会产生一定量的弹跳,请参阅 contact bouncing 通常发生。因此必须将去抖动器应用于联系人,请参阅 debounce。德邦德 开关在下面被称为switch_db。该时钟还用于 这个。

  4. VHDL 属性'last_value 不能用于边缘检测,因为 写在代码中。而是制作一个版本的开关信号 通过使用触发器延迟一个周期,然后检查 当前和以前的值,例如 (switch_db = '1') and (switch_db_delay_ = '0')。 VHDL 属性'last_value 通常是测试台功能, 因此仅用于模拟。时钟也用于此目的。

  5. counter 到 7 段值的转换可以在单独的过程中进行, 避免与敏感度列表处理有关的问题,否则可能 在综合工具中生成警告。

【讨论】:

  • 谢谢!我让它工作了!我基本上实现了你列出的所有 5 点,它开始工作了!非常感谢您的帮助! :-D
猜你喜欢
  • 2014-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-28
  • 2013-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多