1

リセットボタンを表すデジタル入力を備えたCPLDがあります。リセットボタンを押すと、信号がハイになります。私がする必要があるのは、ボタンが押されたことがあるかどうかを示す値を持つレジスターを用意することです。基本的にはラッチです。ボタンがハイになると、ラッチレジスタがハイになり、永久にハイのままになります。

これは簡単だと思いましたが、コード化しようとするとたくさんの警告が表示されました。小さなグーグルは「HDLでラッチを作らないでください!悪い習慣です!」と示しましたが、私はここで代替案を実際には見ていません。

これが私の試みです。clk_10mは高速の自走時計で、pwr_off_reqはボタン入力です。

reg pwr_off_req_latched = 0;

always @ (clk_10m or pwr_off_req) begin

   if (pwr_off_req == 1'b1)
      pwr_off_req_latched <= 1'b1;   
   else
      pwr_off_req_latched <= pwr_off_req_latched;
      // I tried this to make sure it's always set to something          
end
4

3 に答える 3

2

ボタンを押すパルス長がデバイスのクロック周波数よりはるかに長いと想定できますか?それが物理的なボタンである場合、それは非常に安全な仮定だと思います。その場合、これは完全にうまくいくと思います。

always @(clk_10m) 
   pwr_off_req_latched <= power_off_req_latched | power_off_req;
于 2013-01-30T06:35:56.243 に答える
1

ラッチはHDLで悪くはありませんが、いくつかの考慮が必要です。組み合わせセクションでelse句を指定し忘れることによる暗黙のラッチは、期待するハードウェアに到達しないために悪く、タイミングの問題が発生する可能性があります。

リセットを適用する場合は、合成ツールが正しく識別するように「プラグマ」を指定する必要がある場合があります。

また、ラッチは使用し=ない<=でください。有効になっている場合、ラッチは組み合わせ(オープン)であり、フィードバックループを中断しません。

これは、非同期リセットでラッチを作成する一般的な方法です。

//synopsys async_set_reset "rst_an"
always @* begin
  if (~rst_an) begin
    // Reset 
    x = 1'b0;
  end
  else if (latch_open) begin
    //next datavalue
    x = y ;
  end
end

あなたの場合、あなたは次のようなものが欲しいかもしれません:

//synopsys async_set_reset "rst_an"
always @* begin
  if (~rst_an) begin
    pwr_off_req_latched = 1'b0;
  end
  else if ( pwr_off_req ) begin
    pwr_off_req_latched = 1'b1 ;
  end
end
于 2013-01-30T09:42:41.110 に答える
1

ラッチは、タイミング分析ツールに問題を引き起こす可能性があります。また、特定の(FPGA)アーキテクチャに直接マッピングされないため、配置配線ツールでははるかに困難です。したがって、警告。

しかし、私がデジタルロジックの意味を理解しているので、あなたが求めているのはラッチではありません。リセットされることのないフリップフロップにすぎません。

したがって、D入力を1に接続し、clk入力をpwr_off_req信号に接続した単純なdタイプのフリップフロップに簡略化できます。

reg pwr_off_req_latched = 0;

always @ (posedge pwr_off_req) begin
      pwr_off_req_latched <= 1'b1;   
end

その上でノイズ除去はまったくありません-方向のエッジはフリップフロップをにラッチし1ます。

これを行う場合は、入力をダブルフリップフロップシンクロナイザーに接続し、同期信号の数クロックパルスをカウントして、ラッチされた信号を設定する前にノイズがないことを確認します。あなたがそれをする方法であるいくつかのクロックパルスより短い実際のイベントを期待していない限り。


脇:

デジタルロジックの世界での「ラッチ」とは、通常、次のいずれかを意味します。

  • 2つの入力のどちらかが最後にハイになった出力を保持する回路(セット/リセットまたはSRラッチ
  • 制御信号が非アクティブの間は出力が入力値を保持するが、制御信号がローのときは入力に追従する回路-透過ラッチ

これは、制御信号が(通常)ローからハイに変化するときに出力が入力に関連するいくつかの側面を保持し、その立ち上がりエッジの周りの小さな時間ウィンドウを除いて入力を無視するフリップフロップと比較されます。これらは、入力に対する出力の動作に応じて、DタイプTタイプ、およびJKタイプのフリップフロップです。

于 2013-01-30T16:30:43.427 に答える