5

次のような std_logic_vector があります。

cntrl_signals:out std_logic_vector(4 downto 0);

このベクトルにインデックスを付ける 1 つの方法は、それぞれの定数を明示的に定義することです。

constant CLK_SIG:integer := 0;
constant EN_SIG:integer := 1;
constant FOO_SIG:integer := 2;
constant BAR_SIG:integer := 3;
constant BAZ_SIG:integer := 4;

アイデアは、これらを使用してベクトルにインデックスを付けることです。

cntrl_signals <= (CLK_SIG=>1,EN_SIG=>1,others=>0);

私の質問は、インデックスを宣言する簡単な方法 (C の列挙型など) があるかどうかです。

4

2 に答える 2

12

列挙型を使用することもできますが、最良の方法は、整数ではなく列挙型によってインデックス付けされた std_logic の独自のベクトルを宣言することです。

しかし、 vector の代わりに record の方がよいでしょう:

type Control_Signals is record
   Clk : std_logic,
   En  : std_logic,
   Foo : std_logic,
   Bar : std_logic,
   Baz : std_logic
end record;

詳細については、コメントに従って編集してください。

std_logic_vector (および一般的な VHDL の型システム) の想像を絶する使用は、VHDL を妨げています...

これが最上位エンティティの場合、std_logic_vector ポートを使用すると、最上位テストベンチで合成可能なデザインを合成後のネットリストで置き換えることができます。または、 std_logic_vector ポートを主張する時代遅れのコーディング スタイル ガイドラインに準拠する必要がある場合もあります。

しかし、他の状況では、パッケージでレコードを宣言し、設計全体でそのパッケージを使用し、レコード タイプのポートを作成します。パッケージには関数to_slvto_control_sigs、std_logic_vectors が実際に必要な場合 (うまくいけばまれですが) が含まれている必要があります。

同じことが列挙にも当てはまります。

type Controls is (Clk, En, Foo, Bar, Baz);
type Control_Signals is array(Controls) of std_logic;
My_Bus_Ctrl : Control_Signals := (Clk => '1', En => '1', others => '0');
My_External_SLV_Port <= std_logic_vector(My_Bus_Ctrl);

そしてもちろん、列挙は C よりも少し強力です。それらを配列インデックス型として使用するだけでなく、それらをループすることもできます。これにより、列挙を更新するたびにループが整列されます!

列挙によってインデックス付けされたレコードまたは配列はどちらも機能します。オブジェクト指向の実践に沿った、よりクリーンなレコードを好みます。

どちらの場合でも、エンティティ ポートに使用すると、はるかに便利になります。発信バス信号 (アドレスとデータを含む) 用に 1 つのレコード (または配列!) を宣言し、着信信号用に別のレコードを宣言します。これは、1 つのポートで方向を混在させることができないためです... (最近の FPGA には双方向信号はありません。したがって、3 番目のポートは必要ありません)。

これで、デザインはバス構造の変更から保護されました。アドレス幅の変更または割り込み信号の追加は、レコード宣言と実際のユーザーのみを変更します。階層全体に新しい信号を追加する必要はありません...

于 2012-12-10T22:10:09.867 に答える
1

ブライアンは最良の答えを持っていますが、別の情報があります:

次のような列挙を作成できます。

type some_type is (clk, en, foo, bar, baz);

そのタイプのsignalorがある場合は、属性を使用して数値に戻すことができます。variable'pos

variable v : some_type := foo;

v'pos整数を返します2

于 2012-12-11T11:57:51.977 に答える