mikrocontroller.net

Forum: FPGA, VHDL & Co. Record initialisieren


Autor: Matthias Krüßelin (kruessi80)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

gibt es eine einfache Möglichkeit folgende Signale
in einem Rutsch alle auf den Wert '0' zu initialisieren?`
   type diag_typ is record 
      gap : std_logic;
      preamble : std_logic;
      data : std_logic;
      fcs : std_logic;
   end record;
   signal sdiag: diag_typ;

So geht es leider nicht:
   signal sdiag: diag_typ := (others => '0');

Danke im voraus,
Matthias

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du mußt die Dinger einzeln per Handschlag verabschieden...
   signal sdiag: diag_typ := (gap => '0', preamble => '0', data => '0', fcs => '0');

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du könntest ein Package anlegen, das die Recorddefinition enthält, dann 
kannst du den others-Trick machen. Obe dein gesamtes Design dann aber 
noch lesbar ist, das mußt du selber entscheiden...
library ieee;
use ieee.std_logic_1164.all;

package diag_comp is 
   type diag_typ is record 
      gap      : std_logic;
      preamble : std_logic;
      data     : std_logic;
      fcs      : std_logic;
   end record;
end package;


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
use work.diag_comp.all;

entity RecordInit is
    Port (clk  : in  STD_LOGIC;
          data : out STD_LOGIC);
end RecordInit;

architecture Behavioral of RecordInit is
  signal sdiag: diag_typ := (others=>'0');     -- oder 
  signal sdiag: diag_typ := ('0','0','0','0'); -- alternativ
begin
  data <= sdiag.data; 
end Behavioral;

Und spätestens, wenn z.B. sowas drinsteht:
library ieee;
use ieee.std_logic_1164.all;

package diag_comp is 
   type diag_typ is record 
      gap      : std_logic;
      preamble : std_logic;
      data     : std_logic_vector(3 downto 0);
      fcs      : std_logic;
   end record;
end package;
Dann gilt wieder die Handschlagregel:
  signal sdiag: diag_typ := (data=>(others=>'0'), others=>'0');
  -- oder
  signal sdiag: diag_typ := ('0','0',(others=>'0'),'0');

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mir mal ein neues unberührtes Projekt angelegt und das Ganze 
genauer angeschaut: es klappt problemlos.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity RecordInit is
    Port (clk  : in  STD_LOGIC;
          gap  : in  STD_LOGIC;
          data : out STD_LOGIC);
end RecordInit;

architecture Behavioral of RecordInit is
   type diag_typ is record 
      gap : std_logic;
      preamble : std_logic;
      data : std_logic;
      fcs : std_logic;
   end record;
   signal sdiag: diag_typ := (others=>'0');
begin
  sdiag.gap  <= gap when rising_edge(clk); 
  sdiag.data <= sdiag.gap when rising_edge(clk); 
  data       <= sdiag.data when rising_edge(clk); 
end Behavioral;

Nur wenn sich im Record ein Vektor befindet, muß Hand angelegt werden:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity RecordInit is
    Port (clk  : in  STD_LOGIC;
          gap  : in  STD_LOGIC;
          data : out STD_LOGIC);
end RecordInit;

architecture Behavioral of RecordInit is
   type diag_typ is record 
      gap : std_logic;
      preamble : std_logic;
      data : std_logic_vector(3 downto 0);
      fcs : std_logic;
   end record;
   signal sdiag: diag_typ := (data=>(others=>'0'), others=>'0');
--  oder
--  signal sdiag: diag_typ := ('0','0',(others=>'0'),'0');
begin
  sdiag.gap     <= gap when rising_edge(clk); 
  sdiag.data(0) <= sdiag.gap when rising_edge(clk); 
  data          <= sdiag.data(0) when rising_edge(clk); 
end Behavioral;

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei mir gibt es zu jeder Typdefinition gleich eine Defaultkonstante:
   type diag_typ is record 
      gap : std_logic;
      preamble : std_logic;
      data : std_logic_vector(3 downto 0);
      fcs : std_logic;
   end record;
   default_diag_constant : diag_typ :=(
      gap      => '0',
      preamble => '0',
      data     => (others <= '0'),
      fcs      => '0'
   );
...
   signal sdiag: diag_typ := default_diag_constant;

Falls man den Typ mal erweitert, muss man nicht gleich den ganzen Code 
anfassen und hoffen, das man alle Initialisierungen erwischt hat.

Duke

Autor: Matthias Krüßelin (kruessi80)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Euch beiden für den Tip. Funktioniert wunderbar! :-)

Grüße
Matthias

Autor: Matthias Krüßelin (kruessi80)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag:

Dies funktioniert auch mit verschachtelten Records in undefinierten 
Arrays :-)

   type data_typ is record
      data : bit_vector(7 downto 0);        -- data
      valid : bit;                          -- data_valid
      error : bit;                          -- data_error
   end record;
   constant default_data_typ_constant : data_typ :=(
      data     => (others => '0'),
      valid    => '0',
      error    => '0'
   );
   type frame_of_data_typ is array (natural range <>) of data_typ;

   -- Tx Data, Data_valid and underrun record
   type frame_typ is record
      data_columns : frame_of_data_typ(0 to C_MAX_FRAMELENGTH-1);
      bad_frame : boolean;                   
      framelength : natural;
      gap : natural;
   end record;
   constant default_frame_typ_const : frame_typ :=(
      data_columns => (others => default_data_typ_constant),
      bad_frame => false,
      framelength => 0,
      gap => 0
   );


Matthias

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.