www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Fehler: kann ihn als Anfänger nicht verstehen


Autor: chk (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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!

Autor: flintstone (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Matthias G. (mgottke)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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
if rising_edge(clk) then
   ...
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.
Warning 13707:Unused pin 'clk500ms' removed.
Warning 13707:Unused pin 'hsetpl' removed.
Warning 13707:Unused pin 'hsetmin' removed.
Warning 13707:Unused pin 'msetpl' removed.
Warning 13707:Unused pin 'msetmin' removed.
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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier mal meine altbewährten Postulate:
Ein Design (insbesondere ein Anfängerdesign) hat genau 1 Takt, 
der immer auf dieselbe Flanke aktiv ist. 
Es gibt keinen (und schon gar keinen asynchronen) Reset.
Externe Signale werden über 2 Flipflops einsynchronisiert.
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;

Autor: chrischie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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!

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
chrischie schrieb:
> und wie soll so ein projekt jetzt bitte ohne
> Variablen realisiert werden...
Nimm Signale.
architecture uhr of block_time_Symbol is
   signal  h  : integer range 0 to 23;
   signal  m  : integer range 0 to 59;
   signal  s  : integer range 0 to 59;
begin
  
  zaehler : process (reset,clk1s, clk500ms)
  :

Als Tipp: leih dir mal das Buch "VHDL-Synthese" aus....

Autor: chrischie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.