HOME Corporate Product Verilog VHDL Link Contact Site map


・コンポーネント宣言

 以下のソースは前回に使用したハーフアダーを二つ使用してフルアダーを記述したものです。
 ハーフアダーは下位ビットからのけた上がり信号"CIN"がありません。
 桁上がり信号に対応させるためにはこのような記述にハーフアダーを二つ組み合わせて記述します。
 このフルアダーをさらに複数並べることで4ビットとか8ビットのアダーを作ることができます。

    library IEEE;
    use IEEE std_logic_1164.all;

    entity FULL_ADDER is
     port(
       A :in std_logic;
       B :in std_logic;
       CIN:in std_logic;
       S :out std_logic;
       CO :out std_logic
     );
    end FULL_ADDER;

    architecture DATAFLOW of FULL_ADDER is

    component HALH_ADDER is コンポーネント宣言
     port(
       A :in std_logic;
       B :in std_logic;
       S :out std_logic;
       CO :out std_logic
      );
    end component;

    signal u0_co :std_logic;
    signal u0_s :std_logic;
    signal u1_co :std_logic;

    begin

      U0: HALF_ADDER port map(  @コンポーネント・インスタンス文
           A,
           B,
           u0_s,
           u0_co
         );
      U1: HALF_ADDER port map(  Aコンポーネント・インスタンス文
           u0_s,
           CIN,
           S,
           u1_co
         );

      CO <= u0_co or u1_co;

    end DATAFLOW;

 この記述の@とAの部分が構造化記述にあたります。構造化記述とは、階層設計で下位のモジュールを呼び出したり、あるいはロジックゲートを直接記述する方法を言います。
 VHDLでは、Aのように"architecture"とbegin"の間にそのモジュールがどのように構成されているかを表すコンポーネント宣言をしなければなりません。
 VHDLでは各記述をそれぞれ単独で処理できるようにするため、このような記述が必要になります。少々面倒ですが、下位階層のエンティティ宣言部分をコピーし編集などして記述してください。

    component コンポーネント名
      [ジェネリック文]
      [ポート文]
    end component;

・コンポーネント・インスタンス文

コンポーネント・インスタンス文は、

    ラベル名:コンポーネント名  port map (信号,...);

と記述します。ラベル名は、このコンポーネントにつけられる名前でそのアーキテクチャの中でユニーク(記述中で唯一のもの)なものでなければなりません。
 下位階層のポートと信号は、"port map"で結合します。結合のさせかたは、「位置による関連づけ」と「名前による関連づけ」の2種類があります。
上記のソースは「位置による関連づけ」でポート文にかかれた順番に結合されます。
 名前による関連づけは、

   ポート名 => 信号名

と記述します。
上記のソースのport mapの部分を名前による関連づけで記述すると

     U0: HALF_ADDER port map(  @コンポーネント・インスタンス文
         A => A,
         B => B,
         S => u0_s,
         CO => u0_co
       );

となります。もし、出力信号が接続されないような場合は、予約語の"open"を記述するか、ポート文を省略するかで対応します。
  通常、入力ポートをopenにすることはできません。
しかし例外がありポート宣言に初期値が記述されている場合は可能になります。

    entity HALF_ADDER is
     port(
       A :in std_logic := '0';
       B :in std_logic := '0';
       S :out std_logic;
       CO :out std_logic
      );
    end FULL_ADDER;

     U0: HALF_ADDER port map(
         A => open,
         B => B,
         S => u0_s,
         CO => u0_co
       );

ポートに結合できるのは、信号あるいはデータタイプ変換関数のみです。
演算式や定数を直接ポートに接続することはできません。




Back

HOME Corporate Product Verilog VHDL Link Contact Site map