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


von Sophie G. (sophie_90)


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. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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)


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)


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. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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)


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;

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.