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
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... ;-)
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.
PS: Tut mir Leid, dass ich mich vertippt habe ;) Muss natürlich "Trompeten" heißen!
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.
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...
Alles klar, dann werde ich es mal so versuchen. Vielen Dank für die Antworten.
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!
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
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.
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
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; |
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.
> elsif (clk_en='1' and clk_en'event) or (stell='1' and mclock'event) then
Mal mal dieses Konstrukt auf !
Ich würde zunächst mit einem VHDL-Tutorial bzw. Buch anfangen! Mir hat VHDL-Synthese gut gefallen! derLars
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)"
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.
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.