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