Forum: FPGA, VHDL & Co. Stoppuhr VHDL code


von Max L. (max-lenz)


Angehängte Dateien:

Lesenswert?

Hi Leute,

ich habe einen Code für eine einfache Stoppuhr in VHDL geschrieben und 
denke, dass es an sich funktioniert.
Mein Problem liegt darin, dass ich es nicht richtig auf 7SegmentAnzeige 
darstellen kann. Die letzte Ziffer wird nach 9 nicht auf 0 gesetzt.

Danke im voraus.

von Student (Gast)


Lesenswert?

Max Lenz schrieb:
> Die letzte Ziffer wird nach 9 nicht auf 0 gesetzt.

Ich denke du meinst, dass nach der 59 nicht die 0 folgt?
Wenn ja, dann liegt das wohl daran, dass ein Signal nicht sofort 
geändert ist, sondern erst am Ende eines Process den neuen Wert annimmt. 
In der Schreibweise würde es nur mit einer Variable machbar sein, die 
direkt mit dem neuen Wert sichtbar ist.

Grundsätzlich ist aber auch hier wohl das Problem, sich im Kopf nicht 
richtig von der Prozeduralen Denkweise gelöst zu haben.

von Duke Scarring (Gast)


Lesenswert?

Max Lenz schrieb:
> Mein Problem liegt darin, dass ich es nicht richtig
Mein Problem liegt darin, das Du uns keine Testbench mitlieferst. Mit 
einer Testbench können wir Dein Problem im Simulator nachvollziehen. Dir 
hilft eine Testbench übrigens auch weiter.

Warum wird eigentlich std_logic_arith verwendet? Kennst Du den
Beitrag "IEEE.STD_LOGIC_ARITH.ALL obsolete" ?!?

Duke

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


Lesenswert?

Max Lenz schrieb:
> ich habe einen Code für eine einfache Stoppuhr in VHDL geschrieben und
> denke, dass es an sich funktioniert.
Ich denke nicht, dass es funktioniert, ich simuliere sowas...
Das ist gar nicht so schwer:
http://www.lothar-miller.de/s9y/archives/80-Hello-World!.html
Mit Xilinx geht es so:
http://www.lothar-miller.de/s9y/archives/81-Xilinx-ISE-Step-by-Step.html

> Stoppuhr.rar
Ich kann eine *.rar Datei mit dem Smartphone nicht öffnen. Ich würde 
empfehlen, einfach die VHDL-Datei (arg viel mehr als eine einzige dürfte 
das nicht sein) als VHDL-Datei hier anzuhängen.

> ... und denke, dass es an sich funktioniert.
> Die letzte Ziffer wird nach 9 nicht auf 0 gesetzt.
Das ist das einzige Problem? Auf was wird sie denn gesetzt?

Student schrieb:
> Grundsätzlich ist aber auch hier wohl das Problem, sich im Kopf nicht
> richtig von der Prozeduralen Denkweise gelöst zu haben.
Das heißt auf Deutsch: VHDL ist eine Beschreibungssprache, keine 
Programmiersprache. Und deshalb muss man vorher wissen, was man 
beschreiben will. Man braucht einen Schaltplan (zumindest im Kopf) und 
beschreibt den mit Worten in VHDL.
@Max Lenz: hast du eine Vorstellung, wie deine Stoppuhr als Schaltung 
aussehen müsste?

von Max L. (max-lenz)


Angehängte Dateien:

Lesenswert?

Eigentlich habe ich keine Ahnung wie die Schaltung aussehen sollte. Ich 
benutze einen Altera DE0.

Ich habe ein Untermodul "Segment7" geschrieben, worin die die Ziffer 0 
bis F angezeigt werden.

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


Lesenswert?

1
 signal count : std_logic_vector (25 downto 0);
2
 signal cnt_help : std_logic_vector (7 downto 0);
3
4
    count <= count + "00000000000000000000000001";
5
    cnt_help <= cnt_help + "00000001";
Aber hoppala...
Bitte zutreffendes ankreuzen:
Ich habe den Beitrag "Re: Stoppuhr VHDL code"
[ ] nicht gesehen!
[ ] nicht verstanden!
Nochmal die Kurzfassung: man rechnet nicht mit uneingeschränkten 
Vektoren. Nimm zum Zählen signed oder unsigned Vektoren, oder noch viel 
besser: Integer.
1
  if rising_edge (clock_50) then
2
    count <= count + "00000000000000000000000001";
3
    if(count = 25000000) then  -- Überlaufmoment
4
      count <= "00000000000000000000000000";
5
      enable <= enable xor '1';  -- 1,0,1,0,...
6
   :
7
   :
8
   elsif rising_edge (enable) then
Murks. So werden keine Teakte in FPGAs erzeugt!
Sieh dir mal das Lauflicht an, da wird ein Clock-Enable verwendet:
http://www.lothar-miller.de/s9y/archives/61-Lauflicht.html
1
    if(count = 25000000) then  -- Überlaufmoment
2
      count <= "00000000000000000000000000";
