VHDL Zähler vor- und rückwärts

OP #4971744
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.
Beitrag #4971768 wurde von einem Moderator gelöscht.
Moderator (Firma: Titel) Persönliche Seite #4971777
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.
Moderator (Firma: Titel) Persönliche Seite #4971778
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.
Moderator (Firma: Titel) Persönliche Seite #4972088
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.
#4972222
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

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [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 einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.