四畳半テクノポリス

地方国立大学のクズ大学生の吐き溜めです。やる気をください

Verilogによるスタックマシンの作成

スタックマシン

 スタックマシンとはデータをスタックと呼ばれるデータ構造を用いた計算機である。スタックと呼ばれるLastInFirstOutのデータ構造Push(データの挿入)、Pop(データの取り出し)、演算、という3種類の操作を行うことで計算を行う。このあたりに関しては詳しく解説しているサイトを見てほしい。

 多くのインタプリタ型言語の処理系で用いられる中間言語はスタックマシンであることが多い、しかし現在流通しているCPUのほとんどはレジスタと呼ばれるCPU内部の商用呂のランダムアクセスメモリを用いたものである。そこでverilogを用いてスタックマシンを作成してみようという考えに至った。HDLを用いたFPGA上で動作するスタックマシンは別に珍しいものではなく前例も多く存在するが、今回の目的はエクササイズであり、作成するスタックマシンは実用性では無く、なるべくシンプルな命令体系にすることに重点を置く。

今回作成するCPU

今回作成するCPUは命令長と扱える数値の大きさから、16bitCPUとした。命令も16bit、扱える数も16bitである。マルチサイクルプロセッサで、1命令の実行に4クロックの時間を要する。

 命令体系

純粋なスタックマシンは基本的にPush,Pop、演算という操作で計算を行うが、それだけではプログラムの制御ができないので、制御命令も必要となる、次の表に示すのが今回設計するCPUの命令セットである。

 

命令 バイナリ 機能
ADD 0b00000100_00000000 スタックから2つPopし加算結果をPushする
SUB 0b00001000_00000000 スタックから2つPopし減算結果をPushする
MUL 0b00001100_00000000 スタックから2つPopし乗算結果をPushする
DIV 0b00010000_00000000 スタックから2つPopし除算結果をPushする
PUSH 0b100001XX_XXXXXXXX XXで指定したアドレスの値をPushする
POP 0b100010XX_XXXXXXXX スタックから1つPopしXXで指定したアドレスに格納する
JMP 0b100011XX_XXXXXXXX XXで指定したアドレスにプログラムカウンタを飛ばす
IZ 0b000100XX_XXXXXXXX スタックのトップが0ならXXで指定したアドレスにプログラムカウンタを飛ばす
INZ 0b000100XX_XXXXXXXX スタックのトップが0でないならXXで指定したアドレスプログラムカウンタを飛ばす

 

命令は16ビットから10ビットまでにかけての命令を示すコードと、10ビット目から1ビット目にかけてのアドレスを示すフィールドで構成する。命令のフィールド先頭の16ビット目が命令のタイプを示しており、このビットが1だとPUSHなどのデータ制御命令とJMPなどのプログラム制御命令である。0だと演算命令である。

 

次回以降は今回設計した命令セットをVerilogで実装してゆく