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