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 | IF rising_edge(clk) THEN |
2 | x <= xs; -- xs = x synchron |
3 | CASE state IS -- state auch zugewiesen oben |
4 | WHEN z0 => |
5 | IF xs <= "0-" THEN |
6 | state <= z0; |
7 | y <= "00"; |
8 | ELSIF xs <= "1-" THEN |
9 | state <= z1; |
10 | y <= "00"; |
11 | END IF; |
> Darf ich das so lösen? oder ist das falsch? Mein Prof. hats nämlich > immer so gelöst: ...
1 | IF xs(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 :)
Skyscraper91 schrieb: > werde mich gerne wieder an euch wenden, wenn ich auf Probleme > stoßen sollte! Ein Zweischneidiges Vorgehen. Beitrag "Re: Genratorpolynom"
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:
1 | x <= xs; -- xs = x synchron |
Und die Frage ist allgemein, ob eine einziges Flipflop hier überhaupt ausreicht: http://www.lothar-miller.de/s9y/categories/35-Einsynchronisieren
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,
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.