Forum: FPGA, VHDL & Co. Eine Uhr in VHDL (für ein Basys-Board Xinlinx Spartan 3E 100TQ144) )


von VHDL-Noob (Gast)


Lesenswert?

Hallo Mikrocontroller-Gemeinde,

im Rahmen einer Laborarbeit soll ich auf dem oben genannten Board 
(BASYS-Board: Xilinx Spartan3E-100 TQ144) eine Uhr in VHDL über Xilinx 
ISE erstellen. Nun liegt mein eigentliches Problem darin, dass ich was 
das angeht von Tuten und Trompheten keine Ahnung habe, was weniger 
schlimm wäre da es mich eigentlich sehr interessiert, aber mir so 
langsam die Zeit davon läuft.

Nun zur Aufgabe: Die Aufgabe ist es Uhr zu erstellen, die wahlweise 
Stunde und Minuten und auf Knopfdruck Minuten und Sekunden auf der 
4-stellingen 7-Segment-Anzeige ausgibt.

Zudem sollen Stunden, Minuten und Sekunden einstellbar sein.

Mein jetziger Stand ist recht mau, da ich schon für den Vorteiler der 
mir den Takt von 100 MHz auf 1 Hz teilt inzwischen schon 2 Wochen 
gebraucht habe, da ich im Studium noch ziemlich viel anderes Zeugs um 
die Ohren habe.

Naja lange Rede kurze Sinn, um ehrlich zu sein habe ich keinen blassen 
Schimmer wie ich jetzt weitermachen soll bzw. wie so eine Uhr im 
allgemeinen Aufgebaut ist (Blockschaltbild) und wollte mal fragen ob 
jemand für so etwas mal ein Beispiel zur Hand hätte.

Grüße

Der VHDL-Noob

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

VHDL-Noob schrieb im Beitrag #2678188:
> Naja lange Rede kurze Sinn, um ehrlich zu sein habe ich keinen blassen
> Schimmer wie ich jetzt weitermachen soll
Da könnte man weiterhelfen. Man müsst nur sehen, wie weit du schon bist.

> bzw. wie so eine Uhr im allgemeinen Aufgebaut ist (Blockschaltbild)
Eine Uhr?
Die ZÄHLT eigentlich nur die Sekunden und bringt zum richtigen Zeitpunkt 
einen ÜBERTRAG in die nächste Stelle. Das wars.

> und wollte mal fragen ob
> jemand für so etwas mal ein Beispiel zur Hand hätte.
Ja, sogar ganz hier in der Nähe, noch keine Woche alt. Incl. 
Schaltjahrberechnung...
Du musst dir, wenn du von Tuten&Blasen keine Ahnung hast, aber 
wenigstens die Zeit nehmen, ein wenig zu suchen. Schon mit durchklicken 
(also ganz ohne die Suchfunktion) des Forums solltest du innerhalb einer 
Minute (oder zwei) den Thread finden.

> Trompheten
Der hat mal Niveau... ;-)

von VHDL-Noob (Gast)


Lesenswert?

Also erstmal danke für die Schnelle Antwort! Hatte es mal auf die 
Schnelle mit der Suche nach "Uhr" versucht und nichts passendes zu 
meinem Problem gefunden, deswegen war ich so frech nen neuen Thread zu 
eröffnen.

Aktueller Stand ist, dass ich einen Vorteiler hab der mir die 100 Mhz 
die vom Prozessor kommen in 1 Hz wandelt.

Die Uhr soll Modulweise erstellt werden. Somit habe ich mein erstes 
Modul. Was wäre denn der nächste Sinnvolle Schritt? Also was wäre denn 
das sinnvolle nächste Modul?

Sorry wenn ich etwas dumm frage nur habe ich auf erneute Suche immer 
noch nichts passendes gefunden.

von VHDL-Noob (Gast)


Lesenswert?

PS: Tut mir Leid, dass ich mich vertippt habe ;) Muss natürlich 
"Trompeten" heißen!

von voodoofrei (Gast)


Lesenswert?

VHDL-Noob schrieb im Beitrag #2678260:
> Aktueller Stand ist, dass ich einen Vorteiler hab der mir die 100 Mhz
> die vom Prozessor kommen in 1 Hz wandelt.

Jetzt brauchst du nur noch einen Zähler für:
Die Sekunden
Die Minuten
Die Stunden

und einen 4-stelligen 7-Segment-Wandler, der dir im Sekundentakt die 
Anzeige aktualisiert.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

VHDL-Noob schrieb im Beitrag #2678260:
> Was wäre denn der nächste Sinnvolle Schritt?
Das Forum durchklicken.... ;-)

> Also was wäre denn das sinnvolle nächste Modul?
Ein Sekunden-Einer-Zähler, der an den Sekunden-Zehner-Zähler einen 
Übertrag meldet, der an den Minuten-Einer-Zähler einen Übertrag 
weitergibt usw.

Und stellen kannst du die Uhr z.B. indem du über eine passende logische 
Verknüpfung einen Minutenübertrag öfter als 1 mal pro Minute 
erzeugst...

