1

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 セグメントはボタンが押されている間はランダムな値/パターンを表示し、その後別のランダムな値/パターンに変更されます。ボタンが離されました。

4

1 に答える 1

1

先に進むためのいくつかの提案:

  1. デザインにはクロックがありませんが、以下に示すいくつかの理由でクロックが必要なため、DE0 リファレンス ボードで使用可能なクロックに基づいてポート リストにクロックを追加します。

  2. クロックの立ち上がりエッジでカウンタを更新するクロック処理を行います。

  3. スイッチ入力は通常、ある程度のバウンスを生成し ます。接点バウンスが 通常発生することを確認してください。そのため、連絡先にデバウンサーを適用する必要があります 。 debounceを参照してください。deboundes スイッチは、以下のように参照されswitch_dbます。時計もこれに使用されます。

  4. コードに記述されているように、エッジ検出にVHDL 属性'last_valueを使用することはできません。代わりに、フリップフロップを使用して 1 サイクル遅延させたスイッチ信号のバージョンを作成し、現在の値と前の値を確認します(switch_db = '1') and (switch_db_delay_ = '0')。通常、 VHDL 属性'last_valueはテスト ベンチ機能であるため、シミュレーション専用です。時計もこれに使用されます。

  5. counter合成ツールで警告が生成される可能性があるセンシティビティ リストの処理に関する問題を回避するために、7 セグメント値への変換は別のプロセスで行うことができます。

于 2014-10-09T16:56:12.643 に答える