いろいろトライ&エラーで、最適化の方法がだんだんわかってきました。
一番簡単なのは、「出力信号ごとにプロセスを分ける」ということです。
たとえば、昨日の例なら、次のようにします。
process (ATOB, G) begin if G = '0' and ATOB = '0' then BUSA <= "ZZZZZZZZ"; Reg <= BUSA; elsif G = '0' and ATOB = '1' then BUSA <= BUSB; else BUSA <= "ZZZZZZZZ"; end if; end process; process (ATOB, G) begin if G = '1' and ATOB = '1' then BUSB <= Reg; else BUSB <= "ZZZZZZZZ"; end if; end process;
ただし、この例は簡単すぎるので、マクロセルを含めリソースの消費量は変わりません。
あと、バスに複数の信号を選択的に入れたい場合、マルチプレクサが挿入されます。 マルチプレクサ一つにつきマクロセル一つを消費するようで、今回の試作ではこれが大きく響いています。 2つある8ビットのデータバスの両方とも、複数のデータソースを持つためです。
実際にはフィッティング時の最適化で、「必ずこれによりマクロセルを消費する」ということは言えないようですが。 わかっている範囲で、単体でマクロセルを消費するロジックは以下のとおりです。
- マルチプレクサ
- 3ステートバッファ
- XORゲート
レジスタは必ずしも単体でマクロセルを消費しないようです。
こんな感じで最適化を行った結果、次のようになりました(XC9536ではオーバーしてフィッティング結果が出ないので、XC9572でフィッティングを行っています)。
Macrocells Product Terms Function Block Registers Pins Used/Tot Used/Tot Inps Used/Tot Used/Tot Used/Tot 42 /72 ( 58%) 96 /360 ( 27%) 77 /144 ( 53%) 16 /72 ( 22%) 31 /34 ( 91%)
マルチプレクサを低レベルのロジックで手組みすると、少し減ります。 すなわち、
if COND1 = '0' and COND2 = '0' then BUSA <= BUSB; elsif COND3 = '0' and COND4 = '0' then BUSA <= Reg; end if;
とする代わりに、
if (COND1 = '0' and COND2 = '0') or (COND3 = '0' and COND4 = '0') then BUSA(7) <= ((COND1 nor COND2) and BUSB(7)) or ((COND3 nor COND4) and Reg(7)); BUSA(6) <= ((COND1 nor COND2) and BUSB(6)) or ((COND3 nor COND4) and Reg(6)); ... end if;
のように、低レベルな記述に手で変換してやります。 すると、以下のようになりました。
Macrocells Product Terms Function Block Registers Pins Used/Tot Used/Tot Inps Used/Tot Used/Tot Used/Tot 40 /72 ( 56%) 94 /360 ( 26%) 82 /144 ( 57%) 16 /72 ( 22%) 31 /34 ( 91%)
目標とするマクロセル数は36。惜しいですねぇ。
匿名
画面が真っ暗、でもカーソルは出てる状況。
探して、ここにたどり着きました。
パスワード入力で、復活!
修理に出す寸前でした。ホントにありがとう!