2016-03-31 54 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

我不能回答爲什麼這樣,但可能是語言進化的結果。

但是,處理這種情況的一種方法是命名內部常量,如PRIVATE_...,並告訴用戶不要映射這些;如果用戶真的想要破壞功能,則有很多選擇,所以如果給出合理的指導,用戶可以正確實例化,這可能是一個合理的設計標準。

但是如果你想確定私有常量沒有被修改,那麼assert是一個選項;即使它的重複計算:

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