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

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren