カウンタ単体の動作がOKになったのでいよいよLIFOの機能を作りこんでいきます。まずは規模を見るためスタックは1段としスタックポインタは不要にしました。
入力信号として
PUSH・・・・CALLするとき現在のアドレス値をスタックに退避
POP・・・・・RETURNするときスタックの値を現在のアドレス値へ復帰
を追加、退避用のレジスタの実体reg_Sも追加してそのロジックも記述しています。
どんどん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」に置き換えインデントを減らしてみました(ネストの深さは変わってませんが)分岐構造が判りにくくなってちょっと嫌なんですけど。
これをコンパイルしてもTotal macrocells 36 / 64 ( 56 % )で全然変わりません。何が悪いのか・・