動かしてわかるCPUの作り方10講

加減算器をさらに修正する

add命令、sub命令の単独テスト -のつづき あまりに不格好なので、jnc命令用にVHDLを変更したのと同じようにMSBに0をパディングして最初から17ビットで計算することにする。 加減算回路: 2の補数回路: 普通にこれでもよい:

exec_jnc_jmp_regコンポーネントをシンボルで書き換える

最後に残っていたexecコンポーネントをシンボル化した。これでCPU全体がシンボル化できた。命令ごとに作ったシンボルは結局大半無駄になった。

add命令、sub命令の単独テスト

subtractorのときは、1とxorとでB入力を反転するとともにキャリーインに1を入力して2の補数化する。 あやしいコンポーネントはこれで全部修正できた。 修正前: add命令、sub命令をシンボルで書き換える - 修正後: 不格好だがひとまずこうしておく。

sl命令、sr命令の単独テスト

これも問題ない。

信号名、インデックスをつけかえる

動かない原因はldlとldhとにあったか。 修正前: ldl命令をシンボルで書き換える - ldh命令をシンボルで書き換える - 修正後: バッファーを挟まなくてもこれでいけた。 ldl: ldh: これでldlとldhは動いた。

PCの単独テスト

PCをシンボルで書き換える - 全部シンボル化したexec_jnc_jmp_reg_symbolコンポーネントが動かない。あやしいところから個別にテストする。まずはPCから。 0から255までカウントアップすること。 !リセット信号で同期リセットされること。 OP_CODEに応じてど…

jnc命令をシンボルで書き換える

st命令をシンボルで書き換える

ld命令をシンボルで書き換える

jmp命令をシンボルで書き換える

je命令をシンボルで書き換える

cmp命令をシンボルで書き換える

ldh命令をシンボルで書き換える

ldl命令をシンボルで書き換える

PCをシンボルで書き換える

テキストと同じく同期クリアにした。sclr、sloadのsはsynchronous。

jmp_reg命令をシンボルで書き換える

sl命令、sr命令をシンボルで書き換える

or命令をシンボルで書き換える

and命令をシンボルで書き換える

add命令、sub命令をシンボルで書き換える

mov命令をシンボルで書き換える

RAMの読み出し・書き込み部mega_ramをシンボルで書き換える

ram_1portは、clk_exではなくソースクロックで更新しているので、値は書き込みなり読み出しなりが常に実行されていて、その値はram_1portからダダ漏れしている。 RAMアドレスが64、write enableがHiであるときだけ、execモジュールから渡された値をclk_exの…

レジスタの書き込み部reg_wbをシンボルで書き換える

まず16ビットレジスタを1個作っておく。write enableとselectとがHiのときにクロックのタイミングでレジスタの出力を更新する。 それを8個つなぐ。どれかレジスタを1つだけクロックのタイミングで書き換える。

レジスタの読み出し部reg_dcをシンボルで書き換える

74シリーズはあきらめてmegafunctionsを使うことにする。クロックのタイミングで16ビット×8本のうち1本を選んで更新する。

4相クロックジェネレーターclk_genをシンボルで書き換える

テキストどおりVHDLで記述していた回路をシンボルで書き換える。これは単純なので問題ない。

レジスタに入っている16ビットデータを5桁の十進数値としてキャラクターLCDに表示する

テキストは、VHDLで組んだ二進 → 十進変換回路でOUTポートのデータを十進数に変換し、それを5桁の7セグLEDで表示している(pp.221ff.)。 ここでは、せっかくCPUを作ったのでソフトウェアで解決してみる。たとえば0d54321は次の手順で各桁を取り出す。詳細不明…

レジスタに入っている16ビットデータを4桁HEX値としてキャラクターLCDに表示する

############################ # アセンブラ(のようなもの) # ############################ import math def constrain(val, _max, _min): return int(min(max(val, _min), _max)) def generate_mif(file_name, width, depth, rom): f = open(file_name, "w…

キャラクターLCDに何かを表示する

3.3 Vで直接動かせるSC1602BBWB-XA-LB-Gを使う。PIC16F1789/1939 & MPUトレーナー カテゴリーの記事一覧 -の評価基板に載っていたのを外した。8ビットモードで動かす。 下のように接続する。 CPUのOUT[7:0] → LCDのDB[7:0] CPUのOUT[8] → LCDのRS CPUのOUT[9…

sra命令(算術右シフト)を廃止してjmp_reg命令(ジャンプ先のアドレスをレジスタで指定)を追加する

sra命令を廃止する。代わりに、即値ではなくレジスタでジャンプ先が指定できる命令を追加する。exec_jnc.vhdのsra命令の部分を下のように書き換える。 --when "0111" => -- SRA -- REG_IN_TEMP <= '0' & REG_A(15) & REG_A(15 downto 1); --REG_WEN <= '1'; …

追加したjnc命令でLチカ

今度は、hlt命令を廃止してjnc (jump if no carry)命令を追加する -で追加したjnc命令を使ってLチカをしてみる。ビジーループ自体は2命令で済む。もっと遅くしたい場合はnop命令を挟む。nopも4クロックを要する。 F_CPU = 10E3 DELAY = 0.5 # sec LOOPS = in…