7 セグメント ディスプレイに表示される単純なカウンター (0 ~ 9) のコードを作成しようとしています。インクリメントする方法は、スイッチを介して行われます - ロジック 0 からロジック 1 に移動すると、1 ずつインクリメントされます。カウンターを 0 にリセットするためのレスト機能もあります。
ここを見て、コードの大部分をソートしました。コンパイル時に ModelSim でこれをシミュレートしたところ、期待どおりに動作しました。しかし、コードを DE0 ボードにダウンロードしても機能しません。非常にランダムで、識別可能なパターン (ランダムな LED が点灯する、ランダムな数字が表示されるなど) がないため、その機能を説明することさえできません。
ただし、リセット (カウンターを 0 に設定し、7 セグメントに 0 を出力する) は正常に機能します。
これまでの私のコードは次のとおりです。
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 つの「チーム」のスコアを維持する方法が必要です。単純なカウンターを機能させることができれば、2 つのチームのスコアを維持することで簡単に (できれば!) できると考えました。
DE0 ボードにはデバウンスされるボタンがありますが、ボタンを使用するようにコードを変更すると、7 セグメントはボタンが押されている間はランダムな値/パターンを表示し、その後別のランダムな値/パターンに変更されます。ボタンが離されました。