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


von Martin (Gast)


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

von high_speed (Gast)


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.
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
--use IEEE.STD_LOGIC_ARITH.ALL;
4
--use IEEE.STD_LOGIC_UNSIGNED.ALL;
5
6
7
entity T_FF is
8
   Port (
9
      CLK    : in  std_logic;
10
      E      : in  std_logic;
11
      Reset  : in  std_logic;
12
      FF_out : out std_logic
13
   );
14
end T_FF;
15
16
architecture Verhalten of T_FF is
17
  signal FF_intern : std_logic;
18
begin
19
20
   process(CLK)
21
   begin
22
--      if reset='1' then
23
--         FF_intern <= '0';
24
      if CLK'event and CLK = '1' then  -- mit Reset elsif ....
25
         if E = '1' then
26
            FF_intern <= not FF_intern;
27
         end if;
28
      end if;
29
   end process;
30
31
   FF_out <= FF_intern;
32
33
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

von high_speed (Gast)


Lesenswert?

Eigentlich wollte ich den Code mit Reset schicken.
Hier noch mal.

1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
--use IEEE.STD_LOGIC_ARITH.ALL;
4
--use IEEE.STD_LOGIC_UNSIGNED.ALL;
5
6
7
entity T_FF is
8
   Port (
9
      CLK    : in  std_logic;
10
      E      : in  std_logic;
11
      Reset  : in  std_logic;
12
      FF_out : out std_logic
13
   );
14
end T_FF;
15
16
architecture Verhalten of T_FF is
17
  signal FF_intern : std_logic;
18
begin
19
20
   process(CLK, Reset)
21
   begin
22
      if Reset='1' then
23
         FF_intern <= '0';
24
      elsif CLK'event and CLK = '1' then
25
         if E = '1' then
26
            FF_intern <= not FF_intern;
27
         end if;
28
      end if;
29
   end process;
30
31
   FF_out <= FF_intern;
32
33
end Verhalten;

MfG
Holger

von Martin (Gast)


Lesenswert?

Danke für die Antowrten Leute!

Tschüss Martin.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.