2017-10-18 4 views
0

私は計数モジュールを実現しようとしています。私の基本的なセットアップ:信号発生器に接続されたIOポートに2本のBNCケーブルが接続され、読み出し用にUSB/UART経由でPCに接続されたFPGA(Digilent's Arty with Xilinx Artix-35T)。 私の信号発生器は、例えば、1HzでTTL信号を生成します。異なるチャネルのカウントが分岐してジャンプする

ここで、チャネル1、チャネル2、チャネル1と2のイベントの数をカウントします。基本原理は機能しますが、チャネル1とチャネル2は同じ入力(BNC-Tコネクタ経由)。また、出力チャネルの1つがいずれの方向にジャンプする場合もあります(図を参照)。 counting 紫色チャネル(「チャネル1」)は緑色(「チャネル2」)とは異なる傾斜を有する。また、ここでは偶然が2つの小さな損失のジャンプをします。

マイシーケンシャルカウントコードが

reg [15:0] coinciInt [(numCoincidences -1):0]; // internally store events 
always @(posedge clk or posedge reset) // every time the clock rises... 
begin 
    signalDelay <= signal;    // delayed signal for not counting the same event twice 

    if(reset)        // reset 
    begin 
     for(i=0;i<numCoincidences;i=i+1) 
      coinciInt[i] <= 16'b0; 
    end 
    else         // No reset 
    begin 
     for(i=1;i<numCoincidences;i=i+1) // loop through all coincidence possibilities: 
     begin 
      if(((signal & i) == i) && ((signalDelay & i) != i)) // only if signal give coincidence, but did not give before, it's a coincidence 
      begin       // "(signal & i) == i" means that "signal" is checked if bitmask of "i" is contained: 
              // ((0011 & 0010) == 0010) is true, since 0011 & 0010 = 0010 == 0010 
       coinciInt[i] <= coinciInt[i] + 1'b1; // the i-th coincidence triggered, store it 
      end 
     end 
    end 
end // end of always 

assign coinci = coinciInt; // the output variable is called coinci, so assign to this one 

のように見えるすべてのイベントは、レジスタcoinciであることに注意してください - 偶然の一致だけでなく、「単一のイベント」。理想的には、チャネルが1,2,4,8、...、2でラベル付けされているため、coinci [1]はチャネル1のイベント、チャネル2のイベント、一致2のイベント、チャネル1のイベントは1と2の一致を格納する必要があります^ nと偶然のそれぞれの和で表される。 coinci [0]は何らかの種類のチェックサムに使われますが、これは今や話題にはなりません。

カウントが足りないというアイデアはありますか?別の斜面のために?

非常

ありがとう

編集1

@Brianマグナソンは、メタ安定性の問題を指摘しました。マルチバッファ入力を使用すると、チャネルが分岐する問題が解決されました。それはうまく動作します。私はこれの理由を完全には理解していませんが、これまでのところ一致チャンネルのジャンプは見られませんでした。あなたはおそらく私に多くの時間を保存します、ありがとう!

+0

これはあなたのために働いてうれしいです。短い答えには申し訳ありません。 https://en.wikipedia.org/wiki/Flip-flop_(electronics)#Timing_considerationsにはもう少し詳しい情報があります。基本的にシンクロナイザーがなければ、入力がファンアウトする最初のFFのセットアップ/ホールド要件に違反することがあります。これが起こるとき、フロップが行く状態(0/1)は決定論的ではありません。シンクロナイザはその動作を「含んでいる」ため、カウンタロジックを汚染させません。別のgoogle'ableフレーズは 'clock domain crossing'です。がんばろう! –

答えて

1

メタ安定性の問題が疑われます。 ch1/ch2の入力パルスは、使用しているシステムクロックと同期していない可能性があります。 See here

このため、予期しない動作が発生する可能性があるため、カウンタの更新内容「中盤」をキャッチしていることがあります。

これを修正するには、残りのロジックに入力する前に入力を2回フリップ(二重ランクシンクロナイザーと呼ばれる)することができます。通常、マルチビット同期には少し注意深い処理が必要ですが、それぞれのビットを独立して扱うことができます。

関連する問題