www.mikrocontroller.net

Forum: FPGA, VHDL & Co. rsing_edge Problem


Autor: Dete Kosschlovsski (dete)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dicke Finger (dicke_finger)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Dete Kosschlovsski (dete)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Florian G. (badscher)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
probiers mal mit

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

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Dete Kosschlovsski (dete)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
    process(value)
      begin
        if rising_edge(value) then
            cnt <= cnt +1;
        elsif (cnt = 98) then
            cnt <= (others => '0');
          end if;
      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:
    process(value)
      begin
        if rising_edge(value) then
           if (cnt = 98) then
              cnt <= (others => '0');
           else
              cnt <= cnt +1;
          end if;
      end process;

Autor: Dete Kosschlovsski (dete)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie sollte denn bitteschön das Bauteil aussehen, das sowas kann?


was meinst du damit?

Autor: Dete Kosschlovsski (dete)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aaaah schei ...ich sehe schon,

habs falsch rauskopiert, typischer copy - paste fehler

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
    process(value) begin
        if rising_edge(value) then
            cnt <= cnt +1;
        elsif (cnt = 98) then
            cnt <= (others => '0');
        end if;
    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:
    process(value,cnt) begin
        if (cnt = 98) then    
            cnt <= (others => '0');
        elsif rising_edge(value) then
            cnt <= cnt +1;
        end if;
      end process;


BTW:
Oben fehlt noch ein end if
    process(value)
      begin
        if rising_edge(value) then
           if (cnt = 98) then
              cnt <= (others => '0');
           else
              cnt <= cnt +1;
          end if;
        end if;
      end process;

Autor: Dete Kosschlovsski (dete)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das passt jetzt.

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

Autor: Dete Kosschlovsski (dete)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen dank und schönes WE

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.