2016-04-26 11 views
0

現在、VHDLでプロジェクトを行っています。このプロジェクトでは、キーを押した場合に100msまたは1000msで更新する必要があるカウンタがあります。時分割(期間)vhdlでの選択

例:

If Key3=0 then 
c=c+1 (100ms) 
elsif key3=1 then 
c=c+1 (1000ms) 

私はVHDLでそれを行う方法を知っているように思います。

私はプロセス(クロック、Key3)を使用する必要がありますが、私は期間に基づいてカウンタを増やす方法がわかりません。

ありがとうございます!

答えて

1

私はあなたがそこに途中だと思います:

私は、プロセス(クロック、キー3)を使用する必要があります信じて、私は期間に基づいて、カウンタの増加を作成する方法がわからないです。

この問題は、デジタル設計の問題であり、コーディングの問題ではないと考えてください。あなたは、実際のデジタルシステムで時間の経過を測定するために何を使用しますか?そこから100msか1000msが経過したかどうかを判断する基準として使用します。

時間を測定できたら、特定のイベントの処理時間をどのように決定しますか?

0

cは、タイプ時の(プロセスで)変数である場合は、時間が非常によく、合成のためにサポートされていないものの、その後

if some_condition then 
    c := c + 100 ms; 
else 
    c := c + 1000 ms; 
end if; 

は、有効なVHDLで、シミュレーションで動作します。

最も簡単な解決策は、Cがタイムステップ(クロックサイクルの倍数など)でカウントし、これらの1または10を追加することです。例えば

あなたは10MHzのクロックがある場合:

constant Clock_Period : time := 100 ns; 

constant ms_100 : natural := 100 ms/Clock_Period; 
constant ms_1000 : natural := 1000 ms/Clock_Period; 
signal c : natural; 
... 

    if some_condition then 
     c <= c + ms_100; 
    else 
     c := c + ms_1000; 
    end if; 

そして、あなたは、クロック周波数を変更した場合に、一致するclock_period宣言を調整します。

+0

最近、「時間」タイプに基づいた定数と範囲の生成に関して、Vivadoの問題が発生しました。上で説明したように、これは完全に離れて最適化されます。ザイリンクスでは、「time」タイプのオブジェクトはサポートされていないことを認識しています。 AR57964(http://www.xilinx.com/support/answers/57964.html)を参照してください。 – PlayDough

+0

@Playただし、あなたがリンクしたARは、Time ISがVivadoでサポートされているが、貧弱です。したがって、この手法は、Vivadoユーザの場合はザイリンクスによって推奨されていません(他の人が64ビットを使用する場合は32ビット算術を使用し、他の場合はSynplicityに他の問題があります)。しかし、最も高いレベルでコードを最も明確に表現することは、通常の習慣でなければなりません。ツールのサポートが不十分な場所から逸脱している。 –

+0

十分です。時間はサポートされていません。しかし、あなたが指摘しているように、私たちは使用するツールによって制限されています。代わりに、 '定数Clock_Period:real:= 100.0e-9;'のようなものです。実際の値はうまくサポートされています。 – PlayDough