Hallo zusammen Ich habe ein Problem mit dem Programmieren meiner FPGA/VHDL Datei wo es um eine Uhr mit Ausgabe an 7 Segmentanzeige mit Stellfunktion geht. Es soll eine Uhr im FPGA implementiert werden. Die aktuelle Zeit wird im 7 Segmentdisplay ausgegeben. Mittels Tasten und Schalter muss die Uhr gerichtet werden können. Irgendwie habe ich einen Fehler beim Sekundentakt, es zählt momentan nicht korrekt. Ich finde den Fehler nicht. Ebenfalls sollte ich noch mit Knöpfe und Schalter die Funktion einprogrammieren um die Uhrzeit an der 7 Segmentanzeige (4 anzeigen für je eine zahl) einzustellen. Jedoch habe ich dort ebenfalls auch noch etwas Mühe dies zu programmieren. Ich arbeite mit dem Quartus II 13.1 Programm und dem Altera DE0 Board. Im Anhang befindet sich mein komplettes Programm. Ich wäre echt dankbar falls irgendjemand da draussen mir hierbei helfen könnte. Vielen Dank
use ieee.numeric_std.all; use ieee.std_logic_unsigned.all; grusel Nutze NUR die obere Zeile. Das schöne an einer HDL ist: Man kann das in kleine Komponenten zerlegen. Man kann diese Komponenten einzeln simulieren. Mach das. Beides.
Lochner Eric schrieb: > Im Anhang befindet sich mein komplettes Programm. Das ist das komplette Projekt mit zezippten 1,5MB. Reichen würde die watch.vhd mit 5kB. Gustl B. schrieb: > use ieee.numeric_std.all; > use ieee.std_logic_unsigned.all; > grusel Nutze NUR die obere Zeile. Die Hintergründe hatte ich schon beim Kommilitonen angeführt: Beitrag "DC Motor, PWM, Drehrichtung, Drehzahl" @Lochner Eric: Mach den Vorteiler einfach zum integer, dann brauchst du die std_logic_unsigned.all nicht: signal Divider : std_logic_vector (27 downto 0); > Das schöne an einer HDL ist: Man kann sie im Simulator simulieren... Hier ist reset unnötig, weil alle Prozesse synchron und damit nur nur auf clk sensitiv sind: process(clk,reset) Das ist ist der berühmte off-by-one Fehler: if Divider = 50e6 then ... Zum Glück wirkt er sich hier nicht wesentlich aus. Falsch ist es trotzdem, korrekt wäre if Divider = 50e6-1 then... Wenn man sich ganz tief in die Augen schaut, dann ist hier die 6 völlig unnötig, denn die Zehnerminuten können gar nie 6 werden: variable countmin1: integer range 0 to 6 := 0; -- Minuten Zähler bis 6 Weil Uhren im Allgemeinen eine beliebte Spielwiese sind, habe ich da auch noch 2 Links dazu (besonders der zweite ist recht unterhaltsam): http://www.lothar-miller.de/s9y/archives/88-VHDL-vs.-Verilog-am-Beispiel-einer-Stoppuhr.html Beitrag "kruder Fehler bei FPGA-Programmierung (ISE WEBpack-Schematic)" So weit, so gut. Zu den Fragen: > Irgendwie habe ich einen Fehler beim Sekundentakt, es zählt momentan > nicht korrekt. Ich finde den Fehler nicht. Simulation braucht eine Testbench. Die ist hier echt einfach, weil im Grunde ja nur der Takt angelegt werden muss... Ich habe dann gleich gesehen, dass der Taktteiler keine clk_ena genereirt, das gesamte Konstrukt nicht so richtig kapiert und den Kram aufgeräumt. Jetzt kommt der Takt und die Uhr tut irgendwas. > Ebenfalls sollte ich noch mit Knöpfe und Schalter die Funktion > einprogrammieren um die Uhrzeit an der 7 Segmentanzeige einzustellen. Das hast du ja ansatzweise schon drin mit deinem reset in dem Monsterprozess. Wenn es keine weiteren Vorgaben gibt, dann wäre mein Ansatz jeweils 1 Taster für jede einzelne Stelle. Das kann man locker nach Einsynchronisieren und Flankeerkennung hinter die eigentlichen Uhrenzähler hängen, dort wo jetzt der reset sitzt. > habe ich dort ebenfalls auch noch etwas Mühe dies zu programmieren. Stell dir vor, welche Hardware dafür nötig wäre, und dann beschreibe diese Hardware mit der HardwareBESCHREIBUNGSsprache VHDL. Wenn du mit VHDL "programmierst", wie du deinen AVR mit einer prozeduralen Programmiersprache programmierst, dann geht das schief. Die Verwendung der Variablen zeugt vom Programmieren und die recht unbedarfte Verwendung des % Operators. Glück gehabt, dass das ein %2 und 2 eine Zweierpotenz ist...
:
Bearbeitet durch Moderator
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.