von VHDL-Noob (Gast)


Lesenswert?

Alles klar, dann werde ich es mal so versuchen. Vielen Dank für die 
Antworten.

von Gustl B. (-gb-)


Lesenswert?

Ich will Dich nicht deprimieren, aber der Taktgeber auf dem Basys ist 
nicht sonderlich genau. Ich bekomme mehrere Sekunden bis zu knapp einer 
Minute Abweichung von der Funkuhr an einem Tag. Auf einem Nexys2 mit so 
ziemlich gleichem Code bleibt die Abweichung sogar nach einer Woche noch 
unter einer Sekunde.

Als Hauptaufgabe sehe ich auch eher weniger den Zähler, sondern die 
Ansteuerung der 7-Segment-Anzeigen. Mach das erstmal und versuche dort 
zuerst irgendetwas hinzuschreiben, z.B. "1234".

Nach dem Du dann mal alle Zahlen anzeigen lassen kannst, und zahlen sind 
wichtig, dann ist das nächste Problem eine binäre Zahl als Dezimalzahl 
anzuzeigen. Also versuche dann ein beliebiges Bitmuster das Du über die 
Schiebeschalter einstellen kannst (0 ... 255) auf den Anzeigen 
darzustellen.

Und dann erst kommt die Uhr, also ein paar Zähler die Bitmuster liefert 
die dann angezeigt werden.

Konkret brauchst Du ein paar "Bauteile" die Du öfters verwenden wollen 
wirst:


"Zahl" das bekommt eine lange Binärzahl, also z.B. Minuten, Sekunden, 
... und zerlegt z.B. Minuten in die Einerstelle und die Zehnerstelle des 
Dezimalsystems. Die Ergebnisse gehen an Ziffer.


"Ziffer" das bekommt ein Bitmuster von "0000" zu "1001" also 0 bis 9 und 
gibt das entsprechende Bitmuster für die 7-Segment-Anzeige raus. Dafür 
kann man gut Karnaugh-Diagramme nutzen. 
http://de.wikipedia.org/wiki/Karnaugh-Veitch-Diagramm


Also viel Spaß, das ist ein sehr lehrreiches Projekt!

von Marius W. (mw1987)


Lesenswert?

Gustl Buheitel schrieb:
> Dafür
> kann man gut Karnaugh-Diagramme nutzen.
> http://de.wikipedia.org/wiki/Karnaugh-Veitch-Diagramm

Nutzt die überhaupt noch ernsthaft jemand? Mit VHDL oder Verilog nimmt 
einem die Arbeit doch der Synthesizer ab. Ist in meinen Augen 
verschwendete Zeit...

MfG
Marius

von Gustl B. (-gb-)


Lesenswert?

An der FH haben wir so beschrieben wie Ziffern auf 7-Segment-Anzeigen 
dargestellt werden. Aber klar man kann auch einfach jede Ziffer einzeln 
beschreiben und die generierte Logik ist am Ende vermutlich identisch.

Ich dachte nur, weil man das mal gesehen haben sollte.

von Duke Scarring (Gast)


Lesenswert?

Marius Wensing schrieb:
>> http://de.wikipedia.org/wiki/Karnaugh-Veitch-Diagramm
>
> Nutzt die überhaupt noch ernsthaft jemand?
Nein ich denke nicht.

> Mit VHDL oder Verilog nimmt
> einem die Arbeit doch der Synthesizer ab.
Jepp.

> Ist in meinen Augen
> verschwendete Zeit...
Das wiederum sehe ich anders. Ich findes es genauso wichtig, wie z.B. 
mal in Assembler reingeschnuppert zu haben, um ein Gefühl dafür zu 
bekommen, was hinter den Kulissen passiert.

Duke

von VHDL-Noob (Gast)


Lesenswert?

Also ich hab jetzt mal versucht nen Zähler zu schreiben, der von 0 bis 9 
zählt und mir erstmal die Zahlen binär auf den LEDs ausgibt. Leider 
kommt bei der Simulation des Ganzen nur raus, dass meine LEDs( q0-q3) 
nicht definiert sind. Weis jemand von euch abhilfe?

Code sieht wie folgt aus:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_ARITH.ALL;
4
use IEEE.STD_LOGIC_UNSIGNED.ALL;
5
6
7
entity zaehl_zehn is
8
    Port ( mclock : in  STD_LOGIC;
9
           clk_en : in  STD_LOGIC;
10
           reset : in  STD_LOGIC;
11
           stell : in  STD_LOGIC;
12
        zehn_aus : out  STD_LOGIC;
13
           q0 : out  STD_LOGIC;
14
           q1 : out  STD_LOGIC;
15
           q2 : out  STD_LOGIC;
16
           q3 : out  STD_LOGIC);
17
end zaehl_zehn;
18
19
architecture Behavioral of zaehl_zehn is
20
signal count : std_logic_vector(3 downto 0);
21
22
begin
23
  process (mclock, reset) 
24
25
26
begin
27
28
if reset='1' then 
29
      count <= (others => '0');
