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


von student (Gast)


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

von lkmiller (Gast)


Lesenswert?

Das geht nicht:
1
two:process(state_current,Cpld_2)
2
:
3
case state_current is
4
:
5
when state_1 => if rising_edge(Cpld_2) then  --Cpld_2 !!meine ich clock damit
6
:

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:
1
process (RESET, CLK)
2
if RESET='1' then
3
:
4
elsif rising_edge(CLK) then
5
  ARBEIT
6
end if;

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


Am einfachsten ist ein getakteter Prozess so handzuhaben:
1
process (CLK)
2
if rising_edge(CLK) then
3
  if RESET='1' then
4
  :
5
  elsif LOAD='1' then
6
  :
7
  else
8
     ARBEIT
9
  end if;
10
:
11
end if;

von Mark (Gast)


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.

von Lupo (Gast)


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.

von student (Gast)


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

von lkmiller (Gast)


Lesenswert?

Die Richtung stimmt, so klappt das eher.
1
 one:process (CLK)
2
 if rising_edge(CLK) then
3
   state <= State_next;   --                    <<<<< nicht vergessen
4
   cpl2_old<=cpld_2;      --old_ and newstate   <<<<< was für ein sinnfreier Kommentar
5
   end if
6
 end process one;
7
:
8
:
9
 when state_1 => if(cpl2_old='1') and Cpld_2='0' then --falling_edge(cpld_2)
10
                  State_next<=state_2;
11
               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.

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.