Forum: FPGA, VHDL & Co. rsing_edge Problem


von Dete K. (dete)


Lesenswert?

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

von Dicke F. (dicke_finger)


Lesenswert?

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;

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> 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...

von Dete K. (dete)


Lesenswert?

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

von Florian G. (badscher)


Lesenswert?

probiers mal mit

...
if (value'EVENT and value='1') then
...

von Klaus F. (kfalser)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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...

von Dete K. (dete)


Lesenswert?

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;

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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;

von Dete K. (dete)


Lesenswert?

Wie sollte denn bitteschön das Bauteil aussehen, das sowas kann?


was meinst du damit?

von Dete K. (dete)


Lesenswert?

aaaah schei ...ich sehe schon,

habs falsch rauskopiert, typischer copy - paste fehler

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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;

von Dete K. (dete)


Lesenswert?

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?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Das passt jetzt.

> process(clk,value_new)
Der Prozess ist nur noch auf clk sensitiv.

von Dete K. (dete)


Lesenswert?

vielen dank und schönes WE

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.