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
casexis
2
when"00"=>x:="0";
3
when"01"|"10"|"11"=>c:="1";
4
whenothers=>none;
5
endcase
Ist das richtig? Wo ist da die Sensitivitätsliste?
MfG
maxpower
maxpower schrieb:> case x is> when "00" => x := "0";> when "01" | "10" | "11" => c := "1";> when others => none;> end caseDAS ist so ziemlich die schlimmste Beschreibung eines or die ich je
gesehen hab =-O
1
C:=AorB;--das hier wäre ja auch viel zu einfach...
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 :-)
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
casexis
2
when"00"=>c:="0";
3
when"01"|"10"|"11"=>c:="1";
4
whenothers=>none;
5
endcase
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
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.
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 VHDLnicht zu nutzen.
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
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!
> 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...
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.
> 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...
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)?
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<=aorb;
3
endprocess;
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...
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.
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....
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.
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<=aorb;
Das nennt sich dann 'concurrent' Anweisung und erspart dir sowohl einige
Zeilen Tipperei als auch die Sensitivitaetsliste...
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. :-)
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
ifinp="00"then
4
outp<='0'
5
endif;
6
endprocess;
Das Und-Gatter sähe so aus:
1
proc(inp)begin
2
outp<='0';-- Defaultzuweisung
3
ifinp="11"then
4
outp<='1'
5
endif;
6
endprocess;
Wobei man solche Basisfunktionen in der harten Realität NICHT als
Prozess beschreiben wird...