今回は、「単相同期回路」で設計する理由について解説します。ここで単相同期回路の記述スタイルや考え方をしっかりとマスターしましょう
連載第3回「順序回路の基本! カウンタを作成しよう」では、順序回路の1つである「4bitのカウンタ」を設計して、FPGAボード上にインプリメント(作成)しました。ただし、カウンタを動作させるクロックに関しては元の6MHzのクロックではなく、分周して作成したクロックで動作させました。
しかし、この方法は最近の設計方法としてはあまり好ましいものではありません。FPGA設計の基本は(FPGAに限ったことではないですが)、“単相同期回路”つまり“1本のクロックですべてのフリップフロップ(順序回路)を駆動する”ことです。今回はこのあたりの内容を徹底的に解説します。
関連リンク: | |
---|---|
⇒ | いまさら聞けない FPGA入門 |
ここでは、“なぜ単相同期回路で作成する必要があるのか”を解説します。
ここでは、単相同期回路について説明する前に、「ISE WebPACK」などのツール(論理合成、配置配線)がどのような方針の下に回路を評価し、最終的にどのようにして回路にするのかを解説します。
これらのツールは「静的なタイミング解析」、いわゆる“スタティックな遅延解析”を行い作成する回路を評価して決定します。では、スタティックな遅延解析とは、どのようなものなのでしょうか?
実は、それほど難しいものではありません。
図1にあるように、NOT素子(1nsの素子遅延)、NAND素子(2nsの素子遅延)、NOR素子(3nsの素子遅延)、それぞれの各素子に入力されてから出力されるまでの遅延値が図1のように決まっているとします(この例では配線による遅延は考慮しません)。
この前提で考えると、入力から出力まで一番時間がかかるパスは、1ns(NOT素子)+2ns(NAND素子)+3ns(NOR素子)=6nsのパスと評価されます(図1では赤の太線で示すパス)。この評価が、その回路の実力(最大動作周波数(1/6ns=約166MHz))として判断されるのです。
さて、最大動作周波数が求められましたが、本当にこれ以上速いクロックで動作しないものなのでしょうか?
ここで論理的なことを考慮してみましょう。もし、[入力3]の値が「1」だったらどのようになるでしょうか? 図1にあるように最終段のNORの入力には「1」が入力されます。この場合だと、NORの片方の入力が「1」なので、もう片方の入力は「0」でも「1」でも出力には依存しません。つまり、この場合のように“論理値”を考慮すると、最大動作周波数は、
3ns(NOR素子のみ)=3ns
になります。シミュレーションのテストベンチのように、それぞれの素子の論理値を考慮して遅延を評価する方法を「ダイナミック(動的)な遅延解析」と呼びます。
それでは、「動的な遅延解析」と「静的な遅延解析」を比べてみましょう。
ツール上での計算量はどちらが多いでしょうか? これは明らかで、「ただ単に素子遅延を足し込んで遅延解析を行っているものより、各素子の論理値まで考慮して遅延解析する方が計算量が多い」ということは直感的に分かると思います。
つまり、最近の大規模回路の場合、ダイナミックな遅延解析を行うとかなりのマシンパワーが必要となります。そのため、性能的な評価を行う際は、スタティックな遅延解析を用いることが多いようです。
図1の回路は、スタティックな遅延解析により「6ns」と評価されました。しかし、ここには大きな前提があります。この回路の入出力部分に相当する、フリップフロップ(F/F)が遅延解析の“始点”と“終点”であるということです(同じクロックをF/Fのクロック端子に入力しないと前提が崩れてしまいます)。
一般的にFPGAのツール(に限ったことではありませんが)は、上述したようにスタティックな遅延解析を行っているので、これらのツールの一番得意な回路というのは、図2のように入力される信号をいったんF/Fで受けて、出力する信号を必ずF/Fで出力し、同位相のクロックですべてのF/Fを駆動するというものです。つまり、各F/Fのクロック端子に入力されている回路が得意なのです。
設計する際に、
「非同期回路じゃないといけない!」
「FPGA内部はシステムクロックを多重的に使わざるを得ない!」
などの理由があれば別ですが、静的な遅延解析を効率良く行うためには、“単相同期回路”で設計するべきです。
assign DIVIDE_CLK = tmp_count[22]; always @(posedge DIVIDE_CLK or negedge RESET) ←システムクロックであるCLK以外の信号がこの順序回路のクロックとして入力されている begin if (RESET == 1'b0) COUNT <= 4'h0; else COUNT <= COUNT + 4'h1; end
上記にコメントしてありますが、システムクロック(ここでは「CLK」)以外の信号(DIVIDE_CLK)がF/Fのクロック入力端子に接続しています。これは、上記で説明した内容(“FPGAツールは単相同期回路が得意”)に反します。例えば、Verilog-HDLを単相同期回路に準じて記述するということは、
always @(posedge CLK ……
となるように記述しなければなりません。
つまり、単相同期回路ではすべてのF/Fが「CLK」(この例の場合)という信号名を持つシステムクロックで駆動されるように、できるだけ上記ポリシー(CLK信号以外は、クロック信号として扱わない)に従って記述する必要があります。こうすることで、静的な遅延解析が行いやすく、パフォーマンスの良い回路を作ることができます。これが単相同期回路で設計する必要がある最大の理由なのです。
Copyright © ITmedia, Inc. All Rights Reserved.