2016-03-31 5 views
4
entity blabla is 
generic(
     register_width : integer := 32; 
     --Assuming register_width > 4 
     constant AVAILABLE_FOR_USER : integer := register_width - 4 --allowed in 2008  
     ); 
port (
      clk : in std_logic; 
      rst : in std_logic; 
      reg : out std_logic_vector(AVAILABLE_FOR_USER-1 downto 0) 
     ); 
end blabla; 

汎用ブロックで定数を使用する理由は、インスタンスがそれを上書きできるのはなぜですか?ジェネリックのVHDL定数

インスタンス化時にオーバーライドできないジェネリックに基づいて定数を作成する方法はありますか?

または上記の例では、定数を使用するたびに計算を置き換えることができますが、それはエレガントではなく、条件が変更された場合、多くのリワークとエラーが発生する可能性があります。

答えて

2

私はそれがなぜそうであるのか、おそらく言語の進化の結果について答えることができません。

これを処理する方法の1つは、PRIVATE_...のような内部定数に名前を付けることです。ユーザーが実際に機能を中断したい場合は、たくさんのオプションがあります。合理的なガイドがあれば、ユーザーが正しくインスタンス化する合理的な設計基準になるかもしれません。

ただし、プライベート定数が変更されていないことを確認したい場合は、アサートがオプションです。その計算を繰り返していても:ここ

architecture syn of blabla is 
begin 
assert register_width - 4 = AVAILABLE_FOR_USER; 
end architecture; 
+0

ありがとうございました。それは意味をなさない –

1

は、一度計算してソリューションです:

library IEEE; 
use IEEE.std_logic_1164.all; 

entity blabla is 
generic(
     register_width : integer := 32 
     ); 
port (
      clk : in std_logic; 
      rst : in std_logic; 
      reg : out std_logic_vector(register_width - 5 downto 0) 
     ); 
end blabla; 

architecture blabla of blabla is 
    constant AVAILABLE_FOR_USER : integer := reg'LEFT+1; 
    signal SOME_INTERNAL_SIGNAL : std_logic_vector(AVAILABLE_FOR_USER-1 downto 0); 

http://www.edaplayground.com/x/4AYF