Hallo zusammen, es ist vielleicht schon spät und ich stehe etwas auf dem Schlauch (plus ich habe noch nicht all zu viel Erfahrung mit VHDL), aber ein scheinbar einfaches Problem bekomme ich nicht in den Griff. Ich möchte einen Wert erst dann zuweisen, wenn das erste mal ein Flankenwechsel eines Steuersignals von '1' auf '0' statt gefunden hat. Mal startete das Steuersignals auf '1', mal auf '0'. Mir ist es eigentlich egal, da ich bei Steuersignals = '1' erst etwas machen möchte, wenn vorher mindestens ein Flaneknwechsel von '1' auf '0' erkannt wurde. Meine Idee daher: signal flag : std_logic:='0'; if falling_edge(CS) then flag <='1'; end if; if CS = '1' then if ... and flag= '1' then ... ... Das Problem: nervende Warnungen, die ich gerne beseitigen möchte: WARNING:Xst:2404 - FFs/Latches <_i000005<0:0>> (without init value) have a constant value of 1 in block <FPGA>. WARNING:Xst:1426 - The value init of the FF/Latch flag hinder the constant cleaning in the block FPGA. You should achieve better results by setting this init to 1. WARNING:Xst:1426 - The value init of the FF/Latch flag hinder the constant cleaning in the block FPGA. You should achieve better results by setting this init to 1. Hat jemand eine Idee? Vielen Dank!
Wo wird denn "flag" zurück gesetzt? Ich würde den Wert z.B. "berechnen" wenn CS high ist. Über ein weiteres Signal latcht du den wert so lange bis eine fallende Flanke an CS anliegt. Wenn die "Berechnung" des Wertes rein kombinatorisch ist kann es auch außerhalb des Prozesses beschrieben werden. Falls nicht musst du die Sensitivity-List des Prozesses um die Eingänge erweitern (also z.B. um "CS" und "eingang"). So in der Art etwa: signal wert : std_logic; if falling_edge(CS) then ausgang <= wert; end if; if CS = '1' then wert <= eingang AND '1'; else wert <= '0'; end if;
Marius S. schrieb: > Falls nicht musst du die Sensitivity-List des Prozesses um die Eingänge > erweitern (also z.B. um "CS" und "eingang"). Da ist doch weit&breit kein Prozess zu sehen... > So in der Art etwa: Das ist ein Flipflop und ein Latch. late_at_night schrieb: > Ich möchte einen Wert erst dann zuweisen, wenn das erste mal ein > Flankenwechsel eines Steuersignals von '1' auf '0' statt gefunden hat. Was ist dein eigentliches Problem? Welche Taktfrequenz hast du? Wie oft und wie lange kommt der CS? Was wird mit diesem CS gemacht? > if falling_edge(CS) then Das sieht schon mal sehr verdächtig aus: warum ist CS ein Takt? Für Anfänger gilt zum Thema Takt (analog zum Highlander): es kann nur Einen geben! Sobald 2 Takte auftauchen ist idR. irgendwas suspekt... late_at_night schrieb: > Meine Idee daher: Ich würde es erst mal so probieren, wie es allgemein in einem synchronen Design üblich ist: Einsynchronisieren und Flankenerkennung (das waren jetzt Suchbegriffe das Forum hier oder für Google)
Lothar Miller schrieb: > Das ist ein Flipflop und ein Latch. Was late_at_night beschrieben hat hörte sich auch genau wie ein Latch an: late_at_night schrieb: > Ich möchte einen Wert erst dann zuweisen, wenn das erste mal ein > Flankenwechsel eines Steuersignals von '1' auf '0' statt gefunden hat.
Marius S. schrieb: >> Das ist ein Flipflop und ein Latch. > Was late_at_night beschrieben hat hörte sich auch genau wie ein Latch > an: Könnte sein, dass sie/er sich nicht im Klaren ist, was das für ein FPGA bedeutet. Denn late_at_night schrieb: > ich habe noch nicht all zu viel Erfahrung mit VHDL Und das heißt für mich auch: ich habe nicht viel Erfahrung mit FPGAs/CPLDs. Da kann man sich schon mal ein Latch einfangen. Und weils so schön geklappt hat, so ein Latch das nächste Mal kombinatorich ansteuern. Und wehe, wenn dann ein Glitch kommt... Kurz gesagt: diese Designstrategie schreit ganz laut "Ich bin Murks!"
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.