rsing_edge Problem

OP #1488851
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
Moderator (Firma: Titel) Persönliche Seite #1488980
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...
OP #1489688
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
OP #1490053
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;
Moderator (Firma: Titel) Persönliche Seite #1490063
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;
Moderator (Firma: Titel) Persönliche Seite #1490078
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;
OP #1490082
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren