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.
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.
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
Jemand eine Idee wie ich das mit dem Zählumfang realisieren könnte? Das mit den zwei Zählern ist eine gute Idee.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.