クロックの両端を使用する


10

私はVerilogとQuartus IIを使用してアルテラのCyclone IVをプログラミングしています。私のデザインでは、クロックの両方のエッジを使用して、50%のデューティサイクルで奇数の係数でクロックを分周できるようにしたいと考えています。これが私のコードのスニペットです:

  always @(posedge low_jitter_clock_i or negedge low_jitter_clock_i or posedge reset_i) begin
    if(reset_i) begin
      fixed_clock <= 1'b0;
      divider_dummy <= 'b0;
    end else begin
      fixed_clock <= fixed_clock_next;
      divider_dummy <= divider_dummy_next;
    end
  end

これをコンパイルすると、Quartus IIは次のエラーをスローします。

Verilog HDLは常にadc_clocking.v(83)でエラーを構成します:イベント制御は変数 "low_jitter_clock_i"のポジティブエッジとネガティブエッジの両方をテストできません

デザインで特定のクロックのポジティブエッジとネガティブエッジの両方を使用するにはどうすればよいですか。

回答:


7

エッジセンシティブな常にブロックのレジスタに割り当てる場合、フリップフロップを定義しています。FPGAには、クロックの両方のエッジでトリガーできるフリップフロップはありません。

必要なことを行うには、クロックの各エッジに1つずつ、2つの別個のalwaysブロックを用意し、グリッチを発生させずに2つのブロックの出力を組み合わせる方法を理解する必要があります。

たとえば、常に1つのブロックにプログラム可能な除算器を含めることができます。奇数を指定した場合に出力デューティサイクルが50%未満になるように設計します。2番目のalwaysブロックを使用して(もう一方のクロックエッジで)最初のブロックの出力を1/2クロック遅らせ、次に2つの出力をORします。分周器の値が偶数の場合は、2番目のブロックの出力を無効にします。


クロックのポジティブエッジとネガティブエッジの両方を使用する理由は、デューティサイクルを50%にするためです。
Randomblue

はい、わかりました。私の答えはそれを直接扱っています。分周器の値が偶数のときに50%のデューティサイクルを取得する方法をすでに知っていると思いました。何がわからないのですか?
Dave Tweed 2012

デュアルエッジフリップフロップはありませんか?これには固有の理由はありません。だれもそれらを作成していない(または少なくとも私たちが知っているだれも)いないことがわかります。マーティンが指摘するように、デュアルエッジフリップフロップをサポートするCPLDがあります。xilinx.com
Philippe

3

これが内部ロジックの場合は、使用可能なフリップフロップの近くに書き込む必要があります。Coolrunner-IIを除いて、本質的にダブルエッジレジスタを備えたプログラマブルロジックについては知りません。

したがって、always1つはネガエッジ用、もう1つはポージング用の2つのブロックを作成し、それらの出力をいくつかの組み合わせロジックと組み合わせる必要があります。

または、PLLを使用してクロックを2倍にしてから、従来の単一エッジロジックを使用できます。



1

Dave Tweedが指摘しているように、FPGAにクロックの両方のエッジで動作できるフリップフロップハードウェアが含まれていない限り、従来のシングルエッジフリップフロップを使用して目的の動作を実装するために独自のロジックを記述する必要があります。ダブルエッジフリップフロップのように動作する回路を実装する方法はいくつかありますが、そのような回路は一般に、フリップフロップに関連するものとは異なるタイミング制約を追加します。

たとえば、単純なアプローチは、2つの2入力xorと1組の「T」フリップフロップ(クロックパルスが到着したときの入力の状​​態が、そのクロックエッジが出力を切り替えるかどうかを示す)を組み合わせたモジュールを持つことです。立ち上がりエッジによってトリガーされるものと、立ち下がりエッジによってトリガーされるもの。モジュールの出力は、フリップフロップの出力のxorになり、両方のフリップフロップへの入力は、モジュールの出力とその入力のxorになります。

この方法で設計された回路は、本質的にはダブルエッジフリップフロップのように動作しますが、セットアップおよび伝搬時間が長くなりますが、追加のタイミング制約があります。フィードバックパス上にない通常のフリップフロップは、クロックエッジの開始にラントパルスの束があっても問題ありません。ただし、クロックが有効なレベルで安定し、セットアップ時間の制約が最初のラントパルスと、クロックパルスが安定してアクティブになった時間から測定されたホールドタイムとクロックアクティブ時間の制約が満たされます。フリップフロップ出力の動作は、クロックが不安定な間は不定ですが、クロックが安定した後に定義されます。double-xor-double-flopモジュールは、出力を変更するクロックエッジは、そうする可能性のある他のクロックエッジから安全な距離でなければならないという追加のタイミング制約を追加します。たとえば、入力が出力と一致しないときに3つのクロックエッジが非常に連続して存在することにより、その制約を満たさない場合、出力が不確定または準安定状態になる可能性があります(偶数のエッジを含むシナリオは問題ではないことに注意してください) 、そのようなシナリオにはラントパルスのみが含まれるため、ラントパルスの後に有効なパルスがあるため、3つのエッジのケース(または1より大きい他の奇数のケース)が問題になります。

別の回路設計では、上記のように2つのフリップフロップを使用しますが、それらの出力をマルチプレクサに供給します。この回路はラントパルスによって不良状態に陥ることはなく、クロッキングの制約は基礎となるラッチと同じになりますが、出力が高かったままである(または低かったため低のままである必要がある)という欠点があります。 )そのため、クロックエッジで短時間グリッチする可能性があります。重要ではない回路もあれば、重要な回路もあります。

論理合成ツールが、どのタイミング制約が重要であると指定されているかを分析することにより、ダブルエッジフリップフロップを自動的に実装することはおそらく可能ですが、そうすることはやや難しいでしょう。また、設計に小さな変更を加えると実装に大きな変化が生じ、予期せぬ動作の変化が生じるリスクが高まります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.