【发布时间】: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