www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Newbie - 7-Segment-Zähler funktioniert nicht


Autor: Lasse S. (cowz) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe gestern angefangen, VHDL zu lernen. Programmieren tue ich auf 
einem Xilinx CPDL (9536).

Nun funktioniert mein Programm nicht und ich hoffe auf eure Hilfe, da 
ich den Fehler nicht finde.

Ziel des Programmes ist es, bei jeder positiven Flanke auf einem 
Zähleingang eine Nummer höher zu zählen und diese auf einem 
7-Segment-Display auszugeben. Den Zähleingang betreibe ich mit nem NE555 
mit etwa 1Hz.

Das Problem: Er zählt nicht 1, 2, 3, 4, ... sondern überspringt einige 
Zahlen und springt wohl auch ab und zu in das "when others".
entity SegCounter is
    Port ( clk : in  STD_LOGIC;
           SEG : out  STD_LOGIC_VECTOR (6 downto 0));
end SegCounter;

architecture Behavioral of SegCounter is
  signal number : integer range 0 to 10 := 0;
begin

  CountUp : process (clk)
  begin
    if rising_edge(clk) then
      number <= number + 1;
      if (number = 10) then
        number <= 0;
      end if;
      
      case number is
        when 0      => SEG <= "0000001";--"1110111";
        when 1      => SEG <= "0000011";--"0100100";
        when 2      => SEG <= "0000111";--"1101011";
        when 3      => SEG <= "0001111";--"1101101";
        when 4      => SEG <= "0011111";--"0111100";
        when 5      => SEG <= "0111111";--"1011101";
        when 6      => SEG <= "1111110";--"1011111";
        when 7      => SEG <= "1111100";--"1110100";
        when 8      => SEG <= "1111000";--"1111111";
        when 9      => SEG <= "1110000";--"1111101";
        when others => SEG <= "1111111";
      end case;      
    end if;
  end process;

end Behavioral;
Ich hoffe, ihr könnt mir zeigen, was an dem Code falsch ist. Gerne nehme 
ich auch Änderungsvorschläge der radikaleren Art auf ;) (Vielleicht 
sollte man das ganz anders angehen, ohne process o.ä....) Natürlich 
hoffe ich auch zu verstehen, warum mein Programm nicht ordentlich zählt.

Grüße, Lasse

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Woher stammt dein Zaehleingang? rising_edge kann man ausschliesslich 
fuer Taktsignale verwenden, nicht fuer irgendwelche Eingangsdaten.

Autor: Lasse S. (cowz) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
clk liegt an GCK1 an (Pin 5 im PLCC-44 Gehäuse)

Was ich noch vergessen hatte: Die auskommentierten Segmentangaben sind 
dafür da, dass er wirklich die Zahlen anzeigt. Zum Testen nehme ich die 
anderen (damit ich micht nicht bei den Segmentangaben vertan haben 
kann).

Gruß, Lasse

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ist clk denn genau? Ein Taster? Ein Quarz?

Autor: Lasse S. (cowz) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein NE555.

Sollte hier etwas prellen, so würde er ja trotzdem nie in den "when 
others" case kommen, sondern nur zu schnell zwischen den Zahlen weiter 
schalten..

edit: Wenn ich mir den Clock-Eingang und das Zählverhalten angucke, 
scheint er bei steigenden und bei fallenden Flanken weiter zu zählen. 
Langsam blicke ich das nicht mehr ;)

edit2: Und wenn er erstmal in dem "when others" Fall ist (alle Segmente 
an), dauert es ein paar Takte (Also Flankenwechsel am Zähleingang), bis 
er da wieder rauskommt.

Gruß, Lasse

Autor: Roger Steiner (edge)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lasse S. wrote:
> Sollte hier etwas prellen, so würde er ja trotzdem nie in den "when
> others" case kommen, sondern nur zu schnell zwischen den Zahlen weiter
> schalten..

nein, number ist ein signal und nimmt den neuen Zustand nach abarbeitung 
des process an. somit ist number noch 10 wenns in den case reingeht.
Du solltest deine Abfrage auf 9 aendern.

Cheers, Roger

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Zuweisung "<= 0" tritt erst beim nächsten Aufruf des Prozesses in 
Kraft, du zählst also von 0 bis 10 statt von 0 bis 9 und erreichst somit 
den others-Zustand. Das "Prellen" kann passieren wenn die Flanken des 
Clock-Signals zu flach und verrauscht sind.

Autor: Lasse S. (cowz) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Hinweis mit dem Signal. Besser wäre es dann hier eine 
Variable zu nutzen? Also einfach in der Zeile mit "signal number : " das 
hier schreiben: "variable number : "... klappt das dann?

Ich hatte gerade einen NE555 genommen, da ich hoffte, dass da kein 
Prellen auftritt. Muss ich bei dem IC auch mit Prellen rechnen? Wenn ja, 
wie kann ich das lösen? (in VHDL bin ich noch nicht fit genug, das weg 
zu programmieren... Sonst würde mir als einfache Lösung noch ein 
R-C-Glied einfallen, was allerdings nicht gerade für eine steilere 
Flanke sorgen dürfte, oder? Auf einen weiteren IC würde ich gerne 
verzichten (also lieber keinen Schmitt-Trigger...)

edit: mit variable muss das dann auch nach zwischen "CountUp process" 
und "begin" und statt "number <=" schreibe ich dann "number :=". richtig 
so?

Gruß, Lasse

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Lasse S. (cowz)

>Ziel des Programmes ist es, bei jeder positiven Flanke auf einem
>Zähleingang eine Nummer höher zu zählen und diese auf einem
>7-Segment-Display auszugeben. Den Zähleingang betreibe ich mit nem NE555
>mit etwa 1Hz.

Naja, grenzwertig. Die Flanken vom NE555 sind recht flach, 200ns 
Anstiegszeit oder so.

>Das Problem: Er zählt nicht 1, 2, 3, 4, ... sondern überspringt einige
>Zahlen und springt wohl auch ab und zu in das "when others".

Logisch, dein Zähler zählt ja auch 0,1,2,3,4,5,6,7,8,9,10,0,...

Das mit den unregelmässigen Sprüngen liegt wahrscheinlich am grausamen 
Hardwareaufbau, Steckbrett ohen 100nF Kondenatoren. Hab ich Recht? ;-)

