Forum: FPGA, VHDL & Co. Variable's Initial Value VHDL


von Samer A. (Firma: Personal) (thedestroyer)


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 :)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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;

von Samer A. (Firma: Personal) (thedestroyer)


Lesenswert?

Vielen Dank!!! Verstanden :D

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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;

von Samer A. (Firma: Personal) (thedestroyer)


Lesenswert?

Danke für die Information! Ich kann nur sagen, dass die alten Bücher 
sind wirklich anders. Die alten Bücher von VHDL ( <= 2004 ), bestehen, 
dass die Initiale Werte nur für Simulationen sind.

Danke wieder :)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.