Forum: FPGA, VHDL & Co. Prüfung VHDL-Code


von Ralph H. (guru)


Lesenswert?

Ich habe hier in VDHL etwas programmiert, wo ihr mal bitte drüberschauen 
sollt. Aufgabenstellung ist folgende.. ein BinärZähler (D41_42) zählt 
bis zum Zählerstand 88 läuft und beginnt dann wieder von vorn.
Das Signal DG13 soll bei Zählerstand 2 '0' und ab Zählerstand 66 bis 2 
='1' sein. Hier die VHDL Code dazu
1
DG13  <= '1'  when QD41_42 = 66        -- Setzen bei Zählerstand 66
2
            else '0' when QD41_42 = 2; -- rücksetzen bei Zählerstand 2
Das sollte doch so sehr einfach gehen oder ? Die Bibliothek 
IEEE.STD_LOGIC_unsigned.ALL ist eingebunden, weil ich sie ohnehin 
brauche.
Vielen Dank und Happy New Year !

von Tron (Gast)


Lesenswert?

Dein Zähler ist aber auch bei 3 bis 65 = "0". Bei der schwammig 
formulierten Aufgabe würde ich in dem fall ein "U" zuweisen

von Christian R. (supachris)


Lesenswert?

Vielleicht so:
1
Process(CLK)
2
Begin
3
  if rising_edge(CLK)then
4
    if QD41_42 = 65 then DG13 <= '1';
5
    elsif QD41_42 = 1 then DG13 <= '0';
6
    end if;
7
  end if;
8
End Process;

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


Lesenswert?

Ralph H. schrieb:
> Die Bibliothek IEEE.STD_LOGIC_unsigned.ALL ist eingebunden,
> weil ich sie ohnehin brauche.
Wofür brauchst du die denn ohnehin?

> DG13  <= '1'  when QD41_42 = 66        -- Setzen bei Zählerstand 66
>             else '0' when QD41_42 = 2; -- rücksetzen bei Zählerstand 2
Das ist ein Latch. Und damit grundsätzlich zu hinterfragen!
Denn was passiert, wenn da beim Zählerumschalten mal kurz ein Glitch 
auftritt, der entweder 66 oder 2 ist?

Aber du hast mit deinen Zahlenkombinationen vermutlich Glück, denn mit 
den Bitmustern
 2 = 0000 0010
66 = 0100 0010
88 = 0101 1000
kann dir eigentlich nichts (schlimmes) passieren.

Natürlich kann beim Zählerüberlauf von  3 = 0000 0011
nach                                    4 = 0000 0100
mal kurz die 2 auftauchen
oder auch beim Überlauf von  7 = 0000 0111
nach                         8 = 0000 1000
Aber weil damit dann nur die '0' nochmal gesetzt wird, kann dir hier 
zufälligerweise nicht viel passieren...

Nur wenn du jetzt meinst, die Idee ist toll und mal andere Werte 
verwendest, dann können dir solche kurzen Glitches schnell mal die Suppe 
versalzen.

Christian R. schrieb:
> Vielleicht so: ...
So würde ich das auch machen. Das ist auf jeden Fall sicher, denn 
irgendwelche Glitches werden sich bei der nächsten Taktflanke sicher 
beruhigt haben...

von Sym (Gast)


Lesenswert?

Wenn man asynchrone Logik baut, so sollte man in der Regel einen Grund 
dafür haben bzw. auch verstanden haben, was da wirklich herauskommt. 
Leider gibt es viele VHDL und Verilog Sourcecodes im Internet, wo 
unsaubere Dinge gemacht werden, die oftmals aufgrund impliziter Annahmen 
erst funktionieren.

Mit einem synchronen Design und genau einem Takt kann nicht wirklich 
etwas passieren, wenn man gewisse Regeln beachtet. Je mehr Features man 
verwendet, deso besser muss mich sich aber damit auskennen.

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.