3

私はオンラインでVerilogコードを読んでいて、多くのコード例でこれに気づきました。ボタンを押すなどのハードウェアソースからの入力が必要な場合は常に、入力がフリップフロップにコピーされ、入力の反転とAND演算されます。これが理にかなっているのかどうかはわかりませんが、ここのコードでは次のようになっています。

input btn;
reg dff1, dff2;
wire db_tick;

always @ (posedge clock) dff1 <= btn;
always @ (posedge clock) dff2 <= dff1;

assign db_tick = ~dff1 & dff2;

そしてdb_tick、ボタンプレスとして使用されます。

場合によっては、これは立ち上がりエッジ検出器としても使用されますが、立ち上がりエッジ検出器を簡単に実装することはできません。always@(posedge signal)

4

2 に答える 2

3

これは、単安定マルチバイブレーター、または特にデジタル回路の場合はワンショットと呼ばれます。この回路の目的は、エッジを単一サイクルのパルスに変更することです。

物理スイッチに直接接続すると、スイッチのデバウンスを実行する方法になりますが、これは実際には適切な使用法ではありません。これ以上のコンテキストがなければ、コードの意図が何であるかを言うのは難しいです。

于 2012-12-15T23:25:01.417 に答える
2

これにより、クロックドメインに同期したエッジ検出が提供されます。ここではデバウンスのハッピングは見られません。エッジ検出の前に2つのメタスタビリティフリップフロップを含めることは非常に一般的です。

input a;

reg [2:0] a_meta;
always @(posedge clk or negedge rst_n) begin
  if (~rst_n) begin
    a_meta <= 3'b0 ;
  end
  else begin
    a_meta <= {a_meta[1:0], a};
  end
end

// The following signals will be 1 clk wide, Clock must be faster than event rate.
// a[2] is the oldest data,
//   if new data (a[1]) is high and old data low we have just seen a rising edge.
wire a_sync_posedge = ~a_meta[2] &  a_meta[1];
wire a_sync_negedge =  a_meta[2] & ~a_meta[1]; 
wire a_sync_anyedge =  a_meta[2] ^  a_meta[1]; //XOR
于 2012-12-20T15:39:41.600 に答える