編集履歴一覧に戻る
spinlockのアイコン画像

spinlock が 2021年01月17日14時46分12秒 に編集

初版

タイトルの変更

+

FPGAに複数CPUを搭載するのに向いたオープンソースのCPU

タグの変更

+

FPGA

+

verilog

+

ICF3-Z

+

電子工作

メイン画像の変更

メイン画像が設定されました

本文の変更

+

## はじめに 1つのCPUで複数の仕事をさせるより、仕事の数だけCPUを用意したほうが簡単で高信頼なシステムが作れる。そう思える人にとって、とても役に立つオープンソースのCPUの紹介です。XilinxのFPGAに実装できるverilogを[githubに公開](https://github.com/icf3/zevios)しています。 オープンソースのCPUといえばRISC-Vが有名です。実装面積の小さいRISC-Vもありますが、ここで紹介する[ICF3-Z](https://icf3z.idletime.tokyo/)は、そういった小さいRISC-Vの5分の一の面積で、除算の性能が5倍になることもある、とても小さくて、とても性能のいいCPUです。 まだ開発環境が整備されていないので整備するところからやらないといけないこともありますが、そのおかげで製品に組み込むには使いやすいと思うので是非使ってみてください。 ## ちょっといい方法 紹介だけだと、さびしいかと思ったので、ちょっといい方法を書くことにします。XilinxのFPGAに実装する手順がICF3-Zのサイトに書かれています。プログラムはBRAMに格納するようになっています。BRAMはディュアルポートメモリなので、2つのCPUで共有できます。複数のCPUをFPGAに実装する場合、BRAMを節約することができます。 ## Lチカ動画 この動画で使っているFPGAの基板はDIGILENTのArty([秋月電子通商](https://akizukidenshi.com/catalog/g/gM-14484/))([マルツ](https://www.marutsu.co.jp/pc/i/595143/))です。ArtyにICF3-Zを実装する方法はICF3-Zの公式サイトに[手順](https://icf3z.idletime.tokyo/download.html#arty)があります。verilogファイルは汎用的に作られているので、いろいろなFPGA、ASICに実装できると思います。 @[youtube](https://youtu.be/x6vHL2-Gp5c) ## オープンソースCPU ICF3-Z 8bit CPU ICF3-Zのオリジナルのコア、[Zevios](https://icf3z.idletime.tokyo/download.html)の除算性能について解説します。Zeviosは2020年1月15日に緩いオープンソースライセンスであるApache License 2.0で公開されました。FPGAに実装できるverilogファイルがあるので、いろいろ性能を測定することができます。 ## Zeviosの除算器について 正しくは除算器というものはなくて8bitの加算器を効率的に動作させることで1サイクルに1bitの商を演算するアーキテクチャです。除算器の性能としては低いのですが、マイコン向けのCPUでは除算器がないものも多く、小さい面積なのに高速に除算ができるものになっています。(除算器としての面積がほとんどない) その除算向けのアーキテクチャを使って8bitより大きい除算をソフトウェアで実装できます。一般の8bit CPUによる実装よりも高速に演算できます。 ## 16bit÷8bitの除算 ICF3-Zでは加算器を使って効率的に演算できるようになっています。17サイクルで演算ができます。 ## 24bit÷8bitの除算 ICF3-Zでは加算器を使って効率的に演算できるようになっています。17サイクルで演算ができます。 ただし被除数の最上位8bitが除数8bitよりも小さい場合に限ります。 ## 32bit÷8bitの除算 16bit÷8bitの除算方法を応用したサンプルコードによる性能は50サイクルです。サンプルコードはgithubで公開されています。 sim2フォルダのpmem.asmzが32bit÷8bitのコードです。 ## 32bit÷16bitの除算 ICF3-Zのアーキテクチャを駆使したサンプルコードによる性能は約350サイクルです。サンプルコードはgithubで公開されています。 sim1フォルダのpmem.asmzが32bit÷16bitのコードです。 ソフトウェアの実装によって性能は違ってくると思われます。もっと高速な方法もあるかもしれません。 除数が8bit × 8bitの因数に分解できるものなら32bit ÷ 8bitを2回演算したほうが高速です。 32bit÷15bitを230サイクルで演算するコードも作ったのですが、まだ十分に検証できていないため、今回は見送りました。 ## おわりに ICF3-Z Zeviosは、とても少ないトランジスタ数(面積)で実装できるのに高速です。16bit÷8bit、24bit÷8bitの除算が有効につかえるアプリでは低消費電力が期待できるように思われます。 ## 参考サイト [オープンソースのCPUの除算性能 RISC-V vs ICF3-Z](https://qiita.com/izuna/items/da289b803bbadc8de4d9) [8bit CPU AVRとICF3-Zとの違い](https://crieit.net/posts/8bit-CPU-AVR-ICF3-Z) [8bit CPU ATmega328の除算性能を測定してみた](https://crieit.net/posts/8bit-CPU-ATmega328) [仮想マシンの加速支援機構つきの新型8bit CPU](https://icf.hatenablog.com/entry/2019/04/16/181417)