Forum: FPGA, VHDL & Co. Digital Clock


von Lochner Eric (Gast)


Angehängte Dateien:

Lesenswert?

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

von Gustl B. (-gb-)


Lesenswert?

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.

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


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.