Forum: FPGA, VHDL & Co. Klausurvorbereitung Digitaltechnik (VHDL)


von Skyscraper91 (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@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.

von Skyscraper91 (Gast)


Lesenswert?

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 :)

von Fpgakuechle K. (Gast)


Lesenswert?

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

von Alexander F. (alexf91)


Lesenswert?

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.

von Skyscraper91 (Gast)


Lesenswert?

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?

von Skyscraper91 (Gast)


Lesenswert?

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 :)

von Andi (chefdesigner)


Lesenswert?

Skyscraper91 schrieb:
> werde mich gerne wieder an euch wenden, wenn ich auf Probleme
> stoßen sollte!
Ein Zweischneidiges Vorgehen.
Beitrag "Re: Genratorpolynom"

von Skyscraper91 (Gast)


Lesenswert?

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ß

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


Lesenswert?

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

von Christoph Z. (christophz)


Lesenswert?

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) :-)

von Fpgakuechle K. (Gast)


Lesenswert?

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