Modellierungsarten

Verhaltensmodellierung

Bei der Verhaltensmodellierung wird ein System durch einen Algorithmus in VHDL Notation veschrieben. Es werden keine Gatter oder komplexere Komponenten direkt verwendet. Ein Verhaltensmodell ist im Prinzip eine Black Box Sicht des zu beschreibenden Systems.

Ein Volladdierer lässt sich mittels Verhaltensmodellierung wie folgt beschreiben:

entity fulladder is
  port(
    x, y, cin: in std_ulogic;
    s, cout:out std_ulogic
  );
end entity;

architecture behave of fulladder is
begin
  s <= '0' when (x = '0' and y = '0' and cin = '0') else
       '1' when (x = '0' and y = '0' and cin = '1') else
       '1' when (x = '0' and y = '1' and cin = '0') else
       '0' when (x = '0' and y = '1' and cin = '1') else
       '1' when (x = '1' and y = '0' and cin = '0') else
       '0' when (x = '1' and y = '0' and cin = '1') else
       '0' when (x = '1' and y = '1' and cin = '0') else
       '1' when (x = '1' and y = '1' and cin = '1');
  cout <= '0' when (x = '0' and y = '0' and cin = '0') else
          '0' when (x = '0' and y = '0' and cin = '1') else
          '0' when (x = '0' and y = '1' and cin = '0') else
          '1' when (x = '0' and y = '1' and cin = '1') else
          '0' when (x = '1' and y = '0' and cin = '0') else
          '1' when (x = '1' and y = '0' and cin = '1') else
          '1' when (x = '1' and y = '1' and cin = '0') else
          '1' when (x = '1' and y = '1' and cin = '1');
end architecture;

In der Beschreibung wird das Verhalten dargestellt, in diesem Beispiel mittels Umsetzung der Wahrheitstabelle.

Strukturmodellierung

Die Basis für den strukturellen VHDL Entwurf ist ein synchrones Design. Prinzipiell besteht jedes synchrone Design aus Kombinatorik und Flip-Flops (meist Register genannt), die alle auf einen gemeinsamen Takt synchronisiert sind.

Um das Design zu strukturieren wird meist das Design meist als Datenpfades aufgebaut. Elemente eines Datenpfades sind dabei:

  • Multiplexer
  • Arithmetische Operatoren (Addierer, Subtrahierer, usw.)
  • Logische Operatoren
  • Komperatoren
  • Register
  • Diverse andere Elemente wie Vorzeichenerweiterung usw.

Die Elemente und die Pfade zwischen den Elementen können entweder einzelne Signale sein oder mehrere zusammengefasste Signale (Busse).

Beispiel

Im folgenden Beispiel soll ein Zähler aufgebaut werden mit drei Eingangssignale value (Bus mit 8 Bit), load und clear. Wie in allen synchronen Designs wird ein gemeinsamer Takt für alle Register genutzt (hier clock). Das Register hat eine Bitbreite von 8.

Textuelle Beschreibung

Die Funktion soll wie folgt sein:

  • Wenn clear gleich 1 ist, soll der Zählerstand auf 0 gesetzt werden,
  • ansonsten wenn load gleich 1 ist, soll der Zählerstand auf value gesetzt werden
  • ansonsten soll der Zählerstand um value erhöht werden.

Schaltung

Schaltung

VHDL Entity

entity sum is
  port (
    clk: in std_ulogic;
    value: in unsigned(7 downto 0);
    load: in std_ulogic;
    clear: in std_ulogic;
    result: out unsigned(7 downto 0)
  );
end entity;

VHDL Architecture

architecture behave of sum is
begin
  process(clk)
  begin
    if rising_edge(clk) then
      if clear='1' then
        result<=(others=>'0');
      elsif load='1' then
        result<=value;
      else
        result<=result+value;
      end if;
    end if;
  end process;
end architecture;

Timingdiagramm

Timingdiagramm

Test des Designs

Umsetzung des Volladdierers

entity fulladder is
  port(
    x, y, cin: in std_ulogic;
    s, cout:out std_ulogic
  );
end entity;

architecture structural of fulladder is
  signal halfadder1_s : std_ulogic ;
  signal halfadder1_cout : std_ulogic ;
  signal halfadder2_cout : std_ulogic ;
begin
  halfadder1: entity work.halfadder
    port map (
      x => x,
      y => y,
      cout => halfadder1_cout,
      s => halfadder1_s
    );
  halfadder2: entity work.halfadder
    port map (
      x => halfadder1_s,
      y => cin,
      cout => halfadder2_cout,
      s => s
    );

  cout <= halfadder1_cout or halfadder2_cout;
end architecture;

An diesem Beispiel für die strukturelle Modellierung sieht man den Aufbau mittels Komponenten. Dadurch ergibt sich eine Hierarchie der Komponenten.

Datenflussmodellierung

Bei der Datenfluss wird der Fluss der Daten modelliert. Dabei werden auf die Eingänge Transformationen angewendet, um die Ausgänge zu berechnen.

entity fulladder is
  port(
    x, y, cin: in std_ulogic;
    s, cout:out std_ulogic
  );
end entity;

architecture dataflow of fulladder is
begin
  s <= x xor y xor cin;
  cout <= (x and y) or ( (x xor y) and cin);
end architecture;