FPGAのコンフィグレーション

FPGAのコンフィグレーション

 FPGAは主にメモリで形成されています。しかも、FPGAの場合にはメモリは揮発性メモリです。つまり、電源を切ると忘れてしまうタイプです。

 FPGAをプリント基板に実装したような電子回路基板を設計するにあたり、FPGAの電源投入時からの作法を知っておく必要があります。FPGAは揮発性メモリから形成されているので、何らかの不揮発性メモリを外部に用意する必要があります。

 ちょうど、パソコンと似たようなものです。パソコンはハードウェアがあって、そこにWindowsやMacintoshのOSが搭載されています。そのOSというのは、ハードディスク(またはSSD)に保存されていて、電源を入れると「立ち上げ」という作法が始まりますね。

 この立ち上げ中は、パソコンが使えなくて、イライラしたことがある人はいませんか? FPGAも全く同じで、電源投入から立ち上げ中は使えません。その時間は数msec~数百msecという時間なので、Windowsが立ち上がる時間よりは短くて、イライラが少ないのですが、それでも使えない時間があることは事実です。

 また、パソコンの場合にはWindowsなどのOSを「立ち上げる」といいますが、FPGAの場合には「コンフィグする」といいます。コンフィグレーションを現場風に言う言葉です。

 パソコンの場合には、ハードディスクの中にWindowsがインストールされてますが、FPGAの場合には、ハードディスクとは限りません。いろいろな方法があります。

  • CPUでFPGAにコンフィグする
  • 汎用の外部メモリでコンフィグする
  • 専用の外部メモリでコンフィグする
  • ライターでコンフィグする
  • JTAGでコンフィグする

 上記の他にも方法があるかも知れません。FPGAのメーカーによってコンフィグの方法はそれほど変わりませんが、呼び方が違ったり、メモリが違ったりしますので、使用するFPGAのデーターシートで確認してください。

 「データーシートで確認してください」と書くと簡単に確認できそうですが、コンフィグの回路を設計するのは実は案外面倒な作業です。なので、会社によっては、先輩から代々引き継がれた秘伝のコンフィグ回路。なんていうのがあったりします。

 ここでは、コンフィグ回路の設計の方法と注意点を記載しようと思います。

  上の図のようにFPGAに外部メモリ(上図の場合、シリアルFlashメモリ)から、コンフィグするようなイメージになります。

 まず、一番最初に行うのは、データーシートで確認するのですが、先に述べたように意外に面倒です。なので、取引している業者に「デバイスのコンフィグ回路例をください」と、質問してしまいます。それが一番簡単です。その時に、おそらく日本語のコンフィグ用データーシートもくれるでしょう。

 IntelやXilinxのFPGAであれば、代理店が必ずコンフィグ回路のノウハウを記した独自の資料を持っていて、それを公開してくれるはずです。

 これらの作業はFPGAを搭載した回路の回路図を描く前に行います。なぜなら、コンフィグ回路というのはFPGAのピンを占有するからです。時分割でコンフィグをした後に、IOピンに変更する。という回路も設計できるのですが、秘伝の回路でもない限りやめた方が良いでしょう。コンフィグ回路が動かない時には、FPGAが動かないという事になり。設計した回路が全く動かない事になります。

 もう一つ、先の図のように外部にメモリを搭載してコンフィグするのが一般的ですが、大切なのはJTAG回路です。FPGAをコンフィグする外部メモリに書き込む方法が必要だからです。これは一般的にはJTAG回路で行います。

 つまり、FPGA+外部メモリ+JTAG この3点をセットで設計します。

 以下に示すのはXilinx社の7シリーズのコンフィグ資料からの抜粋です。

 一般的にはスレーブモードとマスターモードの2つの種類があって、さらに上図のようにシリアルだったりパラレルだったりの方法があります。

 スレーブモードというのはFPGAに対して外部からクロックを入れて、それに同期したデータでコンフィグする方法で、古いFPGAはこのタイプが多いと思います。外部にCPUがあって、CPU経由でコンフィグするような場合はスレーブモードを使います。

 マスターモードは逆にFPGAからクロックを出すので、それに同期したデータをメモリから出力します。

 最近のFPGAで多いコンフィグの例として、Xilinx社の7シリーズのマスターシリアルモードでのコンフィグ回路例をメーカー資料から抜粋したのが下記の回路図です。

 FPGAの左にあるコネクタがJTAGです。FPGAの右側にはシリアルのFlashROMがあります。

 コンフィグ回路を一発で動作させるコツは、これらの回路をコンパクトにプリント基板に設計する事です。できる限りFPGAとJTAGコネクタやFlashROMを近づけて配置します。

 さらに、プルアップ抵抗は指定の値にします。案外小さい値の抵抗だったりしますが、この値を守ってください。

 上図の回路において、コンフィグモードを指定するM0ピン~M2ピンは固定されていますが、デバッグを行うのであれば、JTAGモードでFPGAを立ち上げられるようにモード切替ができるようにしておくと便利です。

 この回路図だけでは、完璧なプリント基板を設計はできないと思います。メーカーが用意している評価基板を一度は見てください。その回路図は必ず公開されていますので、回路図と基板のレイアウトを見比べておくとかなりの確率で一発動作のコンフィグ回路になります。

 もし、設計したコンフィグ回路が動かなかった場合、以下の点を確認します。

  • FPGAへの電源投入順序は合っているか
  • コンフィグスタートの信号(INIT_BやPROGRAM_B)のタイミング
  • DONE信号の動作タイミング
  • DONE信号のプルアップ抵抗
  • SPIのクロックとデータ波形、タイミング

 これらを確認していると、何らかの原因を掴むことができると思います。

 さて、コンフィグレーションの回路が設計できたとして、冒頭に記載したように、電源が投入されてからしばらくの間使えない。という時間について、設計に織り込む必要があります。

 しばらく使えない間、FPGA以外の回路が搭載されているプリント基板では、おそらくFPGAからの指示待ちになっていると思います。その指示待ちの信号が不定になります。Hiか、Lowかわからない状態です。このようになることを分かってFPGAの周辺回路の設計をする必要があります。

 具体的には、FPGAの入力が不定でもそれほど問題ではありません。もともとFPGAが動いていないので。反対に出力ピンが不定になります。そもそも、FPGAのピンが入力か出力か。という設定すら出来ていないことを理解しておいてください。

 多くのFPGAではコンフィグレーション中はピン設定がハイインピーダンス状態になっています。したがって、HiかLowで立ち上げておく必要がある回路の場合には、FPGAの外部にプルアップやプルダウンの抵抗を付けておく必要があります。この抵抗を忘れがちなので注意してください。