MFG
Falk

Autor: Roger Steiner (edge)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lasse S. wrote:
> Das Problem: Er zählt nicht 1, 2, 3, 4, ... sondern überspringt einige
> Zahlen und springt wohl auch ab und zu in das "when others".
>
> Wenn ich mir den Clock-Eingang und das Zählverhalten angucke,
> scheint er bei steigenden und bei fallenden Flanken weiter zu zählen.
> Langsam blicke ich das nicht mehr ;)

Klingt nach unsauberem Takt, schalt doch mal ein 74HC14 Gatter 
dazwischen, das hat eine schnellere rise/fall time als dein NE555.
Und ueberpruefe dein pinning.

Denn sonst ist dein code ja ok.

> Sonst würde mir als einfache Lösung noch ein R-C-Glied einfallen, was allerdings 
nicht gerade für eine steilere Flanke sorgen dürfte, oder?

um Himmels Willen, NEIN!

> Auf einen weiteren IC würde ich gerne verzichten (also lieber keinen 
Schmitt-Trigger...)

Bleibt dir nichts anderes uebrig.

Cheers, Roger

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Lasse S. (cowz)

>Danke für den Hinweis mit dem Signal. Besser wäre es dann hier eine
>Variable zu nutzen?

NEIN! Du musst auch number=9 prüfen. Siehe VHDL.

>Prellen auftritt. Muss ich bei dem IC auch mit Prellen rechnen?

Prellen nicht, aber schnarchlangsame Flanken.

>Wenn ja, wie kann ich das lösen?

Nimm einen 74HC14 als Oszillator.

>R-C-Glied einfallen,

AHHHH!!! NEIN!

>verzichten (also lieber keinen Schmitt-Trigger...)

DOCH!

MFG
Falk

Autor: Lasse S. (cowz) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner wrote:

> Logisch, dein Zähler zählt ja auch 0,1,2,3,4,5,6,7,8,9,10,0,...

Ja, das Problem wurde ja schon angesprochen. Habe das jetzt mit der 
Variable gelöst (wenn es denn

> Das mit den unregelmässigen Sprüngen liegt wahrscheinlich am grausamen
> Hardwareaufbau, Steckbrett ohen 100nF Kondenatoren. Hab ich Recht? ;-)

Steckbrett ja, 100nF hab ich eigentlich recht viele. Nur der NE555 hatte 
bisher noch keinen. Kommt jetzt aber.


Roger Steiner wrote:
> Klingt nach unsauberem Takt, schalt doch mal ein 74HC14 Gatter
> dazwischen, das hat eine schnellere rise/fall time als dein NE555.
> Und ueberpruefe dein pinning.
Das Pinning sollte stimmen, es funktioniert ja auch ansich. Nur eben der 
komische Zählfehler.

> Denn sonst ist dein code ja ok.
Das ist sehr beruhigend :) Darauf kommt es nämlich im Moment an, beim 
Lernen von VHDL.

Falk Brunner wrote:
> NEIN!
Wieso? Wenn ich eine Variable benutze, wird die doch sofort gesetzt und 
kann "daher in einem Prozess gleich weiterverwendet werden", oder doch 
nicht?

> AHHHH!!! NEIN! [...] DOCH!
ok ;) Einen 7414 habe ich gerade nicht da, funktioniert auch ein 7404?

Gruß, Lasse

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Lasse S. (cowz)

>Ja, das Problem wurde ja schon angesprochen. Habe das jetzt mit der
>Variable gelöst (wenn es denn

Das solltest du lassen, Lasse ;-)
Warum?

http://www.mikrocontroller.net/articles/VHDL#Grund...

>> NEIN!
>Wieso? Wenn ich eine Variable benutze, wird die doch sofort gesetzt und
>kann "daher in einem Prozess gleich weiterverwendet werden", oder doch
>nicht?

Jain.

Siehe oben. Du musst erstmal die Grundlagen verstehen. Variablen kommen 
später.

>ok ;) Einen 7414 habe ich gerade nicht da, funktioniert auch ein 7404?

Mit der richtigen Schaltung ja. Die braucht drei gateer und einen 
Kondensator. Hab jetzt aber keinen Link papat.

MFG
Falk

Autor: Lasse S. (cowz) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

juhu! jetzt funktioniert es!

Ich habe statt dem NE555 einen Quarzoszillator angeschlossen. Es schien 
also wirklich an dem Taktgeber zu liegen.

Vielen Dank!

Jetzt muss ich mir nur noch angucken, wie ich den Takt teilen kann, und 
zwar geschickter als mit zwei "Hochzähl"-Schleifen. Aber da finde ich 
bestimmt was im Wiki.

Vielen Dank für eure Hilfe :)

Gruß, Lasse

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.