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


von chk (Gast)


Angehängte Dateien:

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!

von flintstone (Gast)


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

von Matthias G. (mgottke)


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
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.

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


Lesenswert?

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;

von chrischie (Gast)


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!

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


Lesenswert?

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....

von chrischie (Gast)


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!

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.