|
・コンポーネント宣言
以下のソースは前回に使用したハーフアダーを二つ使用してフルアダーを記述したものです。
ハーフアダーは下位ビットからのけた上がり信号"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
);
ポートに結合できるのは、信号あるいはデータタイプ変換関数のみです。
演算式や定数を直接ポートに接続することはできません。
|