[[dt-code]]

This is an old revision of the document!


VHDL Code Beispiele

Entity and Architecture
library ieee;
use ieee.std_logic_1164.all;
 
entity and_gate is
port(
  a_i : in std_ulogic;
  b_i : in std_ulogic; 
  y_o : out std_ulogic);
end and_gate;
 
architecture rtl of and_gate is
begin
  y_o <= a_i and b_i; 
end architecture rtl; 
 
Strukturelle Beschreibung von Schaltungen
library ieee;
use ieee.std_logic_1164.all;
 
entity mux is
port (
  a_i : in std_ulogic;
  b_i : in std_ulogic;
  s_i : in std_ulogic;
  y_o : out std_ulogic);
end mux;
 
architecture structure of mux is
 
  component and_gate 
    port(
      a_i : in std_ulogic;
      b_i : in std_ulogic;
      y_o : out std_ulogic);
  end component;      
 
  component or_gate
    port(
      a_i : in std_ulogic;
      b_i : in std_ulogic;
      y_o : out std_ulogic);
  end component;
 
  component inv_gate
    port(
      a_i : in std_ulogic;
      y_o : out std_ulogic);
  end component;
 
  signal s1 : std_ulogic;
  signal s2 : std_ulogic;
  signal s3 : std_ulogic;     
 
begin
 
  inv_gate_i0 : inv_gate
  port map(
    a_i => s_i,
    y_o => s1);
 
  and_gate_i0 : and_gate
  port map(
    a_i => s1,
    b_i => a_i,
    y_o => s2);
 
  and_gate_i1 : and_gate
  port map(
    a_i => s_i,
    b_i => b_i,
    y_o => s3);
 
  or_gate_i0 : or_gate
  port map(
    a_i => s2,
    b_i => s3,
    y_o => y_o);
 
end architecture structure;
Funktionale Beschreibung mit Concurrent Signal Assignments

Eine alternative Beschreibung des Multiplexers mit Funktionen und Concurrent Signal Assignments. Die Funktionen “not” “and”, “or” und andere sind im package ieee.std_logic_1164 definiert.

architecture rtl-1 of mux is
signal s1, s2, s3 : std_ulogic;
begin
 
s1 <= not s_i;
s2 <= s1 and a_i;
s3 <= s_i and b_i;
y_o <= s2 or s3;  
 
end rtl-1
Funktionale Beschreibung mit einem Prozess

Ein Prozess enthält sequentielle Anweisungen. Ein Prozess wird immer ausgeführt, wenn sich ein Signal in der “sensitivity list” ändert.

Die Sequenz der Anweisungen in einem Prozess entspricht nicht einer zeitlichen Sequenz. Das bedeutet der Prozess berechnet die neuen Werte der Signale und diese werden dann alle zeitgleich zugewiesen. Im folgenden Beispiel wurde die Anweisung s3 ⇐ s_i and b_i durch einen Prozess ersetzt. Die Funktion hat sich dadurch nicht geändert.

architecture rtl-2 of mux is
signal s1, s2, s3 : std_ulogic;
begin
 
s1 <= not s_i;
s2 <= s1 and a_i;
-- s3 replaced with process
y_o <= s2 or s3; 
 
s3_and_p : process (s_i, b_i)
begin
  s3 <= '0';
  if s_i = '1' and b_i = '1' then 
    s3 <= '1';
  end if;
end process s3_and_p;
 
end rtl-2
Komplette funtkionale Beschreibung in einem Prozess

Alternativ lässt sich auch die ganze Multiplexerfunktion in einem Prozess beschreiben. Die Lesbarkeit wird durch diese Beschreibung häufig erhöht.

architecture rtl-3 of mux is
 
begin
 
mux_p : process (s_i, a_i, b_i)
begin
  y_o <= '0';
  if s_i = '1' then
    y_o <= b_i; 
  else
    y_o <= a_i; 
  end if;
end process mux_p;
 
end rtl-3
Prozess mit einem case statement

Alternativ lässt sich auch ein case statement in einem Prozess verwenden.

architecture rtl-4 of mux is
 
begin
 
mux_p : process (s_i, a_i, b_i)
begin
  y_o <= '0';
  case s_i is
    when '0'    => y_o <= b_i;
    when '1'    => y_o <= a_i;
    when others => y_o <= '0';
  end case;
end process mux_p;
 
end rtl-4
Conditional Signal Assignment

Dann gibt es noch das Conditional Signal Assignment.

architecture rtl-5 of mux is
 
begin
 
y_o <= b_i when s_i = '1' else a_i; 
 
end rtl-5
Selected Signal Assignment

Noch eine alternative ist das selected signal assignment.

architecture rtl-6 of mux is
 
begin
 
with s_i select
  y_o <= a_i when '0',
         b_i when '1';
 
end rtl-6
  • dt-code.1326284062.txt.gz
  • Last modified: 2012/01/11 13:14
  • by beckmanf