Forum: FPGA, VHDL & Co. Sensitivitätsliste in VHDL Code


von maxpower (Gast)


Lesenswert?

Guten Abend liebe Forenmitglieder,
ich bin neu hier und brauche Hilfe.

Es geht um die Sensitivtätsliste. Was sie bedeutet, ist mir klar.
Aber wie sieht man am Code in VHDL, dass eine Sensitivitätsliste 
vorhanden ist?

Ich soll zB ein OR-Gatter mit Sensitivitätsliste als Code für eine rein 
kombinatorische Schaltung angeben.
1
case x is 
2
 when "00" => x := "0";
3
 when "01" | "10" | "11" => c := "1";
4
 when others => none;
5
end case

Ist das richtig? Wo ist da die Sensitivitätsliste?

MfG
maxpower

von J. S. (engineer) Benutzerseite


Lesenswert?

oben, hinter dem process statement

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

1
   process (hier, ist, die, sensitivliste) begin 
2
      ....
3
   end process;

BTW: die Verwendung von Variablen stimmt mich sehr nachdenklich...

von Klaus (Gast)


Lesenswert?

maxpower schrieb:
> case x is
>  when "00" => x := "0";
>  when "01" | "10" | "11" => c := "1";
>  when others => none;
> end case

DAS ist so ziemlich die schlimmste Beschreibung eines or die ich je 
gesehen hab =-O
1
 C := A or B; --das hier wäre ja auch viel zu einfach...

von J. S. (engineer) Benutzerseite


Lesenswert?

Klaus schrieb:
>>  when "01" | "10" | "11" => c := "1";

Das habe ich noch nie gesehen.(?)
Und ich habe schon viel gesehen.

@Klaus:

und dennoch ist es korrekt, weil es eine Verhaltensbeschreibung ist, 
während Du schon auf Logiklevel baust :-)

von maxpower (Gast)


Lesenswert?

Ich muss mich für das Chaos entschuldigen.
Es war natürlich so gemeint: c := a oder b
Das x ist Unsinn, hab mich verschrieben :-)
1
case x is 
2
 when "00" => c := "0";
3
 when "01" | "10" | "11" => c := "1";
4
 when others => none;
5
end case

Aber wie lautet der Code mit der Sensitivitätsliste?
Was genau soll in den process-Teil rein?

Sorry für die (dummen) Fragen, aber ich bin Laie auf dem Gebiet.

MfG
maxpower

von Christian R. (supachris)


Lesenswert?

Die Sensitivitätsliste ist ausschließlich für den Simulator relevant 
und gibt an, welche Signale auf Änderungen überwacht werden sollen. 
Jedes mal wenn sich ein Signal aus der Liste ändert, wird das Ergebnis 
des Prozesses vom Simulator neu berechnet. Trotzdem sollte man die Liste 
immer ordentlich beschreiben, da sonst Simulation und Realität nicht 
übereinstimmen. In deinem Fall müsste dann x in die Liste, denn bei 
einer Änderung von x soll sofort der Ausgang neu berechnet werden. Der 
Synthese ist die Liste egal, die spuckt in der Regel nur eine Warnung 
aus, wenn sie nicht vollständig ist.
1
OR : process(x)
2
begin
3
  case x is 
4
   when "00" => c := "0";
5
   when "01" | "10" | "11" => c := "1";
6
   when others => none;
7
  end case
8
end process;

von maxpower (Gast)


Lesenswert?

Danke :-)

Ansonsten stimmt alles, oder?
Kann ich analog zu dem obigen Beispiel auch ein AND Gatter in Code 
realisieren?

MfG
maxpower

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

maxpower schrieb:
> Ansonsten stimmt alles, oder?
Wegen des "when others" bekommt du in der Simulation ein Latch, das es 
in der Hardware nicht geben wird. Richtigerweise solltest du da nicht 
"none" machen, sondern einen Fehler ausgeben.
> Kann ich analog zu dem obigen Beispiel auch ein AND Gatter in Code
> realisieren?
Ja, aber es ist Blödsinn, die vorhandenen Basisfunktionen von VHDL 
nicht zu nutzen.

von Der Besucher (Gast)


Lesenswert?

Irgendwie fehlt noch die Variablendeklaration von c.
Ausserdem sollte die Variable c innerhalb des Processes einem Signal 
zugewiesen werden.
Oder gleich ein Signal verwenden. Mit Variablennutzung tut man sich als 
Anfänger keinen Gefallen.

Der Besucher

von mndfg (Gast)


