hallo zusammen, ich habe ein problem mit einem prozess. Er wird nicht synthetisiert. ich habe ein Signal (value) das im normalzustand '0' ist. Wenn es auf '1' gesetzt wird, dann soll ein counter (cnt) inkrementiert werden. und das genau 1 mal und genau an dem zeitpunkt , wenn das Signal von '0' auf '1' wechselt. Mein Process dazu: process(value) begin if rising_edge(value) then cnt <= cnt +1; end if; end process; Doch die Synthese kann durch diesen Process nicht ausgeführt werden. gibt es eine andere Möglichkeit die den selben Zweck erfüllt? vielen Dank im voraus und gruß an alle dete
process(clock) begin if rising_edge(clock) then value_old <= value_new; if (value_new = '1' AND value_old = '0') then cnt <= cnt +1; end if; end if; end process;
> Doch die Synthese kann durch diesen Process nicht ausgeführt werden. Warum nicht? Welche Fehlermeldungen erhältst du? Wird der Counter cnt evtl. woanders zurückgesetzt? Es ist zwar viel schöner, nur 1 Clock im Design zu haben, aber ich kann beliebig viele Takte in meinem FPGA haben. Notfalls lokal und ohne Taktnetz. Damit sind kurze Schieberegister sogar noch schneller...
guten morgen, und vielen dank an Dicke Finger. deine Lösung funktioniert. und ich hab noch dazugelernt. die fehlermeldung lautete: Statement is not synthesizable since it does not hold its value under NOT(clock-edge) nein, der counter wird nicht woanders zurückgesetzt. ich hatte in meiner Frage nicht den ganzen prozess gepostet. in diesem Prozess iwrd auch der counter zurück gesetzt also nochmals vielen dank an alle gruß Dete
Florian G. schrieb: > probiers mal mit > > ... > if (value'EVENT and value='1') then > ... NEIIIIN, blos nicht ! Rising_edge() ist schon in Ordnung, alle Compiler verstehen es und der Code ist besser lesbar.
Dete Kosschlovsski schrieb: > Statement is not synthesizable since it does not hold its value under > NOT(clock-edge) Welche Zielplattform? FPGA? CPLD? Zeig doch mal den ganzen Code, der Fehler liegt woanders...
Zielplattform ist FPGA hier der alte: process(value) begin if rising_edge(value) then cnt <= cnt +1; elsif (cnt = 98) then cnt <= (others => '0'); end if; end process; hier der neue (mit Dicke Finger ´s lösung) - er wird synthetisiert und ich krieg den auf den FPGA drauf process(clk,value_new) begin if rising_edge(clk) then value_old <= value_new; if (value_new = '1' AND value_old = '0') then cnt <= cnt +1; elsif (cnt = 98) then cnt <= (others => '0'); end if; end if; end process;
1 | process(value) |
2 | begin
|
3 | if rising_edge(value) then |
4 | cnt <= cnt +1; |
5 | elsif (cnt = 98) then |
6 | cnt <= (others => '0'); |
7 | end if; |
8 | end process; |
Wie sollte denn bitteschön das Bauteil aussehen, das sowas kann? BTW: zudem ist die Sensitivliste unvollständig, da würde cnt fehlen :-/ Probiers so:
1 | process(value) |
2 | begin
|
3 | if rising_edge(value) then |
4 | if (cnt = 98) then |
5 | cnt <= (others => '0'); |
6 | else
|
7 | cnt <= cnt +1; |
8 | end if; |
9 | end process; |
Wie sollte denn bitteschön das Bauteil aussehen, das sowas kann? was meinst du damit?
aaaah schei ...ich sehe schon, habs falsch rauskopiert, typischer copy - paste fehler
1 | process(value) begin |
2 | if rising_edge(value) then |
3 | cnt <= cnt +1; |
4 | elsif (cnt = 98) then |
5 | cnt <= (others => '0'); |
6 | end if; |
7 | end process; |
cnt ist ein asynchroner Reset, allerdings ist hier der Takt vorrangig!!! Solche FFs gibt es nicht. Das könnte auch gehen, allerdings ist Kombinatorik im Reset-Pfad, und das wird dich irgendwann sauber aus der Kurve werfen:
1 | process(value,cnt) begin |
2 | if (cnt = 98) then |
3 | cnt <= (others => '0'); |
4 | elsif rising_edge(value) then |
5 | cnt <= cnt +1; |
6 | end if; |
7 | end process; |
BTW: Oben fehlt noch ein end if
1 | process(value) |
2 | begin
|
3 | if rising_edge(value) then |
4 | if (cnt = 98) then |
5 | cnt <= (others => '0'); |
6 | else
|
7 | cnt <= cnt +1; |
8 | end if; |
9 | end if; |
10 | end process; |
aha, ich denke mir fehlt einfach die Erfahrung was sagst du zu meinem neuen prozess? process(clk,value_new) begin if rising_edge(clk) then value_old <= value_new; if (value_new = '1' AND value_old = '0') then cnt <= cnt +1; elsif (cnt = 98) then cnt <= (others => '0'); end if; end if; end process; macht der / kann der probleme machen?
Das passt jetzt.
> process(clk,value_new)
Der Prozess ist nur noch auf clk sensitiv.
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.