mikrocontroller.net

Forum: FPGA, VHDL & Co. Simulator verhält sich anders als die Zielhardware


Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute!

Ich verwende die Xilinx-Umgebung und arbeite das Buch VHDL-Synthese
durch.

Dort gibt es ein Beispiel für unvollständige Empfindlichkeitslisten:
entity empf is
port(a,b,c:in bit;
y1, y2: out bit);
end empf;

architecture Behavioral of empf is

begin
pfehler: process(a,b)
begin
 y1<=(a and b) or c;
 end process pfehler;

 pkorrekt: process(a,b,c)
 begin
   y2<=(a and b) or c;
end process pkorrekt;

end Behavioral;

Im Buch steht folgendes darüber beschrieben:
---Da 'c' jedoch in der Empfindlichkeitsliste für das Ausgangssignal
'y1' vergesen wurde, wird in der Simulation ein Speicherverhalten
vorgetäuscht.---

Im Simulator:
Also a,b,c sind auf '1'.
Nach 100ns fällt a auf 0.
Nach weiteren 100ns fällt c auf 0.

Im Simulator fällt y2 auf 0, aber y1 bleibt auf 1.

Dann steht noch:
---Das Synthesewerkzeug hingegen erkennt diesen Fehler und fügt das
Signal 'c' automatisch der Empfindlichkeitsliste hinzu.---

Warum reagiert der Simulator anders als die Syntheselogic auf der
Zielhardware?
Warum ist von Fehler die Rede?
Wenn ich möchte, dass der Prozess nur bei einer Änderung von a oder b
aktiviert wird und nicht bei c, warum muss c ebenfalls hinzugefügt
werden?

Dies widerspricht folgender Aussage des Buches:
---Prozesse mit Empfindlichkeitsliste werden immer dann aktiviert, wenn
eins der in der Empfindlichkeitsliste aufgeführten Sinale ein Ereignis,
also die Änderung des Signalwertes aufweist. Derartige Prozesse werden
immer bis zur end process-Anweisung ausgeführt.---

Wenn ich nur auf bestimmte Signale reagieren möchte, würde ich nach
meiner Logik nur jene Signale in die Empfindlichkeitsliste
aufnehemen, wodurch der ensprechende Prozess auch wirklich aktiviert
werden sollte.
Wozu benötige ich dann überhaupt eine Empfindlichkeitsliste, wenn ich
sowieso alle Signale reinschreiben muss?

Danke für eure Antworten.

Tschüss

Martin

Autor: high_speed (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Martin

Du musst erst einmal verstehen, dass die Simulation etwas anderes ist
als die Synthese.

Das Synthese-Tool erzeugt aus deiner Hardware-Beschreibung eine
parallel laufende Hardware-Verschaltung. Bei der Synthese könntest du
die Liste auch komplett weg lassen, das Synthese-Tool braucht sie
nicht.

Dagegen arbeitet das Simulations-Tool deine Beschreibung sequentiell
ab und versucht das Hardware-Verhalten zu simulieren. (Ein 80x86 ist
auch kein FPGA. ;-) )
Anhand der Empfindlichkeitsliste kann es entscheiden, ob es den
Prozess gerade durchfahren muss.

In der Empfindlichkeitsliste brauchst du auch nur Signale aufzunehmen,
die ein Durchlaufen des Prozesses erzwingen.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
--use IEEE.STD_LOGIC_ARITH.ALL;
--use IEEE.STD_LOGIC_UNSIGNED.ALL;


entity T_FF is
   Port (
      CLK    : in  std_logic;
      E      : in  std_logic;
      Reset  : in  std_logic;
      FF_out : out std_logic
   );
end T_FF;

architecture Verhalten of T_FF is
  signal FF_intern : std_logic;
begin

   process(CLK)
   begin
--      if reset='1' then
--         FF_intern <= '0';
      if CLK'event and CLK = '1' then  -- mit Reset elsif ....
         if E = '1' then
            FF_intern <= not FF_intern;
         end if;
      end if;
   end process;

   FF_out <= FF_intern;

end Verhalten;

Achte mal die Signale E und FF_intern. Beide dienen im Prozess auch
als Eingang, lösen ihn aber nicht aus. (Bei der Simulation)

MfG
Holger

Autor: high_speed (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eigentlich wollte ich den Code mit Reset schicken.
Hier noch mal.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
--use IEEE.STD_LOGIC_ARITH.ALL;
--use IEEE.STD_LOGIC_UNSIGNED.ALL;


entity T_FF is
   Port (
      CLK    : in  std_logic;
      E      : in  std_logic;
      Reset  : in  std_logic;
      FF_out : out std_logic
   );
end T_FF;

architecture Verhalten of T_FF is
  signal FF_intern : std_logic;
begin

   process(CLK, Reset)
   begin
      if Reset='1' then
         FF_intern <= '0';
      elsif CLK'event and CLK = '1' then
         if E = '1' then
            FF_intern <= not FF_intern;
         end if;
      end if;
   end process;

   FF_out <= FF_intern;

end Verhalten;

MfG
Holger

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antowrten Leute!

Tschüss Martin.

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.