Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> VHDL

VHDL Records für saubere, wiederverwendbare FIFO-Interfaces nutzen

In VHDL bieten Records eine mächtige Möglichkeit, Ihr Design zu straffen – analog zu Structs in C. Durch Gruppierung verwandter Signale in einen einzelnen Typ können Sie Code-Duplikation drastisch reduzieren, Lesbarkeit verbessern und Port Maps über mehrere Entities vereinfachen.

Records glänzen bei großen, wiederkehrenden Interfaces – wie denen zu Off-Chip-Memories oder FIFOs – wo dieselbe Menge an Steuer- und Datensignalen wiederholt auftritt. Ein Record einmal in einem Package zu definieren und überall wiederzuverwenden, hält Entity-Interfaces aufgeräumt und erleichtert spätere Änderungen.

Das folgende Beispiel zeigt, wie Sie zwei Record-Typen in einem dedizierten Package (example_record_pkg.vhd) erstellen und sie nutzen, um die Input- und Output-Signale eines FIFOs zu modellieren. Ein einzelnes Record-Signal repräsentiert alle Inputs vom FIFO, ein anderes alle Outputs zum FIFO.

Kernaussagen:

  1. Records vereinfachen Entity-Deklarationen und Port Maps in VHDL.
  2. Sie können Elemente verschiedener Typen halten – std_logic, integer, std_logic_vector, etc.
  3. Records sind analog zu C Structs und bieten ein vertrautes Paradigma für viele Ingenieure.
  4. Gemeinsame Record-Typen sollten in einem einzigen Package residieren für Konsistenz.
  5. Record-Signale können mit Konstanten initialisiert werden für vorhersehbare Startwerte.
  6. Arrays von Records ermöglichen strukturiertes Datenhandling, z. B. eine Tabelle von FIFO-Konfigurationen.

Unten die Package-Definition, gefolgt von einer Beispiel-Entity, die die Record-Typen für FIFO Read/Write-Logik nutzt. Der Code ist vollständig compliant zum IEEE 1076-2008 Standard.

 library ieee; use ieee.std_logic_1164.all; package example_record_pkg is -- Outputs vom FIFO. type t_FROM_FIFO is record wr_full : std_logic; -- FIFO Full Flag rd_empty : std_logic; -- FIFO Empty Flag rd_dv : std_logic; rd_data : std_logic_vector(7 downto 0); end record t_FROM_FIFO; -- Inputs zum FIFO. type t_TO_FIFO is record wr_en : std_logic; wr_data : std_logic_vector(7 downto 0); rd_en : std_logic; end record t_TO_FIFO; constant c_FROM_FIFO_INIT : t_FROM_FIFO := (wr_full => '0', rd_empty => '1', rd_dv => '0', rd_data => (others => '0')); constant c_TO_FIFO_INIT : t_TO_FIFO := (wr_en => '0', wr_data => (others => '0'), rd_en => '0'); end package example_record_pkg; 
 library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; use work.example_record_pkg.all; -- PACKAGE HIER NUTZEN! entity example_record is port ( i_clk : in std_logic; i_fifo : in t_FROM_FIFO; o_fifo : out t_TO_FIFO := c_TO_FIFO_INIT -- Output Record initialisieren ); end example_record; architecture behave of example_record is signal r_WR_DATA : unsigned(7 downto 0) := (others => '0'); begin -- Handles Writes zum FIFO p_FIFO_WR : process (i_clk) is begin if rising_edge(i_clk) then if i_fifo.wr_full = '0' then o_fifo.wr_en <= '1'; o_fifo.wr_data <= std_logic_vector(r_WR_DATA + 1); end if; end if; end process p_FIFO_WR; -- Handles Reads vom FIFO p_FIFO_RD : process (i_clk) is begin if rising_edge(i_clk) then if i_fifo.rd_empty = '0' then o_fifo.rd_en <= '1'; end if; end if; end process p_FIFO_RD; end behave; 

VHDL

  1. Einführung in VHDL: Ihr erstes AND-Gate bauen
  2. Umfassender Guide zu VHDL Typkonvertierungen mit Numeric_Std & Std_Logic_Arith
  3. VHDL Procedure Beispiel: Inkrementieren eines Standard Logic Vectors
  4. Signed vs. Unsigned in VHDL meistern: Praktische Einblicke
  5. VHDL Variables erklärt: Praxisbeispiele & Regeln für zuverlässiges Design
  6. SPICE AC/DC/Transient-Analyse: Kurven, Punkte, Frequenz-Sweep & Optionen
  7. Die Kunst und der Prozess der LP-Schallplattenproduktion
  8. Formale Verifikation von VHDL-Modulen mit PSL meistern
  9. String-Listen in VHDL erstellen: Best Practices & Beispiel
  10. VHDL Generate Statements meistern: Wiederverwendbare Debouncer einfach erstellen