Datentyp initialisieren

OP #7700042
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 von einem Moderator gelöscht.
#7700805
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).

Persönliche Seite #7701320
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.

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