Denkfehler: dein Zähler zählt einen Takt zu viel. Du teilst den 
Quarztakt durch 25000001. Das mag hier nicht schlimm sein, der Ansatz 
ist aber prinzipiell falsch und macht bei einem Teiler durch 5 dann 
schon 20% Fehler: 0, 1, 2, 3, 4, 5 sind 6 Schritte...


Max Lenz schrieb:
> Ich habe ein Untermodul "Segment7" geschrieben, worin die die Ziffer 0
> bis F angezeigt werden.
Hast du es simuliert? Funktioniert es?

: Bearbeitet durch Moderator
von Max L. (max-lenz)


Lesenswert?

Ja es funktioniert wunderbar aber es wechselt nicht z.B. von 09 auf 10, 
sondern erst nach 0F auf 10.

Hier ein Video: https://www.youtube.com/watch?v=n9YXATI0LLU

Ich weiß halt nicht wie ich diesen Code in VHDL umsetzen soll, also wie 
beschreibe ich in VHDL (bzw. in von mir geschriebenen Quelltext), wenn 
ich sagen will, dass es bitte bei dem 7Segment Nummer 1 nur bis 9 zählen 
und dann auf 0 setzen soll ?

von Student (Gast)


Lesenswert?

Heißer Tipp wäre mal ein BCD-Zähler.

Angenommen, in cnt_help steht eine 11 in dezimal, wie sieht das in binär 
aus?
Warum steht dort nicht 0001 0001 drin?

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


Lesenswert?

Max Lenz schrieb:
> Ja es funktioniert wunderbar aber es wechselt nicht z.B. von 09 auf 10,
> sondern erst nach 0F auf 10.
Zähle nicht mit einem einzigen VEKTOR, den du dann auf Stellen 
aufdröselst! Sondern zähle jede Stelle einzeln, und das am besten mit 
einem INTEGER. Ich meine, sowas in der Art hier schon mal erwähnt zu 
haben.... :-/

> also wie beschreibe ich in VHDL (bzw. in von mir geschriebenen
> Quelltext), wenn ich sagen will, dass es bitte bei dem 7Segment Nummer 1
> nur bis 9 zählen und dann auf 0 setzen soll ?
(M)ein heisser Tipp: sieh dir mal den 
Beitrag "kruder Fehler bei FPGA-Programmierung (ISE WEBpack-Schematic)" an. Da ist eine komplette 
Uhr mit Datum und Schaltjahrberechnung drin...

> Hier ein Video: Youtube-Video "Test Stoppuhr"
Was ist denn mit der Simulation/Testbench? Oder erkenne ich da einen 
Hauch von Lernresistenz? Alles, was für die Lösung der trivialen Aufgabe 
nötig ist, wurde hier im Thread bereits (mehrfach) erwähnt. Hast du 
deinen eigenen Thread (insbesondere die Antworten) mal angesehen?

: Bearbeitet durch Moderator
von Trevor (Gast)


Lesenswert?

Ist es nicht so, dass bei Altera integer immer auf 32 bit aufgeblasen 
wird, auch wenn man z.B. nur ein paar Bit ausnutzt?
Da wäre bei Altera unsigned anzuraten.

von Student (Gast)


Lesenswert?

PTrevor schrieb:
> Ist es nicht so, dass bei Altera integer immer auf 32 bit
> aufgeblasen
> wird, auch wenn man z.B. nur ein paar Bit ausnutzt?
> Da wäre bei Altera unsigned anzuraten.

Naja, wenn Altera das auch bei Benutzung von 'range' bei integern täte, 
glaube ich kaum, dass sie noch am Markt eine Existenzberechtigung 
hätten...

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


Lesenswert?

Student schrieb:
> PTrevor schrieb:
>> Ist es nicht so, dass bei Altera integer immer auf 32 bit aufgeblasen
>> wird, auch wenn man z.B. nur ein paar Bit ausnutzt?
> Naja, wenn Altera das auch bei Benutzung von 'range' bei integern täte,
> glaube ich kaum, dass sie noch am Markt eine Existenzberechtigung
> hätten...
Jeder Synthesizer rechnet bei uneingeschränkten Integern erst mal mit 
32 Bit. Und hinterher darf eine der Optimierungsstufen eingreifen und 
zigtausend Warnungen abwerfen, dass 28 der 32 Bits nicht verwendet 
werden und dadurch entfallen.

M.E. der Hauptgrund gegen uneingeschränkte Integer: bei einem 
uneingeschränkten Integer kann der Simulator keinen Fehler lostreten, 
wenn z.B. bei einem VGA-Controller die 481. Zeile angesprochen wird...

Trevor schrieb:
> Da wäre bei Altera unsigned anzuraten.
Mit signed/unsigned Vektoren zu rechnen ist nur angesagt, wenn eine Zahl 
mit mehr als 32 Bit benötigt wird, oder wenn man den impliziten Überlauf 
an der Wort-Grenze brauchen kann.

: Bearbeitet durch Moderator
von GS (chromosoma)


Lesenswert?

Hi,
vllt. hilft dir mein tutorial.Ich zeige da wie man eine 7 seg Anzeige 
angesteuert,einschließlich eine art Stoppuhr.
http://www.youtube.com/watch?v=j2lAPIjpF1w

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.