Variable's Initial Value VHDL

(Firma: Personal) #2348349
Lesenswert?

Hallo Leute :),

eine kleine Frage habe ich. Wenn man einen Initialen Wert für eine 
Variable angibt, kann das Sythesisiert werden? oder ist das nur für 
Simulationen?

Beispiel:
1
architecture Behavioral of LCDDriver is
2
  CONSTANT SEC: INTEGER := 50000000;
3
  SIGNAL MYBIT: STD_LOGIC_VECTOR := '1';
4
begin
5
  process(clk)
6
      variable MYVEC: STD_LOGIC_VECTOR(7 downto 0) := (others => '1');
7
  begin
8
      --irgendwas
9
  end process;
10
end Behavioral;

Werden die Variablen SEC und MYBIT die Werte 50000000 und 1 haben, wenn 
mein FPGA bootet? und wird die Variable MYVEC den Wert "11111111" haben 
jedesmal wenn den process aufgerufen wurde?

Danke :)
Moderator (Firma: Titel) Persönliche Seite #2348383
Lesenswert?

Samer Afach schrieb:
> Wenn man einen Initialen Wert für eine Variable angibt, kann das
> Sythesisiert werden?
Ja, aber:
> wird die Variable MYVEC den Wert "11111111" haben
> jedesmal wenn den process aufgerufen wurde?
Nein. Diesen Wert hat sie nur 1x, nach dem "Booten".
Denn sonst würde das ja bedeuten, dass eine Variable nicht speichernd 
sein darf!

Aber was passiert denn hier:
1
  process(clk)
2
      variable MYVEC: STD_LOGIC_VECTOR(7 downto 0) := (others => '1');
3
  begin
4
      irgendein_signal <= variable; -- lesend zugreifen
5
      -- oder      
6
      if (variable="10101010") then ... -- auch hier lesender Zugriff
7
      -- oder      
8
      variable := variable-1; -- wieder ein lesender Zugriff...
9
       
10
      variable := neuer_wert; -- schreibender Zugriff.  
11
  end process;
Hier muss die Variable speichernd sein, weil zuerst lesend darauf 
zugegriffen wird!

Wenn du die Variable jedesmal mit diesem Wert belegen willst, dann 
mußt du die erste Operation mit der Variablen schreibend machen:
1
  process(clk)
2
      variable MYVEC: STD_LOGIC_VECTOR(7 downto 0) := (others => '1');
3
  begin
4
      variable := (others => '1'); -- schreibender Zugriff.  
5
      
6
      -- dann erst lesend zugreifen
7
      irgendein_signal <= variable;
8

9
      if (variable="10101010") then ... 
10

11
      variable := variable-1;
12
  end process;
Moderator (Firma: Titel) Persönliche Seite #2348387
Lesenswert?

Ein kleiner Nachtrag noch: Manche Leute nehmen sogar Variablen für 
Zähler, dann darf die Variable auf keinen Fall jedesmal neu 
initialisiert werden. sie muss speichernd sein:
1
  process(clk)
2
      variable myvar : interger := 500;
3
  begin
4
      if rising_edge(clk) then
5
        if (myvar<1000) then  
6
           myvar := myvar+1;
7
        else
8
           myvar := 0;
9
        end if;
10
  end process;
Moderator (Firma: Titel) Persönliche Seite #2348396
Lesenswert?

Samer Afach schrieb:
> Die alten Bücher von VHDL ( <= 2004 ), bestehen,
> dass die Initiale Werte nur für Simulationen sind.
Das war für damals käufliche Synthesizer auch korrekt. Aber die "lernen" 
ja auch dazu...

Zwischendurch gab es eine Phase, wo kostenlose Tools die Initialisierung 
nicht konnten, die kostenpflichtigen Varianten aber schon.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren