2016-04-25 16 views
0

入力ボタンで待っているプロセスで20msの遅延を作ります。VHDLの1つのプロセスで2つのwait文を使用できますか?

私は、次のコードを書き、それが

wait until clk'EVENT and clk='1'; 
wait for 20 ms; 

それとも、私のような構文を使用することができ、エラーを与える:

wait for 20 ms until clk'EVENT and clk='1'; 

すべてのヘルプは高く評価されています。

答えて

1

イベントを待つことも、時間を待つことも、両方を待つことも(どちらもそうではありませんが、それはユニークなケースです)。

ここでは、最初の例が有効なシーケンシャルステートメントであるためにエラーが発生する理由がわかりません。しかし、あなたは完全な例やエラーコードを提供していません。だから、私の答えはかなり基本的なものになるでしょう。

最初に、waitステートメントは、シーケンシャルステートメントとしてのみ発生することができます。本質的にはprocess(またはprocessから呼び出されます)を意味します。したがって、同時に使用しようとすると問題になります。

ここでprocessから使用している場合は、機密性リストなしでprocessにする必要があります。 (適切シーケンシャルコンテキストに入れ、コンパイルしない)最初の例についてもう少し

process 
begin 
    wait until clk'EVENT and clk='1'; 
end process; 

process(clk) 
begin 
    wait until clk'EVENT and clk='1'; 
end process; 

それは以下のような裸のプロセス、でなければならない:それは、次には違法です:

process 
begin 
    wait until clk'EVENT and clk='1'; 
    wait for 20 ms; 
end process; 

このコードはclkの立ち上がりエッジを待ち、その後20msのを待ちます。これらは順番に実行されます(したがって、プロセス内のシーケンシャルコンテキスト)。

2番目のステートメントを編集してコンパイルする必要があります。一般に、waitステートメントの形式はwait until <event> for <time>であり、eventtimeの両方がオプションです。例:

process 
begin 
    wait; -- No event, no time. Wait forever. 

    wait until clk'event and clk='1'; -- Wait forever for a rising edge on 'clk' 

    wait for 20 ms; -- Wait for 20 ms 

    wait until clk'event and clk='1' for 20 ms; --Wait for up to 20 ms for a rising edge on 'clk' 
end process; 

したがって、2番目の例では、イベントと時間の順序が逆になります。

最後に、紹介テキストは、プッシュボタンが20ms待っていることを示しています。これは、あなたが本当の論理を作り出そうとしていることを示唆しています。 waitステートメントは、非常に限られたユースケースでのみ合成可能です。具体的に除外された症例の1つは、一定期間待機しているケースです。 20ミリ秒待つ必要がある場合は、他の方法(時計のカウントなど)を行う必要があります。そして、あなたがボタンのために20ミリ秒まで待つことを試みているなら、それは押しボタンの変化を検出し、時計を数えることの組み合わせでなければなりません。

+0

あなたの '20ms'は標準に準拠していません。 IEEE Std 1076-2008、15.3字句要素、区切り文字、および区切り文字4「識別子または抽象リテラルと隣接する識別子または抽象リテラルとの間に少なくとも1つの区切り記号が必要です」物理的リテラルは、オプションの抽象リテラルと識別子(5.2.4.1)で構成されます。 – user1155120

+0

@ user1155120タイプミスを指摘していただきありがとうございます。私は答えを更新しました。 – PlayDough

関連する問題