Forum: FPGA, VHDL & Co. VHDL Zähler vor- und rückwärts


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Sophie G. (sophie_90)


Bewertung
1 lesenswert
nicht lesenswert
Hallo,

bin neu in VHDL eingestiegen und brauche dringend eure Hilfe. Wir sollen 
im Unterricht einen Vor-bzw. Rückwärtszähler (0-50) entwerfen, welcher 
auf einer 7-Segment Anzeige des DE2-70 Board angezeigt wird. Der 
Zählumpfang sowie Zählrichtung muss programmiert werden. Der Zähler soll 
im Sekunden- bzw. Halbsekundentakt zählen. Bevor ich mit der 
Programmierung anfange, brauche ich doch erstmal einen 
Schaltungsentwurf, wie ich mir das vorstelle, eventuell mit Gattern, 
FlipFlops? Hoffe ihr könnt mir einige Anregungen mitgeben.

: Verschoben durch Moderator
Beitrag #4971768 wurde von einem Moderator gelöscht.
von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
1 lesenswert
nicht lesenswert
Sophie G. schrieb:
> Bevor ich mit der Programmierung anfangen
Was bedeutet das D in VHDL?

> brauche ich doch erstmal einen
> Schaltungsentwurf, wie ich mir das vorstelle, eventuell mit Gattern,
> FlipFlops?
Ja, damit wird das aufgebaut.

Ein Tipp: wenn du die Zahlen 00 bis 50 anschließend auf zwei 
Segmentanzeigen darstellen willst, ist es praktisch, wenn du die Zehner 
und die Einer getrennt zählst. Dann musst du nicht hinterher den einen 
Zähler in die zwei Stellen umrechnen.

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Sophie G. schrieb:
> Bevor ich mit der Programmierung anfangen
Was bedeutet das D in VHDL?

> brauche ich doch erstmal einen
> Schaltungsentwurf, wie ich mir das vorstelle, eventuell mit Gattern,
> FlipFlops?
Ja, damit wird das aufgebaut.

Ein Tipp: wenn du die Zahlen 00 bis 50 anschließend auf zwei 
Segmentanzeigen darstellen willst, ist es praktisch, wenn du die Zehner 
und die Einer getrennt zählst. Dann musst du nicht hinterher den einen 
Zähler in die zwei Stellen umrechnen.

Noch ein Tipp: wenn du vorher noch gar nichts mit VHDL gemacht hast, 
dann lass erst mal eine LED blinken. Und simuliere diesen Blinker als 
Fingerübung.

: Bearbeitet durch Moderator
von Sophie G. (sophie_90)


Bewertung
0 lesenswert
nicht lesenswert
Jemand eine Idee wie ich das mit dem Zählumfang realisieren könnte? Das 
mit den zwei Zählern ist eine gute Idee.

von S. R. (svenska)


Bewertung
0 lesenswert
nicht lesenswert
Wenn der Zählumfang eine Zweierpotenz ist, dann passiert das 
automatisch. Ansonsten musst du halt den Zählerstand mit dem Endwert 
vergleichen und entweder weiterzählen oder resetten.

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Sophie G. schrieb:
> Jemand eine Idee wie ich das mit dem Zählumfang realisieren könnte?
Das ist jetzt natürlich mit 2 Zählern wieder umständlich. Also doch nur 
1 Zähler:
1
signal cnt : integer range 0 to 50 := 0;
2
3
process begin
4
  wait until rising_edge(clk);
5
  if countup='1' then -- up
6
     if cnt=maxvalue then
7
        cnt <= 0;
8
     else
9
        cnt <= cnt+1;
10
     end if;
11
  else                -- down
12
     if cnt=0 then
13
        cnt <= maxvalue;
14
     else
15
        cnt <= cnt+-1;
16
     end if;
17
  end if;
18
end process;
Und dahinter die BCD-Umwandlung. Bis 50 geht das ja noch locker als 
Tabelle/Arrray. Oder eben so irgendwie: 
http://www.lothar-miller.de/s9y/categories/44-BCD-Umwandlung...

Oder doch mit 2 Zählern und sich den Maximalwert BCD-codiert geben 
lassen:
1
signal zehner : integer range 0 to 9 := 0;
2
signal einer  : integer range 0 to 9 := 0;
3
4
process begin
5
  wait until rising_edge(clk);
6
  if countup='1' then -- up
7
     if einer=maxeiner and zehner=maxzehner then
8
        zehner <= 0;
9
        einer  <= 0;
10
     elsif einer=9 then
11
        einer  <= 0;
12
        zehner <= zehner+1;
13
      else
14
        einer  <= einer+1;
15
     end if;
16
  else                -- down
17
     if einer=0 and zehner=0 then
18
        zehner <= maxzehner;
19
        einer  <= maxeiner;
20
     elsif einer=0 then
21
        einer  <= 9;
22
        zehner <= zehner-1;
23
     else
24
        einer  <= einer-1;
25
     end if;
26
  end if;
27
end process;
Oder den Max-Wert binär bekommen und dann nach BCD konvertieren, oder, 
oder, oder...

Und mein Tipp: immer erst mal simulieren. Der Simulator ist der 
FPGA-Debugger.

: Bearbeitet durch Moderator
von S. R. (svenska)


Bewertung
0 lesenswert
nicht lesenswert
Oder direkt einen BCD-Zähler nehmen.
1
wait until rising_edge(clk);
2
if zaehler = maxwert_in_bcd then
3
  zahler <= (others => '0');
4
elsif zaehler(3 downto 0) = "1001" then
5
  zaehler <= zaehler + 7;
6
else
7
  zaehler <= zaehler + 1;
8
end if;

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]
  • [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.