SFLの演習例題として、8bitの小型CPU m8を作ってみた。
XilinxのFPGAにマッピングすると、CPUだけなら、100スライス程度で実現できる。
命令数12個と、機能は最小限に絞り込んだが、アドレッシングモードに特徴を持たせて、おもしろい使い方ができる。用意したアドレッシンッグモードは↓の5つ。
1 即値 OPコードに続く1バイトをデータとして演算
2 PC プログラムカウンタをデータとして演算
3 ACC Accをデータとして演算
4 zero 値0をデータとして演算
5 メモリ OPコードに続く1バイトをアドレスとするメモリ内容をデータとして演算
命令は、OPコードの上位4ビットで区分けして、↓の12個となる。
0:ADD add
1:SUB subtract
2:AND logical and
3:OR logical or
4:XOR logical xor
5:NOT not
6:SLT set less than
7:MOV move to acc
8:BEQ branch when acc==0
9:JMP jump
A:LOD load from memory
B:STO store to memory
サブルーチン呼び出し命令はないれど、アドレッシングモードを組み合わせると、メモリ上に作ったスタックエリアにPCを格納した上で、サブルーチン呼び出しができる。(もちろん、スタックでなく、固定番地に戻りアドレスを格納するならもっと簡単な手順にできる)
lod #stack
sub #1
sto #stack ; スタックポインタ -1
mov pc
add #4
sto $stack
jmp foo ; fooを呼び出し
サブルーチンリターンは、
lod $stack
jmp acc
でいい。(もちろん、これで戻ると、戻り先で、スタックの調整が必要なのは、言うまでもない)
こんな小さな、CPUでサブルーチンができても仕方ないだろうという突っ込みどころ満載であるが、それはそれとして… :-)
XilinxのFPGAにマッピングすると、CPUだけなら、100スライス程度で実現できる。
命令数12個と、機能は最小限に絞り込んだが、アドレッシングモードに特徴を持たせて、おもしろい使い方ができる。用意したアドレッシンッグモードは↓の5つ。
1 即値 OPコードに続く1バイトをデータとして演算
2 PC プログラムカウンタをデータとして演算
3 ACC Accをデータとして演算
4 zero 値0をデータとして演算
5 メモリ OPコードに続く1バイトをアドレスとするメモリ内容をデータとして演算
命令は、OPコードの上位4ビットで区分けして、↓の12個となる。
0:ADD add
1:SUB subtract
2:AND logical and
3:OR logical or
4:XOR logical xor
5:NOT not
6:SLT set less than
7:MOV move to acc
8:BEQ branch when acc==0
9:JMP jump
A:LOD load from memory
B:STO store to memory
サブルーチン呼び出し命令はないれど、アドレッシングモードを組み合わせると、メモリ上に作ったスタックエリアにPCを格納した上で、サブルーチン呼び出しができる。(もちろん、スタックでなく、固定番地に戻りアドレスを格納するならもっと簡単な手順にできる)
lod #stack
sub #1
sto #stack ; スタックポインタ -1
mov pc
add #4
sto $stack
jmp foo ; fooを呼び出し
サブルーチンリターンは、
lod $stack
jmp acc
でいい。(もちろん、これで戻ると、戻り先で、スタックの調整が必要なのは、言うまでもない)
こんな小さな、CPUでサブルーチンができても仕方ないだろうという突っ込みどころ満載であるが、それはそれとして… :-)