どうしてFPGAは同期設計するのか

どうしてFPGAは同期設計するのか

 デジタル回路設計の現場ではFPGAを扱うことが多くなってきました。このブログではFPGAに適した回路設計手法を解説していますが、その中で最も重要なのは同期設計です。

 同期設計とは1つのクロックを使って間引いて動作させるという考え方です。初心者がイメージするのに「間引く」というのがぴったりだと思います。同期設計は必ずマスターしなくてはいけない手法ですので、何度も繰り返して身に着けてください。

 同期設計がなぜ重要なのかというと、FPGAの構造から来ています。FPGAは京都や札幌の街並みのように碁盤の目状にロジックが配置されています。大きな通りが中央にあり、そこがクロックの通り道になっています。

 一般的には以下のように構成されています。FPGAは各社特徴を持っているので細かいところではアレンジされていますが、おおまかには中央にグローバル配線があり、その周囲にロジックセル(LC)が配置されている。という構造になっています。

 VHDLやVerilogで回路を設計し、メーカーのコンパイラでコンパイルしてFPGAの中に回路を配置するのですが、その際に設計した回路は自動配線されます。手動でもできますが、最初は自動配線してから手動で配置を修正する。という方法をとるのが一般的です。

 この部品を配置する。という作業によって、FPGAの物理的な位置を決めるのですが、FPGAの内部構造で示したLCの部分のどこに配置するのかが非常に重要になります。

 例えば次の図のようにオレンジの部分に配置されたとします。

 オレンジの部分は離れているので、距離が生じます。それにより、遅延が生じます。この遅延によって安定動作が保証されなくなるのです。回路規模が大きくなればなるほど、ロジックは広範囲になりますので、それらすべてを手動で配置するのが困難になります。

 そこで、クロックとクロックの間で区切って処理をするようにすれば、気にするのは次のクロックまでの遅延だけになります。さらに図に示したように中央にクロックが配置されているので、各ロジックセルまでのクロック遅延は比較的差がありません。これはユーザーが同期設計で使用することを前提としているからです。

 このクロック用の配線はグローバル配線といって、高速に動作する数本の専用線になっています。最近のFPGAはこの配線にPLLが接続されて、より高速なクロックを扱えるようになっています。

 このようにして、クロックとクロックの間の時間だけを管理してロジックを配置すれば、コンパイラは時間を計算できますし、アラートを出しやすくなります。

 クロックは専用線で最小遅延で配置されますので、温度や湿度などの外的要因による遅延のばらつきもある程度管理が可能になります。

 このような理由によりFPGAでは同期設計をするのが鉄則になっています。

 それでは、冒頭でお話した「間引く」という回路はどのようにすれば良いかといえば、DFFのイネーブルを使用してDFFの動作をONしたり、OFFしたりして操作すれば、クロックに同期してなおかつイネーブルで間引く。という事が可能になります。

 良い例と悪い例を示します。まずは、良い例から。

 上の例は良い例です。ここではDFFのenable端子を使って、DFFの動作を停止させます。一時停止のイメージです。そうすることによって、クロックに余分なロジックが入り込みません。また、この場合のenable信号もクロック同期で作ることでセットアップ、ホールドタイムを気にせずに設計することができます。次に悪い例を示します。

 このような方法は、クロックにandロジックが挿入されてしまい、本来のクロックのタイミングからandデバイス分の遅延が生じます。また、enableをON/OFFするタイミングもセットアップ、ホールド時間を守る必要があり、非常に設計が難しくなります。

 本ブログでFPGAの回路をVHDLやVerilogで解説していますが、これらはすべて同期設計を前提に解説しています。自然に同期設計が身につくようにアドバイスいたします。