FPGA/Zynqで作るカスタム・コンピュータ・チップ

プロローグ:RISC-VもマルチコアCPUも,I/OやI/Fの増設も思いのままに

  • 著者・講師:森岡 澄夫/Sumio Morioka
  • 企画編集・主催:ZEPエンジニアリング株式会社

自由に構成をカスタマイズしたマイコンを作れる

マイコン・チップを使っていて,ペリフェラル(各種インターフェースやタイマなどの周辺回路)やGPIOピンが不足して困った経験はないでしょうか? マイコン・チップの選定でも,これらは主要な判断基準になります.

しかし,FPGAを使うことでそのような悩みからは解放され,オリジナルのマイコン・チップ(正確な表記としてはSoC)を作ることができます.FPGAの容量が許す限り,欲しいペリフェラル回路を何個でも用意することができます.また,FPGAは数十~数百本と多くのI/Oピンをもつことが普通なので,GPIO不足の問題もまず起きません.

コンピュータ・システムをワンチップ化する

オリジナル・マイコンの製作で行うのは,プロセッサ,メモリ,ペリフェラル,バスなどの部品をFPGA内部で動作する回路として実装し,統合することです(図1).

図1 プロセッサ,メモリ,ペリフェラルをバスで接続する

FPGAを使うということで,製作には非常に高度なディジタル回路設計技術が必要だろうと想像する方がいるかもしれませんが,そうでもありません.むしろ必要なのは,コンピュータ・システムの基本構成を理解していることで,それを身に付ければ挑戦できます.

基本部品と出来合いIPを利用できる

ここまでマイコン・チップの内部回路をFPGA上に作るという主旨で説明をしてきましたが,実際には大きな自由度があり,「何でも好きなようにやってよい」世界です.

まずプロセッサについては,複数搭載してマルチコアにしてもかまいませんし,異なる種類のものを混在させたヘテロジニアス構成にすることもできます.プロセッサの回路はHDLで自作しないといけないわけではありません.図2のとおり,ARMやRISC-Vなどマイコン・チップでも使われているCPUをあらかじめ搭載しているFPGAがあります(FPGA SoCとも呼ばれる).その代表格がAMD社のZynqシリーズです.

図2 FPGA内CPUを使って自分用のマイコンを作れる

FPGAのプログラマブル・ロジック(LUT)上にプロセッサを作る場合には,IPコア,つまりブラックボックスの既成部品を使います.有償で販売されている物も,フリーウェア的に無償公開されている物もあります.もちろんその気になれば,自分でHDLコードを書いてオリジナルCPUを搭載することもできます(ソフトの開発がネックにはなりますが).

UART/SPI/I$^2$CといったペリフェラルI/F回路についても,同様にIPコアを使います.好きなだけの個数を使えますし,独自インターフェース回路をHDLで自作することもできます.また,ペリフェラルはインターフェースだけではありません.いろいろなデータ処理や演算処理を高速実行させる回路(アクセラレータなどと呼ばれる)をIPコアとして接続できます.

オンチップ・バスを介して部品をつなぐ

これらの各種部品はバスで結合します.チップ内で用いるバスを,とくにオンチップ・バスと呼びます(図1).いくつかの種類が存在しますが,AXIバスと呼ばれるものが,FPGAでもLSIでもデファクト・スタンダードです.インターフェース用のI$^2$Cバスなどと同じく,オンチップ・バスに接続する部品にもマスタ(能動的にバス・アクセスを起こす側)とスレーブ(受け身でアクセスを待つ側)の区別があります(図3).マスタの典型がCPUですが,マスタは1個だけとは限らず,むしろ複数個がバスにつながっている場合が普通です.ペリフェラルは通常はスレーブですが,マスタとして作ることもできます.

図3 バス・マスタとバス・スレーブの違い

また,オンチップ・バスはチップ(FPGA)内に1本だけと決まっているわけではありません.プロセッサやIPコアのデータ伝送の状況に合わせ,複数本張る場合もしばしばあります.LSIの場合には複数本あるほうが普通です.

自作のペリフェラルを作って制御する方法

独自のインターフェースや演算機能をもつIPコア(ペリフェラル)を作って搭載できることも,このようなオリジナル・マイコンの大きな魅力です.プロセッサとの組み合わせについてはいろいろな方法が存在しますが,もっとも利用頻度が高いのが,自作回路をオンチップ・バスにスレーブとして接続する方法です.

プロセッサから自作回路に対し,処理を開始させたり,処理のための入出力データを交換したり,といった動作制御を行う必要があります.このためにメモリ・マップトI/Oという有名な手法を使います(図4).プロセッサからある特定のアドレスを読み書きすると,自作回路にコマンドやデータが伝わるようにするのです.一般的なマイコン・チップのデータシートを見ると,各ペリフェラルの制御レジスタの説明が詳しく書かれていますが,それと同じものです.

図4 メモリ・マップトI/OによるCPUとの接続
自作回路をオンチップ・バスにつなげるために,ラッパと呼ばれる回路を用意します(図5).ラッパは,オンチップ・バスから来るデータの読み書きのリクエストを処理し,自作回路へ中継します.このラッパが,上記のメモリ・マップトI/Oの機能を実現しています.〈森岡 澄夫
図5 自作回路に追加するラッパ