FPGA/Zynqで作るカスタム・コンピュータ・チップ
プロローグ:RISC-VもマルチコアCPUも,I/OやI/Fの増設も思いのままに
- 著者・講師:森岡 澄夫/Sumio Morioka
- 企画編集・主催:ZEPエンジニアリング株式会社
- 関連製品:[VOD/KIT]Xilinx製FPGAで始めるHDL回路設計入門
- 関連製品:[VOD/KIT]一緒に動かそう!Lチカから始めるFPGA開発【基礎編&実践編】
- 関連製品:[VOD/KIT] 実習キットで一緒に作る!オープンソースCPU RISC-V入門
- 関連製品:[VOD/KIT]ARM Cortex-A9&FPGA内蔵SoC Zynqで初体験!オリジナル・プロセッサ開発入門
- 関連記事:オール・トランジスタ4ビットCPUの製作とFPGA開発 [Vol.3 Lチカで学ぶFPGA開発体験]
自由に構成をカスタマイズしたマイコンを作れる
マイコン・チップを使っていて,ペリフェラル(各種インターフェースやタイマなどの周辺回路)やGPIOピンが不足して困った経験はないでしょうか? マイコン・チップの選定でも,これらは主要な判断基準になります.
しかし,FPGAを使うことでそのような悩みからは解放され,オリジナルのマイコン・チップ(正確な表記としてはSoC)を作ることができます.FPGAの容量が許す限り,欲しいペリフェラル回路を何個でも用意することができます.また,FPGAは数十~数百本と多くのI/Oピンをもつことが普通なので,GPIO不足の問題もまず起きません.
コンピュータ・システムをワンチップ化する
オリジナル・マイコンの製作で行うのは,プロセッサ,メモリ,ペリフェラル,バスなどの部品をFPGA内部で動作する回路として実装し,統合することです(図1).
FPGAを使うということで,製作には非常に高度なディジタル回路設計技術が必要だろうと想像する方がいるかもしれませんが,そうでもありません.むしろ必要なのは,コンピュータ・システムの基本構成を理解していることで,それを身に付ければ挑戦できます.
基本部品と出来合いIPを利用できる
ここまでマイコン・チップの内部回路をFPGA上に作るという主旨で説明をしてきましたが,実際には大きな自由度があり,「何でも好きなようにやってよい」世界です.
まずプロセッサについては,複数搭載してマルチコアにしてもかまいませんし,異なる種類のものを混在させたヘテロジニアス構成にすることもできます.プロセッサの回路はHDLで自作しないといけないわけではありません.図2のとおり,ARMやRISC-Vなどマイコン・チップでも使われているCPUをあらかじめ搭載しているFPGAがあります(FPGA SoCとも呼ばれる).その代表格がAMD社のZynqシリーズです.
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個だけとは限らず,むしろ複数個がバスにつながっている場合が普通です.ペリフェラルは通常はスレーブですが,マスタとして作ることもできます.
また,オンチップ・バスはチップ(FPGA)内に1本だけと決まっているわけではありません.プロセッサやIPコアのデータ伝送の状況に合わせ,複数本張る場合もしばしばあります.LSIの場合には複数本あるほうが普通です.
自作のペリフェラルを作って制御する方法
独自のインターフェースや演算機能をもつIPコア(ペリフェラル)を作って搭載できることも,このようなオリジナル・マイコンの大きな魅力です.プロセッサとの組み合わせについてはいろいろな方法が存在しますが,もっとも利用頻度が高いのが,自作回路をオンチップ・バスにスレーブとして接続する方法です.
プロセッサから自作回路に対し,処理を開始させたり,処理のための入出力データを交換したり,といった動作制御を行う必要があります.このためにメモリ・マップトI/Oという有名な手法を使います(図4).プロセッサからある特定のアドレスを読み書きすると,自作回路にコマンドやデータが伝わるようにするのです.一般的なマイコン・チップのデータシートを見ると,各ペリフェラルの制御レジスタの説明が詳しく書かれていますが,それと同じものです.
自作回路をオンチップ・バスにつなげるために,ラッパと呼ばれる回路を用意します(図5).ラッパは,オンチップ・バスから来るデータの読み書きのリクエストを処理し,自作回路へ中継します.このラッパが,上記のメモリ・マップトI/Oの機能を実現しています.〈森岡 澄夫〉