2016-03-31 20 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; 

Was wäre der Grund, eine Konstante in einem generischen Block zu verwenden, wenn die Instanz sie einfach überschreiben kann?VHDL-Konstante in Generics

Gibt es eine Möglichkeit, eine Konstante zu erstellen, die auf einem generischen Objekt basiert, das bei der Instanziierung nicht überschrieben werden kann?

oder mein oben genanntes Beispiel Ich kann einfach die Berechnung jedes Mal ersetzen, wenn ich die Konstante verwenden möchte, aber das scheint nicht elegant und wenn mein Zustand ändert, könnte es eine Menge Nacharbeit und mögliche Fehler verursachen es wächst der Code

Antwort

2

Ich kann nicht für warum es so ist antworten, aber wahrscheinlich ein Ergebnis der Evolution der Sprache.

Aber eine Möglichkeit, dies zu handhaben, ist, die internen Konstanten so etwas wie PRIVATE_... zu benennen, und dem Benutzer zu sagen, diese nicht zuzuordnen; Wenn Benutzer die Funktionalität tatsächlich unterbrechen möchten, gibt es eine Vielzahl von Optionen. Es kann daher ein vernünftiges Designkriterium sein, dass Benutzer korrekt instanziiert werden, wenn sie angemessene Anleitungen erhalten.

Aber wenn Sie sicher sein wollen, dass die privaten Konstanten nicht geändert wurden, dann ist eine Assert eine Option; obwohl seine Wiederholung der Berechnung:

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

Danke. Das macht Sinn –

1

Hier wird eine Lösung mit der Berechnung einmal:

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