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

フルコンパイルせずに.mifファイルのデータだけを入れ換える方法

参考: Intel:FPGA 内部 RAM を使用してデザイン中にメモリを実装しました。メモリの初期値は、メモリ初期値ファイルで行いました。その後、メモリの初期値ファイルのみを変更したのですが、この場合、再コンパイルが必要でしょうか? - 半導体事業 - マクニ…

N相クロックを作る その5 / 結局最初に戻る

「N相クロックを作る その4 / rol (左回転)演算子を使う -」の方法では、何かの拍子にノイズが乗ってmore-than-one-hot stateになってしまうとリセットしない限り二度とone-hot stateに復帰しない。結局最初の方法が一番いい。一周すれば必ずone-hot stateに…

N相クロックを作る その4 / rol (左回転)演算子を使う

N相クロックをつくる - N相クロックをつくる その2 - N相クロックを作る その3 / それに意味のないとき - というわけでローテート演算子の存在を知ったのでrol演算子を使ってN相クロックを作る。最初からこうすべきであった。 VHDL_for_Quartus_Prime/one_ho…

N相クロックを作る その3 / それに意味のないとき

74175で作った回路をそのままVHDLで記述し直してみる。ただしインターフェイスはパラメタライズし、リセット回路も追加した。結局前回と同じことをしているのであって意味がなかった。 library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all…

N相クロックをつくる その2

よく考えたら、クロックに合わせてシフトするだけでいいのであって、カウンターは必要なかった。 https://github.com/ti-nspire/VHDL_for_Quartus_Prime/blob/main/one_hot_state_counter/one_hot_state_counter.vhd library ieee; use ieee.std_logic_1164.…

N相クロックをつくる

いわゆるone hot state counterである。「VHDLで4相クロックを作る -」「74シリーズで4相クロックを作る -」「4相クロックジェネレーターclk_genをシンボルで書き換える -」のときはテキストどおりに4相に限定していたが、今度は相数を一般化する。 ここでは…

バイナリー→BCD変換函数を作る(範囲を一般化) / double dabbleアルゴリズム / VHDL

VHDL_for_Quartus_Prime/example_slv_to_bcd at main · ti-nspire/VHDL_for_Quartus_Prime · GitHub 「バイナリー→BCD変換函数を作る / double dabbleアルゴリズム / VHDL -」のときはテキストどおりにunsigned 12ビット値(0d0000~0d4095)を4桁BCD値 (0x000…

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

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つだけクロックのタイミングで書き換える。