Hi ! Hab die Aufgabe eine digitale Weckuhr (also Uhr mit einstellbarem Alarm) zu programmieren. Hab den Zähler für die Uhr fertiggestellt und wollte nun die Funktion einbauen, um die Uhr zu stellen. Leider bekomme ich eine Fehlermeldung mit der ich nichts anfangen kann und die Hilfe hilft mir auch nicht weiter... Die Meldung: Error (10818): Can't infer register for "zaehler:m[16]" at block_time_Symbol.vhd(67) because it does not hold its value outside the clock edge ich hab die *.vhd mal angehangen. Ich hoffe mir kann jemand sagen, was ich verkehrt mache. Vielleicht auch nen Änderungsvorschlag... Dank euch!
Soweit ich sehe reagierst du in einem Prozess auf Flanken von zwei unterschiedlichen Takten und solche FFs gibts einfach nicht in einem FPGA. Mit mehr als einem Takt arbeiten kann teilweise schon recht anspruchsvoll sein, wenn man sich die Namen so ansieht könnte man auf die Idee kommen, dass es da einen Takt mit 0.5 s Periode gibt und einen mit 1 s. Mein Vorschlag: Vergiss den 1 s Takt und mach diese Aktionen halt auf jeder zweiten 0.5 s Taktflanke. Mit mehreren Takten kann man sich ganz lustige Fehler einfangen (z.b. 1 s Takt wird in der Testbench aus dem 0.5 s Takt erzeugt und ist darum in der Simulation einen Delta Cycle hinterher, was zu Simulationsfehlern führen kann). lg flintstone
Du steckst wohl noch ganz in den Anfängen. Ohne Dir zu nahe treten zu wollen, so habe ich den Eindruck, dass Du noch nicht ganz verstanden hast was ein Prozess in VHDL beschreibt. Aus der Sicht des Softwerkers sieht das so aus als würden hier die Befehle in dem Prozess nacheinander abgearbeitet. Dem ist aber nicht so. Wenn man in einem Prozess den Konstrukt
1 | if rising_edge(clk) then |
2 | ...
|
3 | end if; |
verwendent, dann entsteht vereinfacht gesagt immer ein (oder mehrere) Flip Flop. Nämlich zum Zeitpunkt der steigenden Flanke wird in der Regel irgend einem Signal (oder mehreren Signalen) ein Wert zugewiesen. Dies geschieht immer exakt in diesem Moment. Eine weitere Abfrage auf eine steigenden Flanke innerhalb dieser if-Anweisung ist daher nicht möglich. Ich habe das ganze mal spaßeshalber im ispLever-Classic compiliert und synthetisiert. Auf Grund dessen, dass die zweite Clock-Abfrage auf Grund der Momentaufnahme nie eintreten kann, hat das Tool gleich einiges Wegoptimiert.
1 | Warning 13707:Unused pin 'clk500ms' removed. |
2 | Warning 13707:Unused pin 'hsetpl' removed. |
3 | Warning 13707:Unused pin 'hsetmin' removed. |
4 | Warning 13707:Unused pin 'msetpl' removed. |
5 | Warning 13707:Unused pin 'msetmin' removed. |
6 | Warning 13707:Unused pin 'wahl_al_uhr' removed. |
Als kleiner Tip: Als Anfänger brauchst Du keine Variablen. Und lese wirklich mal ein gutes Buch dazu. Dazu gibt es genügend Foreneinträge.
Hier mal meine altbewährten Postulate:
1 | Ein Design (insbesondere ein Anfängerdesign) hat genau 1 Takt, |
2 | der immer auf dieselbe Flanke aktiv ist. |
3 | Es gibt keinen (und schon gar keinen asynchronen) Reset. |
4 | Externe Signale werden über 2 Flipflops einsynchronisiert. |
5 | Jede Abweichung von diesen Regeln muß fundiert begründet werden können. |
Und weil du Abweichungen noch nicht begründen kannst, gelten für dich die angeführten Regeln. Und zur überschwänglichen (und unnötigen) Verwendung von (speichernden) Variablen lies dir das mal durch: Beitrag "Variable vs Signal" Und glaub mir: das erste halbe Jahr brauchst du keine Variable. Und wenn du trotzdem welche verwenden willst, solltest du eine fundierte Begründung für dieses Vorgehen abgeben können... > variable h : integer ; Man verwendet keine uneingeschränkten integer! Denn sonst kann der Simulator bei einer Bereichsverletzung keinen Fehler erkennen... Z.B. könnte deine Stunden so ohne weiteres bis 1234567 hochlaufen... :-o Also, wenn schon dann so: variable h : integer range 0 to 23 := 0;
danke danke für die antworten! waren ja auch ein par hilfreiche tipps dabei... (wie der mit dem begrenzen der Variablen) nur leider interessiert es meinen Prof nicht, dass ich anfänger bin... und wie soll so ein projekt jetzt bitte ohne Variablen realisiert werden... hatte wirklich nur den Fehler gemacht , dass ich gedacht hatte, dass das schön nacheinander abläuft (wie in C zum Bsp) für den Hinweis bin ich dankbar!
chrischie schrieb: > und wie soll so ein projekt jetzt bitte ohne > Variablen realisiert werden... Nimm Signale.
1 | architecture uhr of block_time_Symbol is |
2 | signal h : integer range 0 to 23; |
3 | signal m : integer range 0 to 59; |
4 | signal s : integer range 0 to 59; |
5 | begin
|
6 | |
7 | zaehler : process (reset,clk1s, clk500ms) |
8 | :
|
Als Tipp: leih dir mal das Buch "VHDL-Synthese" aus....
hab grad mal ne stunde gelesen... jetzt wird es mir langsam klarer... ich steig langsam dahinter... für nen anfänger mit c/c++ erfahrung ist es echt schwer, sich an diese anderen Strukturen zu gewöhnen (jetzt auf einmal eigentlich hardware zu beschreiben und nicht mehr software für die hardware) dank euch!
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.