2015-06-01から1ヶ月間の記事一覧

ハードウェアシミュレータその15

今回のネタは乗算。掛け算である。 最近の多くのCPUには乗算命令が装備されているが、乗算回路は規模が大きくなりがちなので、昔はそんなもの無いか、多くのクロックを消費して実行する形だった。さすがに足し算を延々繰り返すような実装はしないだろうが、…

ハードウェアシミュレータその14

そろそろ佳境である(うそ)。 最近、16bit固定長命令セットなどをあれこれ考えていたのだが、CPUの命令セットを作るのは難しいんだなーとしみじみ思った次第。ビットパターンには限りがあり、命令によって必要ビット数は異なり、便利な命令を1つ入れると他の…

ハードウェアシミュレータその13

ここまででそれとなく動作するCPUぽい何かはできたのだが、機能を追加していくには8bit固定長の命令では幅が足りない。幅を増やして更なる独自命令セットを作るぐらいなら既存の何かにチャレンジすればいいのではないか、など考えてみて、そもそも既存の何か…

ハードウェアシミュレータその12

コードがややこしくなってきたので整理した。 修正点 まず、いくつかのクラスをシミュレータ本体に移動。 それから、バスのビットを見ながらごちゃごちゃ条件をチェックしている部分を分離して、出力ピンを変数に格納。 ## 命令デコーダ # mov命令時にH insn…

ハードウェアシミュレータその11

いままでレジスタへの操作は値の転送と加算のみだったので、たいしたことができなかった。レジスタ間の転送と加算ができるようになれば世界は広がるだろう。 レジスタ4bitだけど。 レジスタ4個しかないけど。今回は以下の2つの命令を追加する。 mov reg, reg…

ハードウェアシミュレータその10

ついにシリーズも2桁突入である。そのわりには歩みは遅々としてなかなか進まないわけなのだが、素人がひとつずつやっているのでしょうがない。 なんでHDLとか使って既存のシミュレータソフトで動かしたりしないのか、そのほうがFPGAで実行したりできるし圧倒…

ハードウェアシミュレータその9

転送と加算ができたので、次は簡単な無条件直接ジャンプ命令を作ってみよう。 現状、ROMに入力するアドレスは4bitバイナリカウンタで生成していて、これはDフリップフロップを繋げただけのものであり、こいつに値を入力する機能が無い。これを書き換えること…

ハードウェアシミュレータその8

CPUの部品的なものができあがってきたので、ようやく命令を追加する。 とりあえず今は命令に埋め込まれた値をレジスタに書き込むMOV命令しか実装できていないので、これに近い「命令に埋め込まれた値をレジスタに加算するADD命令」を作ってみよう。

ハードウェアシミュレータその7

レジスタファイルを作ろうとして、そういえば仕様的におかしいところがあるのを放置していたなあ、と思い出した。それがあるとレジスタファイルを作るのにも困るので、まずそれを直す。

ハードウェアシミュレータその6

前回、ROMを8bit化するのに単純な手を使ったが、色んなものの幅を変えるたびにコードを書いていくのは単純にめんどくさい。 例えば複数の素子が並んでいる状態はRubyの配列に入れておけばよく、配列に入れるのであればそれは繰り返しで処理できるということ…

ハードウェアシミュレータその5

ハードウェアシミュレータの最終目標は、これを使って動作するCPUを作ることである。 前にアセンブラを作ったことはあるからそれで独自命令セットでも何かしらのコードを書くことはできそうだが、俺には高級言語のコンパイラを作る技術は無いので、いずれそ…

ハードウェアシミュレータその4

DeadBeefROMについて。 とりあえず何か作ってみるかと言うことで16進数8桁でdeadbeefと言うデータを書き込んだROMを作って、アドレスを渡すとデータが出てくる、という回路を作ってみた。のでその話。

ハードウェアシミュレータその3

いや、まあ、特に何か記事を書くほどのことがあったわけでもないが、とりあえず進捗はあったので書いて置くことにした。 現状のコードはこちら。 https://gist.github.com/mirichi/cbf87b3626389f4e3c66 以下、変更点など。 処理順変更 いままでは入力に更新…