CPLDの設計を始めて、とたんに壁にぶつかりました。 マクロセルの消費量が予想より多く、手持ちのXC9536XLでは足りなさそうなのです。
ロジックはそれほど難しいものではないのですが、2つの8ビットレジスタ(ラッチ)と、2つの3ステートバッファを使っています。 これがどうもマクロセルを喰うようです。
たとえば、双方向3ステートバッファとして次のようなものを考えてみます。 74245と同じです。
entry TristateBuffer is
Port (
ATOB: in std_logic;
G: in std_logic;
BUSA: inout std_logic_vector(7 downto 0) bus;
BUSB: inout std_logic_vector(7 downto 0) bus;
);
end TristateBuffer;
architecture Behavior of TristateBuffer_body is
begin
process (ATOB, G)
begin
if G = '0' and ATOB = '0' then
BUSA <= "ZZZZZZZZ";
BUSB <= BUSA;
elsif G = '0' and ATOB = '1' then
BUSA <= BUSB;
BUSB <= "ZZZZZZZZ";
else
BUSA <= "ZZZZZZZZ";
BUSB <= "ZZZZZZZZ";
end if;
end process;
end Behavior;
これを合成すると、以下のような結果が得られます。
Macrocells Product Terms Function Block Registers Pins Used/Tot Used/Tot Inps Used/Tot Used/Tot Used/Tot 16 /36 ( 44%) 32 /180 ( 18%) 20 /72 ( 28%) 0 /36 ( 0%) 18 /34 ( 53%)
既にマクロセルを16個使っています。 バッファ1つにマクロセル1つ消費する格好です。
これに単純なラッチを追加してみます。
architecture Behavioral of TristateBuffer is
signal Reg: std_logic_vector (7 downto 0);
begin
process (ATOB, G)
begin
if G = '0' and ATOB = '0' then
BUSA <= "ZZZZZZZZ";
BUSB <= "ZZZZZZZZ";
Reg <= BUSA;
elsif G = '0' and ATOB = '1' then
BUSA <= BUSB;
BUSB <= "ZZZZZZZZ";
elsif G = '1' and ATOB = '1' then
BUSA <= "ZZZZZZZZ";
BUSB <= Reg;
else
BUSA <= "ZZZZZZZZ";
BUSB <= "ZZZZZZZZ";
end if;
end process;
end Behavioral;
すると、結果は次のとおりです。
Macrocells Product Terms Function Block Registers Pins Used/Tot Used/Tot Inps Used/Tot Used/Tot Used/Tot 16 /36 ( 44%) 40 /180 ( 22%) 20 /72 ( 28%) 8 /36 ( 22%) 18 /34 ( 53%)
ラッチ部分にレジスタがアサインされ、マクロセルは増大していませんね。
しかし、これはかなりシンプルな例で、if条件を複雑にすると一気に消費マクロセルが増えてしまうようです。
たとえば、今回の試作では、それぞれ独立に合成すると、以下のようになります。
- バスに関係のないデコードに5マクロセル
- メモリアクセスのための3ステートバッファに17マクロセル
- I/O用に8ビットのラッチを2個入れると、16マクロセル
合計は38マクロセル(これでもオーバーですが)なのですが、全部を一気に合成すると56マクロセル消費します。 もちろん条件判断漏れで余計なラッチが合成されないようにプログラムしてです。 しかも、ifの条件の順番を変更すると、使用マクロ数が変動したりします。う~ん。
そんなわけで、なかなか詰め込みも苦労しますが、限られたリソースで何とかするのに慣れているので、これはこれで最適化のし甲斐がありますね...。 最適化病?
匿名
画面が真っ暗、でもカーソルは出てる状況。
探して、ここにたどり着きました。
パスワード入力で、復活!
修理に出す寸前でした。ホントにありがとう!