spinlockのアイコン画像

FPGAに実装できる超軽量な自作CPUをオープンソースで公開

spinlock 2021年02月27日に作成  (2021年02月27日に更新)
FPGAに実装できる超軽量な自作CPUをオープンソースで公開

はじめに

超軽量な自作CPU WZetaを本日、制限の緩いライセンスであるApache License 2.0で公開しました。
超軽量CPU 「WZeta」
これまで自作CPUを公開するのは風当りが厳しかったのですが、東工大のIoT向けCPU「SubRISC+」のプレスリリース(2021年2月19日)に勇気づけられ公開に踏み切りました。どちらも超軽量CPUですが関係はありません。

WZetaの特長

命令セットに特長があります。命令コードは32bitですがプログラムを8bit単位に送信して CPUで実行することでCPUの面積や配線リソース、メモリリソース(1ポートメモリでOK)を省力化します。

1バイト目、Aレジスタに7bitの即値を代入するかレジスタ(0-127)の値を代入

2バイト目、Bレジスタに7bitの即値を代入するかレジスタ(0-127)の値を代入

3バイト目、加減算、論理演算、比較、分岐命令のコード

4バイト目、演算結果をレジスタ(0-127)に代入。もしくは分岐命令後の空白

命令コードを分割して送信できること以外は、ごく一般的なCPUの命令セットと同じで、数も少ない。

verilogファイルで公開

ダウンロードのページからverilogで実装されたWZetaのファイルがダウンロードできます。サンプルコードにAES暗号 256bitのコードがあります。AES暗号は通信の暗号化だけでなく認証としても使うことができます。 このためデータの送受信に安全性が必要な場合、便利に使うことができます。

動作確認をしたFPGAの基板はDIGILENTのArty(秋月電子通商)(マルツ)です。

やや不親切ですがフォルダwzblock\fpga\arty にArtyに実装できるファイルがあります。超軽量CPUなのでソースコードも、非常に小さく、見ればわかる程度なので読んでやってください。

即値代入命令

アセンブラにLOAD命令があります。CPUのハードにLOAD命令があるわけではなくてアセンブラが加算器を使ってLOAD命令にしています。レジスタR0に255の値を代入するには
LOAD R0 , 255
これは
A=127
B=127
R0 =A+B+1
というコードを生成します。つまり0~255(8bit)の即値代入が可能です。

シフト命令

シフト命令は、ありませんがレジスタR0を1bit左シフトするには
A=R0
B=R0
R0=A+B

n bitの左シフトは1bitの左シフトを繰り返します。7bitの右シフトは2命令で作れます。

A=R0
B=R0
R0=A+B

A=0
B=0
R0=CF

n bitの右シフトも同様にすれば、作れると思います。

プログラミング テクニック

WZetaはレジスタ間接分岐が可能です。レジスタで指定できるアドレスは下位7bitで、それより上位は即値で指定します。
WZetaはRETURN&LOAD命令も可能なのでプログラムコードがから1バイトづつデータを取り出すことができます。

R8 : 間接CALL用アドレス

LOOP:
CALL xx,R8
    (R0の処理)
    INC R8
    COMPARE R8 , m
    JUMPZF0 LOOP
    (次の処理)
DATA:
    RETURN&LOAD R0, n0
    RETURN&LOAD R0, n1
    RETURN&LOAD R0, n2
    RETURN&LOAD R0, n3
    RETURN&LOAD R0, n4

どういったことに向いているの?

データ通信や制御用かも。例えば自宅のパソコンから庭に水を撒く制御機器を作った場合、制御信号に認証コードがない場合、悪人が不正アクセスで勝手に水を撒いてしまうことがありますが、AES暗号による認証があれば簡単には不正アクセスできないようなことができます。

回路面積

東工大のSubRISC+のプレスリリースにはチューリッヒ工科大学のRISC-V、Micro-riscyとの比較があります。SubRISC+の回路面積はMicro-riscyの56%です。WZetaはXilinxのFPGA、Artix-7での実装面積しかないのでMicro-riscyがArtix-7でどのくらいの面積になるのか、調べてみました。lowRISCのibexというRISC-Vコアがあります。これは元々、Zero-riscyだったようです。そしてMicro-riscyはZero-riscyの1.6倍小さいということらしいです。ibexはArtix-7で約2500LUTなのでMicro-riscyは1562LUT程度になりそうです。WZetaは67 LUTなのでWZetaはMicro-riscyの4.3%という見積です。
Micro-riscyとの比較から、WZetaはSubRISC+の7.7%程度の回路面積という見積になります。

ライセンスについて

Apache License 2.0ですが、「日本の税金を使ったプロジェクトでは利用しないでください。」という、お願い付きです。よろしくお願いいたします。
詳しくはライセンスのページ

参考

もう一つ自作CPUを作っています。
ICF3-Z

spinlockのアイコン画像
ICF3-Zの開発者。ICF3-Zは制限の緩いライセンスの オープンソースのCPUです。少ないトランジスタ数の割には除算が高速で制御に向いているプロセッサです。小さいFPGAにも実装することができたり、FPGAに複数のソフトコアなCPU、ICF3-Zを搭載するケースで役に立ちます。税金を使わないことを方針としているCPUです。詳しくはライセンスのページを見てください。 https://icf3z.idletime.tokyo/
spinlock さんが 2021/02/27 に 編集 をしました。 (メッセージ: 初版)
spinlock さんが 2021/02/27 に 編集 をしました。
spinlock さんが 2021/02/27 に 編集 をしました。
spinlock さんが 2021/02/27 に 編集 をしました。
Opening
spinlockのアイコン画像 spinlock 2021/03/01

マニュアルにNOT命令を書き忘れてました。
NOT Rz , Ry ( Rz ← not Ry )
ハードウェアでは次のように演算します。アセンブラがバイナリを生成するので知らなくても、大丈夫ですが、知っておいたほうが、便利かもしれません。
A=0
B=Ry
Rz = A + ( not B )

0 件の返信が折りたたまれています
ログインしてコメントを投稿する