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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.