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
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
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?
@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
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.
>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
"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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.