mikrocontroller.net

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


Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Behrendt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Falser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.