43

立ち上がりエッジを検出するために常にこれを使用していました。

if (clk'event and clk='1') then

しかし、これも使用できます:

if rising_edge(clk) then

この投稿を読むことrising_edge(clk)をお勧めしますが、間違った動作につながる可能性があることを示すコメントもあります。rising_edge(clk)

将来のために、継続する(clk'event and clk='1')か採用するか、どちらを選択するかを決めることはできませんrising_edge(clk)

これら2つの実世界での経験はありますか? 好みはありますか?

ありがとう!

4

3 に答える 3

18

リンクされたコメントが正しくありません:「L」から「1」は立ち上がりエッジを生成します。

さらに、クロック信号が「H」から「1」に遷移する場合、rising_edge(clk)は(正しく)トリガーされませんが、(clk'event and clk = '1')(誤って)トリガーされます。

確かに、それは不自然な例のように見えるかもしれませんが、他の場所での障害のために、実際のハードウェアでクロック波形がそれを行うのを見てきました。

于 2013-03-04T16:31:03.803 に答える
13

実際の例:

バスがトライステートで、両方のネットに弱いプルアップがある I2C バス (SCLクロック用とデータ用に呼び出される信号) のようなものをモデル化していると想像してください。SDAテストベンチは、PCB 上のプルアップ抵抗を「H」の値でモデル化する必要があります。

scl <= 'H'; -- Testbench resistor pullup

I2C マスターまたはスレーブ デバイスは、バスを「1」または「0」に駆動するか、「Z」を割り当てることでそのままにしておくことができます

SCL ネットに「1」を割​​り当てると、SCL の値が変更されるため、イベントが発生します。

  • に依存するコード行がある場合(scl'event and scl = '1')、誤ったトリガーが発生します。

  • に依存するコード行がある場合 rising_edge(scl)、誤ったトリガーは発生しません。

例を続けると、SCL に '0' を割り当ててから、'Z' を割り当てます。SCL ネットは「0」になり、その後「H」に戻ります。

ここで、'1' から '0' に移行してもどちらのケースもトリガーされませんが、'0' から 'H' に移行するとrising_edge(scl)条件がトリガーされます (正しい) が、(scl'event and scl = '1')ケースはそれを見逃します (正しくない)。

一般的な推奨事項:

すべてのコードで、代わりにrising_edge(clk)andを使用します。falling_edge(clk)clk'event

于 2013-08-06T23:45:41.270 に答える