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でサブルーチンができても仕方ないだろうという突っ込みどころ満載であるが、それはそれとして… 🙂
m8動きました
「m8」の続きになります。
昨日はいつものごとく色々とまぬけなことをしていたみたいで、すんなりとは動きませんでした。一番の間違いは、RAMを非同期式ではなく、同期式にしていたことです。ザイリンクスのブロックRAMは同期式なので、てっきり同期式だとばかり思ってい…
コメント by Sim's blog — 2009年3月4日 @ 7:50 PM
Unknown
こんにちは
シミュレータで動くところまで、できたので動作報告です。ソースを読んで勉強させていただきます。
コメント by Sim — 2009年3月4日 @ 7:54 PM
Unknown
Simさん、コメントありがとうございます。
ブログを拝見させていただきました。アクティブに活動されていますね。
実は、m8.sflだけではなく、board.sflも合せて合成すると、同期ブロックRAMを、逆相クロックで使うXilinx用のFPGA実装ファイルができあがります。
m8.vとboard.vを両方ともISEに渡してください。
boardモジュールがRAMやIOポートを含むトップモジュールになります。
サンプルアーカイブには、書いていませんが、bmmファイルを書けば、data2memを使って、ブロックRAMの初期化が出きるので、お試しください。
このところ、出張続きで、試してませんが、たぶん↓のような感じでいけると思います。bmmは階層の記述が微妙なので、試してみないとコンパイルが通るか心配ですが…
ADDRESS_SPACE ram RAMB16 [0x00:0xff]
BUS_BLOCK
ram/Mram_ram [7:0];
END_BUS_BLOCK;
END_ADDRESS_SPACE;
bmmに与えるmemファイルは、16進のreadmemh形式(m8asmの出力そのもの)でOKです。
今後ともよろしくお願いします。
コメント by 組み込まれたエンジニア — 2009年3月6日 @ 8:39 AM
Unknown
お返事ありがとうございます。
逆相でブロックRAMを動かすって、すごい技ですね。思わず感動しちゃいました。
SFLは初めてですが、ステートマシンを書くのが楽そうですね。少なくともステートにいちいち名前をつけなくていいのが便利そうです。
こちらこそ、よろしくお願いします。
コメント by Sim — 2009年3月7日 @ 12:05 AM
Unknown
Simさん、逆相クロックは超高速システムでは遅延が収束しない可能性があり、禁じ手なんですが、それほどスピードが要求されないところでは、便利なので、ぜひお使いください。
SFLで書くと、動作ごとに書下せるので、設計の見通しがよくなると思い、私は自分で書く論理は、ほとんどSFLなのですよ。
sfl2vlは1000万ゲートを越える大規模なシステムでも破綻なく使えていますので、よかったら使ってみてください。
コメント by 組み込まれたエンジニア — 2009年3月7日 @ 9:01 AM