Forum: FPGA, VHDL & Co. Datentyp initialisieren


von Max M. (max_muster)


Lesenswert?

Hallo,

ich habe ein Projekt von meinem Vorgaenger geerbt.
Er hat ein universelles Modul "delay_generic" geschrieben.
Fuer die Simulation moechte ich den Wert von data jetzt
initialisieren, bzw. auf 0 setzen. Wie kann ich das machen?

Gruss

Max
1
library ieee;
2
use ieee.std_logic_1164.all;
3
4
entity delay_generic is
5
  generic (
6
    type DATA_TYPE;
7
    LATENCY : natural
8
  );
9
  port (
10
    clk  : in  std_logic;
11
    din  : in  DATA_TYPE;
12
    dout : out DATA_TYPE
13
  );
14
end;
15
16
architecture rtl of delay_generic is
17
begin
18
  latency_generate : if (LATENCY = 0) generate
19
    dout <= din;
20
  else generate
21
    delay_block : block is
22
      type data_vector is array (natural range <>) of DATA_TYPE;
23
      signal data : data_vector(0 to LATENCY - 1); --  := (others => '0');
24
    begin
25
      process (clk) is
26
      begin
27
        if rising_edge(clk) then
28
          data <= din & data(data'left to data'right - 1);
29
        end if;
30
      end process;
31
      dout <= data(data'right);
32
    end block;
33
  end generate;
34
end;

Beitrag #7700619 wurde vom Autor gelöscht.
von Markus F. (mfro)


Lesenswert?

Max M. schrieb:
> Fuer die Simulation moechte ich den Wert von data jetzt
> initialisieren, bzw. auf 0 setzen. Wie kann ich das machen?

Nee, willst Du nicht. Du willst den Wert von data auf den Wert 
initialisieren, der für den gewählten Typ die 0 darstellt. Das ist was 
anderes.
Dazu musst Du den Wert irgendwie zum Elaborationszeitpunkt dahin 
bringen.

Zum Beispiel über ein zusätzliches Generic:
1
...
2
entity delay_generic is
3
  generic (
4
    type DATA_TYPE;
5
    LATENCY : natural;
6
    init_value : DATA_TYPE
7
  );
8
9
...
10
      signal data : data_vector(0 to LATENCY - 1) := (others => init_value);
11
...

Oder - wenn Du sowohl faul als auch schlau bist (und es dich nicht 
stört, dass andere den "Trick" erst mal nicht erkennen):

mit dem Wissen, dass (z.B.) uninitialisierte std_logic in der Simulation 
nicht deswegen den Wert 'U' annimmt, weil sie nicht initialisiert ist 
(wer euch das beigebracht hat, hat gelogen), sondern weil sie mit 'U' 
initialisiert wird (weil 'U' der "linkste" mögliche Wert des Typs ist 
und alle Signale in VHDL in der Simulation mit eben dem initialisiert 
werden) kannst Du die Initialisierung mit 0 einfach dadurch erzwingen, 
indem Du einen Datentyp nimmst, der eben 0 als "leftmost" Wert hat.

Also z.B. natural oder bit (oder irgendein anderer, selbst definierter 
Typ, dessen mögliche "leftmost value" eben 0 entspricht). Dazu musst Du 
an dem existierenden Code gar nichts ändern (möglicherweise aber aus 
anderen Gründen, aber da kommst Du noch drauf).

von Max M. (max_muster)


Lesenswert?

Markus F. schrieb:
> ...

Vielen Dank.
Ich bin in der Zwischenzeit auf die gleiche
Loesung mit einem generic gekommen und es funktioniert.

Max

: Bearbeitet durch User
von J. S. (engineer) Benutzerseite


Lesenswert?

Max M. schrieb:
> Fuer die Simulation moechte ich den Wert von data jetzt
> initialisieren, bzw. auf 0 setzen. Wie kann ich das machen?

Ich tendiere bei solchen Fragen immer dazu, das ausdrücklich zu Beginn 
der Simulation zu tun. Man definiert den Anfangszustand so, wie man ihn 
in der Simulation voraussetzt. Gfs untersucht man so nämlich 
unterschiedliche Anfangsszenarien, was ja gerne ausgelassen wird und 
dann zur Verwunderung führt.

Fest im synthestisierte Initialisierungen machen in der Simulation nur 
dann Sinn, wenn wirklich garantiert ist, dass die HW hernach auch 
wirklich so arbeitet. Daher macht an der Stelle ein echter 
ausdrücklicher Reset auch wieder Sinn.

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.