www.mikrocontroller.net

Forum: FPGA, VHDL & Co. FSM mit 2 clocks steuern


Autor: student (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!
Ich habe CPLD_1 internclock von 100 MHz.Mit diesem clock kann ich mein 
FSM steuern.Mit jeder positiven Flanke erreiche ich den naechsten 
zustand(10 ns).Dazu kriege ich ein externes clock aus anderer Cpld_2 und 
diese clock will ich ja verwenden als eine Bedingung in einem zustand 
von meinem FSM.

one:process(CPLD_1 clock)
:
if rising_edge(CPLD_1 clock) then
state_current<=state_next;
end if
:
two:process(state_current,Cpld_2)
:
when state_1 => if rising_edge(Cpld_2) then--Cpld_2!!meine ich clock 
damit
                  State_next<=state_2;
                else
                   state_next<=state_1;
                 :
end case;
end process;
end behavioral;
wenn ich das synthetisieren will,bekomme ich diese Fehlermeldung:
Signal state_next cannot be synthesized, bad synchronous description. 
The description style you are using to describe a synchronous element 
(register, memory, etc.) is not supported in the current software 
release.
Für jeden Tipp bin ich ja sehr Dankbar!
mfg

Autor: lkmiller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das geht nicht:
two:process(state_current,Cpld_2)
:
case state_current is
:
when state_1 => if rising_edge(Cpld_2) then  --Cpld_2 !!meine ich clock damit
:

man kann nicht in einen kombinatorischen Prozess (case) ein FlipFlop 
(rising_edge()) einbauen.

Das einzige, was Synthesewerkzeuge noch zulassen ist eine if-Abfrage 
vorher. Gerne verwendet als globaler Reset:
process (RESET, CLK)
if RESET='1' then
:
elsif rising_edge(CLK) then
  ARBEIT
end if;

Mehrere if-Abfragen vor der Flankenabfrage ergeben dann schon mal gerne 
einen wilden Konstrukt für das Clock-Enable.
process (RESET, LOAD, CLK)
if RESET='1' then
:
elsif LOAD='1' then
:
elsif rising_edge(CLK) then
  ARBEIT
end if;


Am einfachsten ist ein getakteter Prozess so handzuhaben:
process (CLK)
if rising_edge(CLK) then
  if RESET='1' then
  :
  elsif LOAD='1' then
  :
  else
     ARBEIT
  end if;
:
end if;

Autor: Mark (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi student,

der clock aus CPLD 2 ist sicher asynchron zu dem clock 1 Deiner FSM.
Asynchrone Signale dürfen nie in einer FSM abgefragt werden, das geht
sicher in die Hose.
Du musst Dir ein Konzept überlegen, wie Du evt. das 2. Signal 
einsynchronisieren kannst und dann in der FSM abfragst.

Autor: Lupo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sagen wir, es geht meistens in die Hose. Die FSM selbst kann ja die 
handling machine für ein aysnchrones Signal darstellen, speziell , wenn 
mehrere asynchrone Signale inerhalb eines Zykluse einlaufen und Prio 
getätigt werden muss.

Autor: student (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke erstmal für Eure Antworten.Also das externe clock ist asynchron 
und wie Ihr gesagt habt ,dass ein asynchrones signal nicht in FSM 
abgefragt werden darf oK!
weil ich in meinem zustand eine Bedingung von einer negative flanke von 
cpld_2 brauche, habe ich mir es so versucht zu lösen:

signal cpld2_old:std_logic;
one:process (CLK)
if rising_edge(CLK) then
  cpl2_old<=cpld_2;  --old_ and newstate
  end if
end process one;
two:process(state_current,Cpld_2)--soll ich cpl2_old hier definieren?
:

when state_1 => if(cpl2_old='1') and Cpld_2='0' then-- 
falling_edge(cpld_2)

                  State_next<=state_2;
                else
                   state_next<=state_1;
                 :
end case;
end process two;
end behavioral;
Also das ist meine Idee,aber ich hab es noch nicht probiert.JA mal 
schauen was fuer Überaschung ja werd ich bekommen
mfg

Autor: lkmiller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Richtung stimmt, so klappt das eher.
 one:process (CLK)
 if rising_edge(CLK) then
   state <= State_next;   --                    <<<<< nicht vergessen
   cpl2_old<=cpld_2;      --old_ and newstate   <<<<< was für ein sinnfreier Kommentar
   end if
 end process one;
:
:
 when state_1 => if(cpl2_old='1') and Cpld_2='0' then --falling_edge(cpld_2)
                  State_next<=state_2;
               else

Ich würde allerdings mehr als 1 FF dazwischenschalten.
Und jetzt musst du ein Auge auf die Zeitverschiebung haben:
die fallende Flanke von cpld_2 wird einen Takt später erkannt.


BTW: in dem grauen Kasten um das weisse Eingabefeld (Das mit den 
VORSCHAU und ABSENDEN Buttons) steht eine kurze Bedienungsanleitung.

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.