VHDLの論理合成によるCPLDマクロセル消費量

  • 投稿日:
  • 更新日:2009/02/10
  • by
  • カテゴリ:

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の条件の順番を変更すると、使用マクロ数が変動したりします。う~ん。

そんなわけで、なかなか詰め込みも苦労しますが、限られたリソースで何とかするのに慣れているので、これはこれで最適化のし甲斐がありますね...。 最適化病?


こちらもよく読まれています