Flag auf falling_edge

Gast #3447980
Lesenswert?

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!
Persönliche Seite #3448006
Lesenswert?

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;
Moderator (Firma: Titel) Persönliche Seite #3448568
Lesenswert?

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)
Moderator (Firma: Titel) Persönliche Seite #3449926
Lesenswert?

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!"

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren