FPGA超入門 その3-注意点-

2021/05/27に公開

回路を記述していく上で、誤動作や性能低下につながる注意した方がよい点をいくつか挙げていきます。

初期化

前回のFPGA超入門 その2で書いたソースコードは、そのまま使おうとすると恐らく誤動作します。というのも、serial_adderのQ1(D-FF)が初期化されていないからです。
この場合、計算前に初期化(クリア)する信号(下記例だとCLR)を用意して、

VHDL
  process(CLK) begin
    if(CLK'event and CLK = '1') then
      if(CLR = '1') then
        Q1 <= '0';
      else
        Q1 <= C1;
      end if;
    end if;
  end process;
verilog
  always@(posedge CLK) begin
    if (CLR == 1'b1) begin
      Q1 <= 1'b0;
    end else begin
      Q1 <= C1;
    end
  end

のようにするのがよいかと思います。

遅延

論理回路は、それを構成する素子の遅延や、回路間をつなぐ配線の遅延の影響を受けます。
同じクロックを使うFFの間に大きな組み合わせ回路があると、その組み合わせ回路の遅延によって、後ろのFFが次のクロックで信号を受けられないことがあります。そのような場合、一般的には正しく動作しません。[1]

また、FPGA外部との信号の受け渡しにタイミング規定があるような場合、遅延をうまく制限しないと信号の受け渡しに失敗する場合があります。
前者のような場合は、組み合わせ回路を工夫して小さくしたり、処理を分けたりしてFF間の遅延が小さくなるようにします。後者のような場合は、コンパイル時にタイミング規定を満足するような設定になるよう見直したりといったことが必要になってきます。
このあたりは、いずれ記事に出来ればと思っています。

セットアップ時間/ホールド時間

遅延によって、データの変化点がクロック付近に来てしまう場合には、注意が必要です。FFがクロックで正しくデータを保持するためには、クロックの前後でデータが安定している必要があります。クロックの前をセットアップ時間、後をホールド時間と呼びます。
デバイス毎に時間の規定があるので、それらを満足しないといけません。

メタステーブル

セットアップ時間/ホールド時間を満足できない条件の特殊な事例になりますが、クロックでデータを保持する際にデータの変化点があり、丁度中間電位だった場合、メタステーブルという状態になります。メタステーブル状態ではHともLとも言えない中間電位付近で一時的に安定な状態となり、その後ノイズの影響により確率的にHかLに落ち着きます。

確率的にHかLになるため誤動作した場合に見つけにくく、メタステーブル状態にならない、あるいはメタステーブル状態を後段へは渡さない回路を作るといった点に気を付けなければいけません。

同期/非同期

同期/非同期というのも、避けて通れない話題かと思います。簡単に書くと、単一のクロックで動作している論理回路を同期回路、複数のクロックを使用したり、前段の論理演算の結果をクロックに入力したりするような回路を非同期回路と言います。
非同期回路はうまく設計しないと正しく動作しないことが多く、特に遅延の影響を大きく受けるので、設計/検証はなかなか難しいです。

同期化

複数のクロックを使用する装置は珍しくなく、ある周波数Aで動作する同期回路で作った信号を別の周波数Bで動作する同期回路に受け渡すということがあります。単純に接続すると、一般的にBのクロックで受けるAの位相が毎クロック異なってきます。その中にはセットアップ時間/ホールド時間を満足しない位相が含まれる可能性があり、誤動作の原因となります。
そこで、Bのクロックで同期化を行います。同期化の方法には様々なものがありますが、一番単純なものは、FFを2段つなげたものになります。このあたりも、いずれ記事に出来ればと思っています。

脚注
  1. わざと次の次のクロックで受けるという設計をする場合も無くはありません。 ↩︎

Discussion