CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

スタック実装

カウンタ単体の動作がOKになったのでいよいよLIFOの機能を作りこんでいきます。まずは規模を見るためスタックは1段としスタックポインタは不要にしました。

入力信号として

PUSH・・・・CALLするとき現在のアドレス値をスタックに退避

POP・・・・・RETURNするときスタックの値を現在のアドレス値へ復帰

を追加、退避用のレジスタの実体reg_Sも追加してそのロジックも記述しています。

 

f:id:O3I:20210401195606j:plain

どんどんif~end ifのネストが深くなり、Cのコーディング的にみてif節とelse節は1段インデントを下げ構造的に見やすくしたつもりですがプログラムがだんだん「尖って」きてます。

ここでコンパイルレポートを見てみると

 Total macrocells 36 / 64 ( 56 % )

 Total pins            34 / 36 ( 94 % )

・・ん?12bitカウンタでレジスタ12個、12bitスタックでレジスタ12個、計24個のマクロセル消費と見込んでいましたが何故かすでに36個も消費しています。これはちょっとまずい状況です。スタックの段数が稼げません

解説書を見るとVHDLは冗長な記述をすると、それがロジックにも反映してしまう。条件分岐に漏れがあると不要なラッチを挿入してしまう・・など恐ろしげなことが書いてあります。影響があるかわかりませんが「else~if」の構文は「elsif」に置き換えインデントを減らしてみました(ネストの深さは変わってませんが)分岐構造が判りにくくなってちょっと嫌なんですけど。

 

f:id:O3I:20210401195622j:plain

これをコンパイルしてもTotal macrocells 36 / 64 ( 56 % )で全然変わりません。何が悪いのか・・