30
    zehn_aus <= '0';
31
   elsif (clk_en='1' and clk_en'event) or (stell='1' and mclock'event) then
32
         count <= count + 1;
33
      
34
      if count = "0000" then
35
      q0 <= '0';
36
      q1 <= '0';
37
      q2 <= '0';
38
      q3 <= '0';
39
      end if;
40
      
41
      if count = "0001" then
42
      q0 <= '1';
43
      q1 <= '0';
44
      q2 <= '0';
45
      q3 <= '0';
46
      end if;
47
      
48
      if count = "0010" then
49
      q0 <= '0';
50
      q1 <= '1';
51
      q2 <= '0';
52
      q3 <= '0';
53
      end if;
54
      
55
      if count = "0011" then
56
      q0 <= '1';
57
      q1 <= '1';
58
      q2 <= '0';
59
      q3 <= '0';
60
      end if;
61
      
62
      if count = "0100" then
63
      q0 <= '0';
64
      q1 <= '0';
65
      q2 <= '1';
66
      q3 <= '0';
67
      end if;
68
      
69
      if count = "0101" then
70
      q0 <= '1';
71
      q1 <= '0';
72
      q2 <= '1';
73
      q3 <= '0';
74
      end if;
75
      
76
      if count = "0110" then
77
      q0 <= '0';
78
      q1 <= '1';
79
      q2 <= '1';
80
      q3 <= '0';
81
      end if;
82
      
83
      if count = "0111" then
84
      q0 <= '0';
85
      q1 <= '1';
86
      q2 <= '1';
87
      q3 <= '1';
88
      end if;
89
      
90
      if count = "1000" then
91
      q0 <= '0';
92
      q1 <= '0';
93
      q2 <= '0';
94
      q3 <= '1';
95
      end if;
96
      
97
      if count = "1001" then
98
      q0 <= '1';
99
      q1 <= '0';
100
      q2 <= '0';
101
      q3 <= '1';
102
      end if;
103
      
104
      if count = "1010" then
105
      zehn_aus <= '1';
106
      count <=    "0000";
107
      else
108
      zehn_aus <= '0';
109
      end if;
110
end if;
111
      
112
      end process;
113
114
end Behavioral;

von Uwe (Gast)


Lesenswert?

Mal dir mal nen Blockdiagram auf RTL Ebene (Bitte mit den Steuersignalen 
die Benötigt werden). Also Counter, Register, Comperatoren, Decoder, 
Logikgatter.
Ohne Plan einfach draufloszuschreiben funktioniert nur wenn man schon 
Erfahrung hat.

von Uwe (Gast)


Lesenswert?

> elsif (clk_en='1' and clk_en'event) or (stell='1' and mclock'event) then

Mal mal dieses Konstrukt auf !

von derLars (Gast)


Lesenswert?

Ich würde zunächst mit einem VHDL-Tutorial bzw. Buch anfangen!

Mir hat VHDL-Synthese gut gefallen!

derLars

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

VHDL-Noob schrieb im Beitrag #2688654:
> elsif (clk_en='1' and clk_en'event) or (stell='1' and mclock'event)
Ein Double-Clock-And-Double-Enable-And-Double-Edge-Flipflop?
Das gibt es nicht.

> Also ich hab jetzt mal versucht nen Zähler zu schreiben,
Das was da steht wird niemals was rechtes zusammengeben.
Probiers erst mal das mit der blinkenden LED:
http://www.lothar-miller.de/s9y/archives/80-Hello-World!.html
und dem Lauflicht:
http://www.lothar-miller.de/s9y/archives/61-Lauflicht.html
Und wenn du das verstanden hast, dann ist auch die Uhr kein Problem 
mehr.

Lothar Miller schrieb:
>> und wollte mal fragen ob
>> jemand für so etwas mal ein Beispiel zur Hand hätte.
> Ja, sogar ganz hier in der Nähe, noch keine Woche alt.
Ich helf dir mal mit dem Link auf den 
Beitrag "kruder Fehler bei FPGA-Programmierung (ISE WEBpack-Schematic)"

von VHDL-Noob (Gast)


Lesenswert?

Naja einfach drauf losgeschrieben war es nicht, sondern eher ein 
bestehendes funktionierendes Programm umgeschrieben. Aber danke für die 
Infos werde es nochmal daraufhin überprüfen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

VHDL-Noob schrieb im Beitrag #2688714:
> ein bestehendes funktionierendes Programm umgeschrieben.
VHDL /= Programmieren
Mit VHDL schreibst du keine Programme, sondern du beschreibst 
Hardware. VHDL ist eigentlich einfach ein Schaltplan in Textform...

von Duke Scarring (Gast)


Lesenswert?

VHDL-Noob schrieb im Beitrag #2688654:
> use IEEE.STD_LOGIC_ARITH.ALL;
> use IEEE.STD_LOGIC_UNSIGNED.ALL;

Siehe Beitrag "IEEE.STD_LOGIC_ARITH.ALL obsolete"

Duke

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.