Forum: FPGA, VHDL & Co. Synthese-Ergebnis unklar


von Volker (Gast)


Lesenswert?

process(start)
begin
if rising_edge(start)then
   mono_out<='1';
 end if;
end process;


Wieso wird hier mono_out von der Synthese fest auf VCC gelegt?
Es wird also gar kein FF angelegt. ISE kann doch nicgt wissen, wann 
meine
Start Flanke kommt.
Version ist ISE 8.1 SP3

Bitte um Hilfe, da ich dies nicht kapiere.

Volker

von Stefan Behrendt (Gast)


Lesenswert?

Du gibst aber auch keinen Anlass zu glauben, dass der Ausgang auch etwas 
anderes als High sein kann.
Versuch mal:

process(start)
begin
if rising_edge(start)then
   mono_out<='1';
else
   mono_out<='0';
 end if;
end process;

Gruß,
Stefan

von Jan M. (mueschel)


Lesenswert?

rising_edge wird nur in Verbindung mit einer Clock benutzt. Zur 
Erkennung von Flanken auf anderen Signalen musst du anders vorgehen.
Welchen Wert soll denn mono_out annehmen, wenn keine Flanke da ist?

von Volker (Gast)


Lesenswert?

@Stefan
Dein Vesruch ergibt folgenden Fehler:

Signal mono_out cannot be synthesized, bad synchronous description.

Ist ja auch klar, ein FF kann ja nicht auf die steigende und fallende 
Flanke angefragt werden.

@Jan
>Welchen Wert soll denn mono_out annehmen, wenn keine Flanke da ist?

Beim Star der Applikation soll mono_out logisch 0 sein. Start ist 
logisch 1
Nach einiger Zeit geht Start von 1 auf 0, hier soll gar nichts 
passieren,
nach wieder einer gewissen Zeit geht start wieder von 0 auf eins, jetzt 
soll mein Siganl mono_out auf 1 welchseln und ewig stehen bleiben.

Gruß Volker

von Jan M. (mueschel)


Lesenswert?

Ein solches Signal ist keine Clock und wird daher auch nicht als solche 
behandelt.
1. Erkenne die Flanke: Die steigende Flanke kam genau dann, wenn das 
momentane Signal eins und das um einen Takt verzögerte Signal null ist. 
(Zwei FF)
2. Reagiere darauf: if this_start = 1 and last_start = 0 then next_mono 
= 1 else next_mono <= mono;
3. Synchronisiere dieses next_mono mit einem FF.
4. Freue dich an einer funktionierenden Schaltung.

von Volker (Gast)


Lesenswert?

>Ein solches Signal ist keine Clock und wird daher auch nicht als solche
>behandelt.

Ja, wann ists ein Clock und wann nicht,gibts es dafür spezielle 
Merkmale?

Das ich das Eingangssignal "start" besser, wie von Dir vorgeschlagen 
über 2FF einsynchronisiere und dann die Flanke auswerte ist klar, aber 
darum gings mir nicht.

folgendes geht z.B. wunderbar und auch hier wird start als Clock-Signal
verwendet.

process(start)
begin
if rising_edge(start)then
   mono_out<= not mono_out;
  end if;
end process;

Danke für deine bisherigen Antworten.

Volker

von Jan M. (mueschel)


Lesenswert?

"Eine Clock ist eine Clock, wenn du sie mit den Einheiten MHz und ns 
vollständig beschreiben kannst" - oder so ähnlich...

Dein erstes Beispiel weißt dem Signal bei jeder steigenden Flanke eine 
eins zu. Sonst ändert sich nie etwas.

Dein letztes Beispiel toggelt das Signal bei jeder steigenden Flanke. 
Sonst ändert sich nie etwas.

Insofern funktionieren beide Beispiele. Da du beim Ersten nur diese 
einzige Zuweisung machst und die statisch ist, warum sollte die Synthese 
dann ein FF erzeugen? Vor der ersten Flanke ist das Signal in diesem 
Fall undefiniert und die Synthese tut nichts anderes, als das Signal 
sinnvoll zu setzen.

VHDL Schnipsel Flankenerkennung

von Klaus Falser (Gast)


Lesenswert?

Du musst Mono_out explizit mit '0' initialisieren, sonst versucht ISE zu 
intelligent zu sein, und nimmt an, dass sich mono_out niemals ändert.
Folglich wird mono_out fest mit '1' verdrahtet.

Möglicherweise hilft schon ein Initialisierungswert, z.B.
signal mono_out : std_logic := '0';

Auch ein Reset-Pfad wird helfen
process(start, reset)
begin
if reset = '1' then
   mono_out<='0';
elsif rising_edge(start)then
   mono_out<='1';
 end if;
end process;


Klaus

von Volker (Gast)


Lesenswert?

Hallo Klaus,

danke für die Antwort. Ich habe es gerade eben versucht.

Die Version mit Reset-Pfad funktioniert.

Die Version mit Init-Wert funktioniert nicht. Keine Ahnung warum, da ist 
Ise also so intelligent, dass sogar ein Initialisierungswert 
überschrieben wird.

Gruß Volker

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.