Lesenswert?

1
OR : process(x)
2
begin
3
  case x is 
4
    when "00" => 
5
      c <= '0';
6
    when others =>
7
      c <= '1';
8
  end case
9
end process;
Das ist zwar nicht ganz korrekt, aber abhängig davon, als was c 
definiert ist, wird es funktionieren.

Aber auch ich muß sagen, sowas habe ich noch nie gesehen. Bestimmt ist 
es für die Ausbildung, da wird manchmal bewußt auf eingebaute Funktionen 
verzichtet, damit die Leute verstehen, was die Tools machen! Aber 
irgendwie habe ich das Gefühl, das dieser Plan nur selten auf geht!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> dass dieser Plan nur selten auf geht!
Er geht meist schief, denn die Leute machen das hinterher tatsächlich 
so. Ich habe schöne mal eine Diplomarbeit zur Bewertung bekommen, da war 
ein recht komplexer Automat aus vielen einzeln instantiierten Flipflops 
und Logikelementen (mit Black-Box Primitives vom Hersteller A) 
geschrieben. Ich brauchte eine Weile, bis ich herausfand, dass das ganze 
25-Dateien-Design locker in 500 Zeilen "richtigem" VHDL Code 
realisierbar gewesen wäre...

von maxpower (Gast)


Lesenswert?

Hallo, der Code stimmt nicht ganz.

Also c := a und b.

von Hans-Georg L. (h-g-l)


Lesenswert?

Uber das "und" wird sich dein VHDL Kompiler freuen und 
selbstverständlich freundlicherweise ein OR synthetisieren ;)

Aber es soll noch uralte Kompiler geben, die einfach eine Fehlermeldung 
ausgeben.

von maxpower (Gast)


Lesenswert?

Hallo, ich habe nur die Defintion für "c" hingeschrieben.
Im Code kommt das "und" so nicht vor. Es wurde danach gefragt.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Es wurde danach gefragt.
Wo oder von wem?

Es wäre überaus hilfreich und sinnvoll, wenn du keine filettierten 
Codeschnipsel, sondern die ganze Beschreibung ab USE Posten würdest 
(gern auch als Dateianhang mit der Endung .vhs(l)). Bis jetzt weiß man 
ja nicht mal, welchen Typ x hat...

von maxpower (Gast)


Lesenswert?

Warum Codeschnipsel?
Die Aufgabe verlangt, dass man OHNE großen Aufwand schnell ein minimales 
Codebeispiel angibt. Das habe ich gemacht. Aber noch bin ich mir selber 
nicht zu 100% sicher, ob der Code so korrekt ist.

Mein Gedankengang:

Ich habe mir eine Wahrheitstafel gemacht (eigentlich für die vier 
Zustaände nicht nötig, aber dennoch der Vollständigkeit halber). Dann 
habe ich mittels case-when Konstrukt den OR Gatter umgesetzt als rein 
kombinatorische Schaltung. Das war gefragt.

Nun kommen, wie richtig vermutet, sowohl "c" als auch "x" vor. Wie ich 
schon sagte, ist c = a /\ b. Muss in die Sensitivtätsliste nun 
process(a, b) stehen oder process(c)?

von maxpower (Gast)


Lesenswert?

KORREKTUR: c = a \/ b müsste es heißen wegen OR.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

maxpower schrieb:
> Warum Codeschnipsel?
> Die Aufgabe ...
WELCHE denn?
Du wirfst uns da einen Brocken Quellcode ohne vernünftige 
Hintergrundinfo hin und beschwerst dich dann über Fragen?
Ich zitiere, was maxpower schrieb:
>>> Ich soll zB ein OR-Gatter mit Sensitivitätsliste als Code für
>>> eine rein kombinatorische Schaltung angeben.
Das war die GANZE Aufgabenbeschreibung. Und das Ergebnis wäre dann 
sowas:
1
   process (a,b) begin
2
      c <= a or b;
3
   end process;
Denn du schreibst nicht, woher der 2-Bit-Vektor (x) kommt, welchen Typ 
die Daten haben (mit dem Txp bit gäbe es z.B. kein others) usw. usf.

maxpower schrieb:
> Aber noch bin ich mir selber nicht zu 100% sicher,
> ob der Code so korrekt ist.
1. Er ist so sicher nicht korrekt, weil er nicht vollständig ist.
2. Du könntest ihn simulieren.

> Muss in die Sensitivtätsliste nun process(a, b) oder process(c)?
Du meinst x, denn c ist ein Ergebnis aus der Berechnung des Prozesses. 
In die Sensitivliste müssen die Signale, die in der Simulation(!) eine 
Neuberechnung des Prozesses nötig machen. Dein Prozess kann also nur auf 
a und b oder auf x sensitiv sein.

> Muss in die Sensitivtätsliste nun process(a, b) oder process(c)?
1. Die Frage könnte man beantworten, wenn man den Rest der 
Beschreibung sehen könnte.
2. Wenn die Concatenation von a und b zu x in diesem bisher 
unbekannten Prozess gemacht wird, dann müssen a und b in der 
Sensitivliste stehen. Wenn diese Concatenation ausserhalb des 
Prozesses gemacht wird, dann muss x in der Sensitivliste stehen.

> Mein Gedankengang:
Es bringt nichts, wenn du dir Gedanken machst, die uns aber nicht 
mitteilst...

von maxpower (Gast)


Lesenswert?

1
OR : process(x)
2
begin
3
  case x is 
4
   when "00" => 
5
    c <= '0';
6
   when "01" | "10" | "11" => 
7
    c <= '1';
8
   when others => none;
9
  end case
10
end process;
11
12
13
14
OR : process(x)
15
begin
16
  case x is 
17
    when "00" => 
18
      c <= '0';
19
    when others =>
20
      c <= '1';
21
  end case
22
end process;
23
24
25
process (a,b) begin
26
  c <= a or b;
27
end process;

Welches der obigen Codes ist nun die beste Lösung? Da der Code minimal 
sein soll, tendiere ich zum letzten, aber was sagt ihr? Ich dachte, dass 
für eine rein kombinatorische Schaltung das case-when Konstrukt 
verwendet werden müsste.

von Christian R. (supachris)


Lesenswert?

maxpower schrieb:
> Ich dachte, dass
> für eine rein kombinatorische Schaltung das case-when Konstrukt
> verwendet werden müsste

Quatsch. So einfach und übersichtlich wie möglich. Und wieso eigentlich 
einmal x und einmal a,b? Ser Sythesizer macht das dann schon. Die 
anderen Beschreibungen sind einfach unsinnig weil viel zu kompliziert. 
Genausogut könnte man für jede 1 eine e^0 schreiben....

von maxpower (Gast)


Lesenswert?

Gut, dann weiß ich nun Bescheid.
Sorry für die Fragen, aber ich bin kein fortgeschrittener 
Elektrotechnikstudent oder Physiker. Ich mach das Praktikum als Teil 
meines Informatikstudiums. Ich lerne den Einstieg und den Umgang mit 
VHDL. Deshalb zielen die Fragen darauf ab, klein anzufangen.

von berndl (Gast)


Lesenswert?

maxpower schrieb:
> process (a,b) begin
>   c <= a or b;
> end process;

wenn du lobenswerterweise schon mit Signalen anstatt Variablen 
arbeitest, dann kannst du das ganze auch einfach so hinschreiben:
1
  c <= a or b;
Das nennt sich dann 'concurrent' Anweisung und erspart dir sowohl einige 
Zeilen Tipperei als auch die Sensitivitaetsliste...

von Michael W. (Gast)


Lesenswert?

Eigentlich stehen solche Grundlagen in allen VHDL Büchern.
Es gibt gibt auch immer mehr VHDL Bücher.
Und es gibt scheines immer weniger Menschen, die sie lesen. :-)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Markus Wagner schrieb:
> Eigentlich stehen solche Grundlagen in allen VHDL Büchern.
Siehe den Beitrag "Wie habt ihr VHDL gelernt?"

@ maxpower
Ich habe deine PN bekommen, die Lösung der Aufgabe 4 lautet:
Die proc1 ist speichernd, wenn input z.B. 10 oder 11 ist.
Die proc2 speichert nichts, weil im Fall input = 10 oder 11 die 
Defaultzuweisung greift.
Du könntest damit dein Oder-Gatter z.B. so beschreiben:
1
   proc (inp) begin
2
      outp <= '1'; -- Defaultzuweisung
3
      if inp="00" then 
4
         outp <= '0' 
5
      end if;
6
   end process;
Das Und-Gatter sähe so aus:
1
   proc (inp) begin
2
      outp <= '0'; -- Defaultzuweisung
3
      if inp="11" then 
4
         outp <= '1' 
5
      end if;
6
   end process;
Wobei man solche Basisfunktionen in der harten Realität NICHT als 
Prozess beschreiben wird...

von maxpower (Gast)


Lesenswert?

Vielen Dank!

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.