2017-06-22 8 views
1

ここにザイリンクスのZynqのコードのコードを示します。私はそれが何のために理解できないのですか?奇妙なエッジ検出または他の何か?

Iはpulse_d2が1だけs_axi_resetnの立ち下がりエッジである参照として。

このように立ち下がりエッジを検出する理由は何ですか?

なぜイベントを使用しないのですか。「if(s_axi_resetn'event and s_axi_resetn = '0')」のようなものは使用しないでください。

process(s_axi_clk) 
    begin 
     if (s_axi_clk'event and s_axi_clk = '1') then 
      if (s_axi_resetn = '0') then 
       pulse <= '0'; 
      else 
       pulse <= '1'; 
      end if; 
     end if; 
    end process; 

    process(s_axi_clk) 
    begin 
     if (s_axi_clk'event and s_axi_clk = '1') then 
      if (s_axi_resetn = '0') then 
       pulse_d1 <= '0'; 
      else 
       pulse_d1 <= pulse; 
      end if; 
     end if; 
    end process; 

    pulse_d2 <= pulse and (not pulse_d1); 
+0

これはザイリンクスの例ですか? Imho彼らはここでいくつかの低品質のコードを作った。奇妙な信号の命名。 'rising_edge'を使用していません。そして、すべてがもっと効率的に書くことができました。 – JHBonarius

+0

はい、このコードはAXI Datamoverの例です。学習の目的で同じ機能を備えた、より効率的なコードやその他のバリアントを提供してください。 – eloiman

答えて

1
s_axi_resetnが低いため s_axi_clkの立ち上がりエッジで

pulsepulse_d1'0'pulse_d2に強制されても、値「0」をとります。

s_axi_resetnが高いため s_axi_clkの最初の立ち上がりエッジで

pulseがハイになるが、pulse_d1サンプル、'0'pulseの電流値。したがって、pulse_d2は値 '1'をとります。

の第2の立ち上がりエッジでは、s_axi_resetnが高く、pulseが高く、pulse_d1が高くなります。 pulse_d2は値 '0'をとります。

の次の立ち上がりエッジでは、s_axi_resetnが高く、pulseおよびpulse_d1が高くなります。 pulse_d2は値 '0'をとります。

したがって、このデザインは、リセットのアサート解除を検出し、pulse_d2の1クロック周期のパルスで信号を送信する方法です。

1

引用したコードは同期エッジ検出器の例です - たとえばthis on my company's websiteを参照してください。

これはクロックではない一部の信号のエッジを検出するために使用されるため、同期デザインです。全てのフリップフロップが存在すべきでないラッチ

  • があってはならない同じクロック
  • の同じ縁 から常時クロックされるべきである

    1. 同期するように設計について

      いいえ組み合わせフィードバックです。

    あなたがコード

    if (s_axi_resetn'event and s_axi_resetn = '0') 
    

    を使用して、エッジ検出器を実装した場合、これは、信号s_axi_resetnによってクロックされるフリップフロップに合成するでしょう。あなたはルール#1を破ったばかりで、あなたのデザインはもはや同期していません。

    さまざまな理由から、実際の設計は完全に同期している可能性は低いです。ただし、同期設計からの離脱回数を最小限に抑える必要があります。出発時には、文字通り夜間に目を覚ます必要があります。したがって、信号をフリップフロップのクロック入力に接続するのではなく、常に同期エッジ検出器を使用して信号のエッジを検出する必要があります。

  • +0

    ありがとう、非常に便利!私はこのようなエッジ検出器をコンポーネント設計として作ることができると考えています。 – eloiman