0

私はVHDLとXILINXISEを初めて使用します。XilinxISEにはバージョン13.2を使用しています。

次の入力を使用して、非常に単純なカウンターを設計したいと思います。

  • 方向
  • カウント

カウント入力はボタンに割り当てられ、ボタンが押されたときに入力された方向に応じてカウンターがカウントアップまたはカウントダウンするようにします。この前にサンプル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...

このエラーがなくなった後、デバイスをプログラムしました。しかし、出力(LED)は狂ったように振る舞いました。彼らは時々数秒間静止し、時には非常に速く点滅しました。私は自分の間違いがどこにあるのか理解できませんでした。助けていただければ幸いです。いくつかの初心者向けチュートリアルは大歓迎です(私が見つけたリンクからザイリンクスのドキュメントにアクセスでき、初心者にとっては非常に複雑に見えました)。

4

2 に答える 2

1

あなたは時計を持っていません。COUNT_ENとDIRECTIONの条件が満たされると、count_int変数は可能な限り速く増加します...実際、個々のビットが変更されるタイミングによって、全体が完全に不安定になり、正しくなくなる可能性があります。

FPGAが正しいタイミングをとれるようにするために、常にクロックを使用する必要があります。

この場合、クロックを戻します...次に、新しい信号COUNT_EN_LASTを追加します。クロックプロセスを通過するたびに、古いCOUNT_ENを保存します。COUNT_EN='1'およびCOUNT_EN_LAST='0'の場合にのみインクリメントします。

実際、次に、入力を「デバウンス」する必要があることがわかります。物理的なボタン/スイッチは「バウンス」し、ボタンを1回押すごとに複数のオフオンイベントを提供します。そのためには、COUNT_EN_LASTをベクトル(たとえば5つの長さ)にし、毎回新しい値をその中にシフトし("COUNT_EN_LAST <= COUNT_EN_LAST(3 downto 0)&COUNT_EN;" )、 COUNT_EN_LAST="01111"の場合にのみインクリメントします。 、またはそれらがすべて1になる直前。必要なベクトルの長さは、時計の速さや、新しい状態に落ち着く前にスイッチがバウンスできる時間によって異なります。

于 2013-03-18T19:51:36.547 に答える
1

あなたの説明から、あなたは非同期カウンターを探していないことを理解しています。

必要なのは、プッシュボタンスイッチからのトリガーを頼りにするカウンターです。以下のRTLが機能するはずです。

ここに画像の説明を入力してください

HDLコーディングに問題がある場合は、私に知らせてください。

于 2013-03-19T12:47:13.993 に答える