2017-07-27 4 views
1

の範囲は、私がSTD_LOGIC_VECTORのビットAA単一ビットまたは多数の別名を持っていると仮定しなさい:位置または別名

signal CR : std_logic_vector(7 downto 0); 
alias CR_ARM : std_logic is CR(0); 
alias CR_PS : std_logic_vector(3 downto 0) is CR(7 downto 4); 

にはどうすればこのようなエイリアスの範囲や位置をアクセスすることができます:

singal tmp : std_logic_vector(7 downto 0); -- output bus vector 
tmp(CR_ARM'range) <= CR_ARM; -- does not compile 
+3

'CR_ARM'はスカラー(' std_logic')=>範囲なしです。 –

+1

私は、属性がCR CR_ARMのどのインデックスに戻ってくるのかを考えています。私はこれが可能だとは思わない。たとえば、ビットマッピングを示す一連の定数を使って、別のアプローチを試みます。 – JHBonarius

+0

* 'CR_ARM'はスカラー(' std_logic')=>範囲なし*です。 std_logicはスカラー型の文字列挙型です。この区別は、配列された値の制約された範囲と、配列オブジェクトの要素を指定するインデックス制約との間の区別である。スカラ型のオブジェクトには、値の範囲はありますが、要素のインデックス範囲はありません。 '' range'は配列型の属性であり、型やオブジェクトの属性ではありません。 IEEE Std 1076-2008 5.タイプ、5.1一般、16.2.3配列の事前定義された属性。 – user1155120

答えて

1

範囲は配列型に対してのみ定義されています。 VHDL-2017がスカラー型の範囲を追加しても、エイリアスが作成されたビットを知りたいので、問題は解決しません。

エイリアスはVHDLで透過的です。エイリアスについて反映するメカニズムはありません。予想通り

signal CR : std_logic_vector(7 downto 0); 
alias CR_ARM : std_logic_vector is CR(0 downto 0); 

signal tmp : std_logic_vector(7 downto 0); -- output bus vector 

-- now a slice name works 
tmp(CR_ARM'range) <= CR_ARM; 

あなたの第二の例は動作しません。

あなたはとても素敵に見えないこの回避策を使用することができます。同じ範囲の制約でエイリアスを宣言する必要があります。それ以外の場合は、CR_PS'rangeを使用するときに他のビットを割り当てます。

関連する問題