Hallo miteinander,
ich bin gerade in der Klausurvorbereitung zur Digitaltechnik und habe 1
oder 2 Probleme, bei denen ich einfach auf keinen gründen Zweig komme
und im Internet sonst nichts gescheites finden kann.
Ich fang einfach mal an und hoffe ihr könnt mir helfen:
1. Ich bin in den Altklausuren oft über einen Ausdruck gestolpert, den
ich nicht richtig zu interpretieren weiß:
WHEN ("100" XOR "001") => w<='0';
mir ist klar, dass wenn die Bedingung "100" XOR "001" erfüllt ist, ist
w=0, allerdings weiß ich nicht recht, wie ich mit "100" XOR "001"
umgehen soll (gilt auch für alle anderen Verknüpfungsarten mit denen ich
in diesem Bezug nicht richtig umzugehen weiß).
2. VHDL selber schreiben in Bezug auf synchrone Schaltwerke:
Ich habe ein Zustandsdiagramm gegeben, an dem auch einige dont cares
angeschrieben waren, ich habe das dann wiefolgt gelöst: (x: IN
STD_LOGIC_VECTOR(1 DOWNTO 0); y= OUT STD_LOGIC VECTOR(1 DOWNTO 0))
... IF rising_edge(clk) THEN x <=xs -- xs = x synchron
CASE state IS -- state auch zugewiesen oben
WHEN z0 => IF xs<= "0-" THEN state <=z0; y<="00";
ELSIF xs<="1-" THEN state <=z1; y<="00";
END IF; ...
Darf ich das so lösen? oder ist das falsch? Mein Prof. hats nämlich
immer so gelöst: ... IF xs(1)<='0' THEN state <=z0; y<="00";
Achja: dann noch eine kurze Frage, wann genau muss ich Default werte
setzen?
Gruß und Dank im Voraus :)
Skyscraper
@Skyscraper91 (Gast)
>WHEN ("100" XOR "001") => w<='0';
Vergleicht zwei Konstanten und weist w den Wert 0 zu.
>mir ist klar, dass wenn die Bedingung "100" XOR "001" erfüllt ist, ist>w=0, allerdings weiß ich nicht recht, wie ich mit "100" XOR "001">umgehen soll (gilt auch für alle anderen Verknüpfungsarten mit denen ich>in diesem Bezug nicht richtig umzugehen weiß).
Dann solltes du das nachholen. Die beiden 3 Bit Konstanten (Vektoren)
werden bitweise verknüpft und es entsteht ein 3 Bit Ergebnisvektor.
Wobei mir diese Schreibweise etwas komisch vorkommt, den VHDL ist KEIN C
und es gibt in VHDL keine implizite Logik, d.h. ein Vergleich muss IMMER
explizit hingeschrieben werden. Ich glaube die Zeile oben hast du falsch
aus dem Gedächtnis hingeschrieben, zum ein Vergleich zweier Konstanten
sinnfrei ist.
>2. VHDL selber schreiben in Bezug auf synchrone Schaltwerke:>Ich habe ein Zustandsdiagramm gegeben, an dem auch einige dont cares>angeschrieben waren, ich habe das dann wiefolgt gelöst: (x: IN>STD_LOGIC_VECTOR(1 DOWNTO 0); y= OUT STD_LOGIC VECTOR(1 DOWNTO 0))>Achja: dann noch eine kurze Frage, wann genau muss ich Default werte>setzen?
Wenn du einen kombinatorischen Prozess hast und dir keine Latches
einhandeln willst.
Naja du musst bedenken, der Prof möchte möglichst viel abbprüfen ob
verstanden wurde, was wir da eigentlich machen. Und dazu macht er halt
ganz verrückte verknüpfungen um den schwierigkeitsgrad zu erhöhen, in
der Praxis würde man das natürlich nie so machen. :)
Aber die Bitweise Verknüpfung war das Stichwort, was mir gefehlt hatte.
Dankeschön!
Wenn mir jetzt noch jemand zu dem dont care Problem was sagen könnte,
bin ich (vorerst) vollstens zufrieden :)
Skyscraper91 schrieb:> 1. Ich bin in den Altklausuren oft über einen Ausdruck gestolpert, den> ich nicht richtig zu interpretieren weiß:>> WHEN ("100" XOR "001") => w<='0';
Ist gleichbedeutend zu
1
WHEN"101"=>w<='0';
> 2. VHDL selber schreiben in Bezug auf synchrone Schaltwerke:> Ich habe ein Zustandsdiagramm gegeben, an dem auch einige dont cares> angeschrieben waren, ich habe das dann wiefolgt gelöst: (x: IN> STD_LOGIC_VECTOR(1 DOWNTO 0); y= OUT STD_LOGIC VECTOR(1 DOWNTO 0))
codebeautify:
1
IFrising_edge(clk)THEN
2
x<=xs;-- xs = x synchron
3
CASEstateIS-- state auch zugewiesen oben
4
WHENz0=>
5
IFxs<="0-"THEN
6
state<=z0;
7
y<="00";
8
ELSIFxs<="1-"THEN
9
state<=z1;
10
y<="00";
11
ENDIF;
> Darf ich das so lösen? oder ist das falsch? Mein Prof. hats nämlich> immer so gelöst: ...
1
IFxs(1)<='0'THEN
2
state<=z0;
3
y<="00";
"0-" kenn ich nicht als korrekte Syntax, machs wie der Prof, dann
erkennt der Prof das als richtig an. Der "kleiner gleich als" Vergleich
"<=" ist sicher so nicht gemeint, oder? Ferner fehlt in deinem Beispiel
End case, end if.
Was willst du konkret anders schreiben als die Lehrvorgabe und warum?
MfG
Zu den Don't-Care Werten:
Der Vergleich funktioniert nicht so, wie du denkst. Da wird überprüft,
ob xs(1) = '-' ist.
Sieh dir mal std_match() an, das sollte die Vergleiche so auswerten, wie
du es vor hast.
Alternativ gibt es ab VHDL-2008 Matching-Case.
Jup das hab ich vergessen. Der Code geht aber noch weiter. Ich bin kein
Freund von "ich akzeptiere das so weil der Prof es so machst", sondern
ich verstehe lieber genau was ich da mache, was dann oft von der
Vorgabe abweicht.
Ich habe in der Vorlesung gelernt, dass solche Zuweisungen mit kleiner
gleich h gemacht werden, also a<=b ist eine direkte Verknüpfung von A
und b.
Frag ich mal so, wie kann ich denn alternativ ein dont Care angeben?
Oh hab den Beitrag über mir übersehen - sorry.
Genau das habe ich gesucht :) Super! Danke euch allen für die flotte
Hilfe, werde mich gerne wieder an euch wenden, wenn ich auf Probleme
stoßen sollte!
Gruß und bis bald :)
Andi F. schrieb:> Ein Zweischneidiges Vorgehen.> Beitrag "Re: Genratorpolynom"
Zu meiner Verteidigung möchte ich sagen: Der Prof ist nicht immer in
Reichweite und gerade bei kleineren Problemen, die zum Verständnis
fehlen, möchte ich nicht die ganze nachfragen. Außerdem habe ich viele
Stunden darüber nachgedacht und gerätselt aber kam auf keinen grünen
Zweit und bevor ich was falsches lerne, frag ich lieber fachkundige
Menschen. :)
Ich hoffe ich darf trotzdem nochmal ne Frage stellen zu den DEFAULT
Werten:
Bin da nochmal über was gestolpert: Zunächst der Code Auszug:
x IN 2 Bit breit, y OUT 3 Bit breit, z Zustand Hilfssignal
[...] PROCESS (clk) IS BEGIN
IF rising_edge(clk) THEN y<="000";
CASE z IS
WHEN za => IF (x(0) XOR x(1)) ='1' THEN z <= zc; y(1)<=x(0) XOR x(1)
--also falls x=10 oder 01, ist z=zc und y=010
ELSIF x>=0 THEN z<=zd; y(1)<= x(0) XOR x(1); y(2) <= x(0) XNOR x(1);
--aus Kontext weiter unten ergibt sich, dass hier x=00 gemeint ist,
--allerdings frag ich mich, ob sich die Bit Zuweisungen nun auf den
--DEFAULT Wert beziehen, oder auf das zuletzt zugewiesene y, da ja
IF
--eine rein sequentielle Anweisung ist - beides passt hier aber y wäre
--dann y=100
[...]
weiter unten das gleiche Spiel
[...]
WHEN OTHERS => y<="111";
--Bezug auf obige case Anweisung, noch im Process
IF x(1) ='1' THEN
IF x(0)='0 THEN z<=za; --also x=10 und y=111
ELSE z<=zb; y(1) <= '0'; END IF; --x=11, y=101
ELSE
IF x(0)='0' THEN z<=zc; y(2) <='0'; --x=00, y=011
ELSE y(0)='0'; END IF; --x=01, y=110
END IF;
[...]
Beim Tippen verstanden: Im 2ten Teil wird gesagt wenn andere, dann
erstmal y=111, für jeden Fall der noch eintreten kann, was dann bitweise
geändert wird in den einzelnen Fällen wird danach beschrieben, aber y
ist erstmal immer 111, richtig?
Frag zum ersten Teil bleibt aber, aber ich schätze, dass es hier um das
letzte y handelt, da ein Process ja auch sequentiell durchlaufen wird.
Entschuldigt die Ausführlichkeit, ich neige dazu etwas auszuschweifen.
Gruß
Skyscraper91 schrieb:> [...]> [...]
Wenn du da jetz noch statt den Punkten vhdl und /vhdl reinschreibst,
dann wird der VHDL Code toll gesyntaxhighlighted...
> Frag zum ersten Teil bleibt aber, aber ich schätze, dass es hier um das> letzte y handelt, da ein Process ja auch sequentiell durchlaufen wird.
Dieses "sequentiell Durchlaufen" ist irgendwie um den heißen Brei
herumgeredet. Ein Prozess mag zwar vom Simulator von oben nach unten
berechnet werden. In der realen Hardware ist er aber immer komplett und
parallel abgebildet.
Und dann muss man sich nur zwei Sachen merken:
1. Die letzte Zuweisung an ein Signal "gewinnt". In der Realität wird
die parallele Logik beim Ermitteln des gültigen Werts ein paar kurze
Glitches produzieren.
2. Wenn es in einem Prozess einen Pfad ohne (Default-)Zuweisung gibt,
dann muss das Signal speichern können. Je nachdem, ob es dann ein
getakteter oder ein kombinatorischer Prozess ist, ergibt sich daraus ein
Flipflop (das ist ok) oder ein Latch (das ist böse, weil meist ein
Fehler!).
Dir muss klar sein, dass VHDL keine Programmiersprache, sondern eine
Hardwarebeschreibungssprache ist. Und um etwas beschreiben zu können,
musst du vorher eine Vorstellung oder ein "Bild" davon im Kopf haben. Du
musst also in Hardware denken und anschließend diese Hardware mit den
zulässigen Syntaxelementen von VHDL beschreiben. Und: bestenfalls 5% von
VHDL kannst du für die Synthese verwenden. Das Beispiel mit "0-" ist
zumindest eines, bei dem sich die Simulation und die Realität
unterschiedlich verhalten werden! Denn für den simulator ist "0-" nur
genau dann wahr, wenn im Bit 0 explizit der Wert '-' auftritt, für die
Synthese wird das Bit 0 ignoriert... :-o
Beitrag "Re: Case mit don't care"Skyscraper91 schrieb:> Darf ich das so lösen? oder ist das falsch?
Poste bitte nicht nur solche Codeschnipsel, wo sich das eigentlich
Relevante durchaus noch ausserhalb verstecken kann.
BTW
Diesen Kommentar verstehe ich nicht:
Lothar Miller schrieb:> Und um etwas beschreiben zu können,> musst du vorher eine Vorstellung oder ein "Bild" davon im Kopf haben.Skyscraper91 schrieb:> 1. Ich bin in den Altklausuren oft über einen Ausdruck gestolpert, den> ich nicht richtig zu interpretieren weiß:
Lothar sagt definitiv nichts falsches, nur hat der TO und ich das
Problem, dass wir das "Bild im Kopf des Professors" erkennen müssen aus
der uns vorliegenden VHDL Beschreibung.
Für mich jedenfalls ist dieses "Bild" nicht erkennbar... (Ich bin ja
auch ein dummer Entwickler, da ich ohne Planungsskizzen, Kommentare und
ausführliche Signalnamen keine Ahnung habe, was ich eigentlich tue) :-)
Christoph Z. schrieb:> Lothar Miller schrieb:> Lothar sagt definitiv nichts falsches, nur hat der TO und ich das> Problem, dass wir das "Bild im Kopf des Professors" erkennen müssen aus> der uns vorliegenden VHDL Beschreibung.
Die dem TO vorliegende Beschreibung ist nicht die die Dir vorliegt.
Der TO gibt die Aufgabenbeschreibung nur bruchstückhaft wieder und
fokussiert sich sträflicherweise auf VHDL-Konstrukte.
Lothar weist IMHO daraufhin das es hier um die korrekte
(synthetisierbare) Beschreibung einer Hardware geht und nicht um das
(akademisch) schöne Niederschreiben in VHDL unter Ausnutzung aller
syntaktisch erlaubten Raffinessen.
MfG,