Forum: FPGA, VHDL & Co. Ein fuer alle mal: Signal <signal> cannot be synthesized, bad synchronous description.


von Fellap (Gast)


Lesenswert?

Hallo,

dieses Problem scheint ja hier schon oefters aufgetreten zu sein...
Aber loesen konnte ich des dennoch nicht...
Habe es versucht in verschiedene Prozesse zu unterteilen, jedoch ohne 
Erfolg, denn dann tritt ein multisource Fehler auf. Hier die notwendigen 
Codeschnipsel:


 signal cntMSEC:  integer range 0 to 49 := 0; --Counter fuer 1 msec
 signal cntMSECs1:  integer range 0 to 9 := 0; --einer msec
 signal cntMSECs10:     integer range 0 to 9 := 0; --zehner msec



  process (clk, reset_internal)
  begin  -- process
    if reset_internal = '1' then    -- asynchronous reset
    cntMSEC <= 0;
    cntMSECs1 <= 0;
    cntMSECs10 <= 0;
    elsif clk'event and clk = '1' then  -- rising clock edge
    cntMSEC <= cntMSEC + 1;        --1 ms
    elsif cntMSEC = 49 then
    cntMSECs1 <= cntMSECs1 + 1;      --Einer ms
    elsif cntMSEC = 9 then
    cntMSECs10 <= cntMSECs10 +1;      --Zehner ms
    end if;
  end process;

Sorry fuer dieses wiederaufkehrende Thema :-/

von Fellap (Gast)


Lesenswert?

Ah denke ich habs nun :)
fuer alle, die das gleiche Problem haben:

  process (clk, reset_internal)
  begin  -- process
    if reset_internal = '1' then    -- asynchronous reset
    cntMSEC <= 0;
    cntMSECs1 <= 0;
    cntMSECs10 <= 0;
    elsif clk'event and clk = '1' then  -- rising clock edge
    cntMSEC <= cntMSEC + 1;          --1 ms
    end if;
    if cntMSEC = 49 then
    cntMSECs1 <= cntMSECs1 + 1;      --Einer ms
    end if;
    if cntMSEC = 9 then
    cntMSECs10 <= cntMSECs10 +1;      --Zehner ms
    end if;
  end process;


Fuer Verbesserungsvorschlaege bin ich jederzeit offen :)

von Fellap (Gast)


Lesenswert?

Oh mein gott... was fuer ein Muell ich hier gepostet habe...
Koennte man dieses Thread bitte loeschen? Da stimmt ja hinten und vorne 
nichts...

von Fellap (Gast)


Lesenswert?

Hmm... so jetzt aber...

also ms sind es nun Testzwecke halber nicht... aber es tut nun nichts 
zur sache...

Compelieren laesst sich das Programm, aber der Counter zaehlt nur 
totalen wirrwar...

Weiss einer von euch wieso?


 signal cntMSEC:  integer range 0 to 25000000 := 0; --Counter for get 1 
msec
 signal cntMSECs1:  integer range 0 to 9 := 0; --Counter for 1 msec
 signal cntMSECs10: integer range 0 to 9 := 0;
 signal select_cntMSECs10: std_logic_vector(3 downto 0) := "0000";



  process (clk, reset_internal)
  begin  -- process
    if reset_internal = '1' then    -- asynchronous reset
    cntMSEC <= 0;
    cntMSECs1 <= 0;
    cntMSECs10 <= 0;
    elsif clk'event and clk = '1' then  -- rising clock edge
    cntMSEC <= cntMSEC + 1;          --1 ms
    end if;
    if cntMSEC = 9 then
    cntMSECs1 <= cntMSECs1 + 1;      --Einer ms
    end if;
    if cntMSECs1 = 9 then
    cntMSECs10 <= cntMSECs10 +1;      --Zehner ms
    end if;

  end process;

von dden (Gast)


Lesenswert?

ich glaube du wolltest sowas schreiben??
wie soll er den ohne clock was zuweisen!

    elsif clk'event and clk = '1' then  -- rising clock edge
      cntMSEC <= cntMSEC + 1;          --1 ms

      if cntMSEC = 9 then
        cntMSECs1 <= cntMSECs1 + 1;      --Einer ms
      end if;
      if cntMSECs1 = 9 then
        cntMSECs10 <= cntMSECs10 +1;      --Zehner ms
      end if;

    end if;

  end process;

von Da D. (dieter)


Lesenswert?

Fellap schrieb:
> Fuer Verbesserungsvorschlaege bin ich jederzeit offen :)

Mein Tipp: du solltest zwischendurch auch mal schlafen ;-)

Außerdem: Rück deinen Code vernünftig ein!!!

von Fpgakuechle K. (Gast)


Lesenswert?

1
 signal cntMSEC:  integer range 0 to 25000000 := 0; --Counter for get 1 
2
msec
3
 signal cntMSECs1:  integer range 0 to 9 := 0; --Counter for 1 msec
4
 signal cntMSECs10: integer range 0 to 9 := 0;
5
 signal select_cntMSECs10: std_logic_vector(3 downto 0) := "0000";
6
7
8
9
  process (clk, reset_internal)
10
  begin  -- process
11
    if reset_internal = '1' then    -- asynchronous reset
12
     cntMSEC <= 0;
13
     cntMSECs1 <= 0;
14
     cntMSECs10 <= 0;
15
    elsif clk'event and clk = '1' then  -- rising clock edge
16
     cntMSEC <= cntMSEC + 1;          --1 ms
17
    end if;
18
    if cntMSEC = 9 then
19
     cntMSECs1 <= cntMSECs1 + 1;      --Einer ms
20
    end if;
21
    if cntMSECs1 = 9 then
22
     cntMSECs10 <= cntMSECs10 +1;      --Zehner ms
23
    end if;
24
  end process;

Für eine synchrone Beschreibung muss das erste if nur den Takt und ggf. 
den asynchronen reset "abtesten", die eigentlichen Zuweisungen sind als 
innere IF-Zweige zu schreiben:
1
--...
2
  process (clk, reset_internal)
3
  begin  -- process
4
    if reset_internal = '1' then    -- asynchronous reset
5
     cntMSEC <= 0;
6
     cntMSECs1 <= 0;
7
     cntMSECs10 <= 0;
8
    elsif clk'event and clk = '1' then  -- rising clock edge
9
     cntMSEC <= cntMSEC + 1;          
10
     if cntMSEC = 9 then
11
      cntMSECs1 <= cntMSECs1 + 1;    
12
    end if;
13
    if cntMSECs1 = 9 then
14
     cntMSECs10 <= cntMSECs10 + 1;     
15
    end if;
16
   end if;  --nur hier steht das end if für clk'event richtig
17
  end process;

Einrücken hilft hier ungemein.
Eine explizite Beschreibung des overflows wäre auch ganz praktisch:
1
     if cntMSEC = 9 then
2
      if cntMSECs1 = 9 then
3
        cntMSECs1 <= 0; 
4
      else 
5
        cntMSECs1 <= cntMSECs1 + 1;      --Einer ms
6
      end if;
7
     end if;
MfG

von Fellap (Gast)


Lesenswert?

Ihr seit klasse! - Super! Vielen Dank an euch!

von Fellap (Gast)


Lesenswert?

jetzt bekomme ich aber schon das naechste Problem nicht mehr hin...

Ich moechte zwei 7-Segment-Anzeigen verwenden..
Die erste 7-Segementanzeige zaehlt von 0 - 9 hoch.
Wenn ich nun einen kurzen Tastendruck betaetige, soll der Momentanwert 
zu gespeichert werden und auf der 2ten 7-Segementanzeige angegezeigt 
werden und zwar solange bis ich wieder die Taste druecke um den 
aktuellen momentanwert wieder anzeigen zu lassen...

Ich stell mir das eigentlich sehr leicht vor.. Doch das Problem ist, bei 
der if-Bedingung das else... da weiss ich nicht was ich reinschreiben 
soll...

Bei dem jetztigen Code zeigte die 2te 7-Segment-Anzeige einfach das 
gleiche an wie die erste, wenn ich die Taste betaetige..


Hier der Code:

  process (BTN0)
  begin
    if BTN0 = '1' then
      save_cnt <= select_cntMSECs10;
      else
        save_cnt <= "1111";
    end if;
  end process;


PS: Soll ich fuer dieses Thema ein neuen Thread eroeffnen?

von Fellap (Gast)


Lesenswert?

Achja...  in select_cntMSECs10; ist eine 4Bit langer Vektor mit denen 
ich 0-9 binaer drinnen stehen habe...

bei "1111" ist das die 7-Segementanzeige aus.

von F. F. (foldi)


Lesenswert?

Da Dieter schrieb:
>
> Mein Tipp: du solltest zwischendurch auch mal schlafen ;-)

Schlaf wird völlig überschätzt. Habe heute Nacht auch noch ein Projekt 
zu Ende gemacht. Ist fünf geworden. Halb neun haben meine Jungs mich 
dann geweckt.
Alles nicht so schlimm, solange die Schaltung funktioniert.  :-)

von berndl (Gast)


Lesenswert?

Fellap schrieb:

Bitte, bitte, bitte, packe doch mal deine Codeschnipsel in [ vhdl ] und 
[ /vhdl ] (ohne Leerzeichen!), damit man das ganze mal gescheit sehen 
kann!
Noch besser, du haengst deine Datei (.vhd) hier einfach an, und zwar die 
gesamte Datei, nicht nur einen Ausschnitt...
> Hier der Code:
>
>   process (BTN0)
>   begin
>     if BTN0 = '1' then
>       save_cnt <= select_cntMSECs10;
>       else
>         save_cnt <= "1111";
>     end if;
>   end process;
also z.B. so (mit Tabulator=4 damit das ganze etwas uebersichtlicher 
wird):
1
process (BTN0)
2
begin
3
    if BTN0 = '1' then
4
        save_cnt <= select_cntMSECs10;
5
    else
6
        save_cnt <= "1111";
7
    end if;
8
end process;
Wenn ich das oben so sehe, dann wird mir jetzt schon schlecht... BTN0 
ist ein Eingangspin an dem ein Taster haengt, richtig?
Solche Signale muessen erstmal einsynchronisiert werden (fuer Taster: 
Entprellt!)
Und was dieser Codeschnipsel mit deinem Problem zu tun haben koennte, 
das kann dir mit der Information leider niemand sagen...

Achso, du hast oben nach dem Post von 'Fpga Kuechle' gemeint, alles 
waere super. Aber was du jetzt gemacht hast, das hast du nicht 
geschrieben. Also mit der Salamitaktik wirst du hier keine gescheiten 
Antworten bekommen...

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


Lesenswert?

Da Dieter schrieb:
> Außerdem: Rück deinen Code vernünftig ein!!!
Und verwende die Token [ vhdl ] vor sowie [ /vhdl ] nach dem VHDL-Code, 
aber ohne Leerzeichen. Dann gibt es sogar Syntax-Highlighting für 
umme...   :-o

Fellap schrieb:
> Compelieren
Soso...
> laesst sich das Programm, aber der Counter zaehlt nur
> totalen wirrwar...
Und was macht die Simulation?
Du weißt, dass der Simulator der VHDL-Debugger ist?

Fellap schrieb:
1
signal cntMSEC:  integer range 0 to 25000000 := 0; --Counter for get 1  msec
1. hast du einen 25GHz Takt? Kann dein FPGA so schnell zählen?
2. der beliebteste Fehler: du zählst einen Takt zuviel.
   0...24999999 sind schon 25000000 Takte...

berndl schrieb:
> Also mit der Salamitaktik wirst du hier keine gescheiten Antworten
> bekommen...
Full Ack. Wie auch?

von Fellap (Gast)


Angehängte Dateien:

Lesenswert?

berndl schrieb:
> enn ich das oben so sehe, dann wird mir jetzt schon schlecht... BTN0
> ist ein Eingangspin an dem ein Taster haengt, richtig?
> Solche Signale muessen erstmal einsynchronisiert werden (fuer Taster:
> Entprellt!)
> Und was dieser Codeschnipsel mit deinem Problem zu tun haben koennte,
> das kann dir mit der Information leider niemand sagen...

Richtig, BTN0 ist ein Taster. Ich moechte diesen Taster spaeter durch 
ein Eingangssignal an einem PIN ersetzen. Momentan dient dieser Taster 
nur als Test.

Wieso sollte ich das nicht selbst geschrieben haben?!?!? oO


Mein Code ist folgender: (Anbei auch der ganze code)

[VHDL]


  process (BTN0)
  begin
    if BTN0 = '1' then
  --  if BTN0'event and BTN0 = '1' then  -- rising clock edge
      save_cnt <= select_cntMSECs10;
    else
      save_cnt <= save_cnt;
    end if;
  end process;
[\VHDL]


Ich bekomme das speichern nicht gebacken... Jedes mal beim impelemtieren 
des Designs bekomme ich den Fehler:

Process "Place & Route" failed

von Fellap (Gast)


Lesenswert?

wieso funktinoert das mit dem [vhdl] [\vhdl] nicht?

von Fellap (Gast)


Lesenswert?

Oh sorry ...
1
  process (BTN0)
2
  begin
3
    if BTN0 = '1' then
4
  --  if BTN0'event and BTN0 = '1' then  -- rising clock edge
5
      save_cnt <= select_cntMSECs10;
6
    else
7
      save_cnt <= save_cnt;
8
    end if;
9
  end process;

von dden (Gast)


Lesenswert?

Hallo zusammen,
ich würde empfehlen erstmal ein paar einfache Tutorials durch zu 
arbeiten und zu verstehen.
Ein wunder das dein code mit BTN oben funktioniert,
nicht nur das vermutlich ein latch gebildet wird du gatest damit auch 
noch ein clk,
KEIN einsynchronisieren,
KEIN Entprellen,
damit nicht stabiles signal und absolut asynchron!

Mfg

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


Lesenswert?

Fellap schrieb:
1
  process (BTN0)
2
  begin
3
    if BTN0 = '1' then
4
  --  if BTN0'event and BTN0 = '1' then  -- rising clock edge
5
      save_cnt <= select_cntMSECs10;
6
    else
7
      save_cnt <= save_cnt;
8
    end if;
9
  end process;
Das hast du dir selber ausgedacht (beide Ansätze da drin), nicht wahr?
Das ist ein ausgefallener Ansatz. Hier geht es ausnahmsweise sogar gut 
aus, weil mit diesem gespeicherten Wert nur ein Multiplexer umgeschaltet 
wird. Wenn du damit aber lernst "so kann man es machen!", dann wirst du 
später noch mal Sorgen damit haben...


Diese Sensitivliste ist unvollständig (es fehlen sig_anodos, sw, 
selsect_cntMSECs10 und save_cnt) und und zudem ist da mittendrin nochmal 
ein Takt versteckt:
1
  process(cntDisp(16)) ------ hier fehlt was
2
  begin
3
  
4
  if cntDisp(16)'event and cntDisp(16) = '1' then ------ huch, ein Takt...  :-o
5
  sig_anodos <= sig_anodos(sig_anodos'left-3 downto sig_anodos'right) & 
6
            sig_anodos(sig_anodos'left downto sig_anodos'left-3+1);     
7
  end if;
8
  
9
  if sig_anodos(3) = '0' then  ----- und dann gehts kombinatorisch weiter...
10
  select_sw <= sw;
11
  elsif sig_anodos(2) = '0' then
12
  select_sw <= select_cntMSECs10;
13
  elsif sig_anodos(1) = '0' then  --ERROR
14
  select_sw <= save_cnt;        --ERROR

: Bearbeitet durch Moderator
von dden (Gast)


Angehängte Dateien:

Lesenswert?

was davon ist den ein ausgefallener Ansatz??

Möchte hier nun niemanden runtermachen aber das das beschreibt was er 
machen möchte glaube ich kaum.
Hilfreich wäre z.B. zu wissen auf was das laufen soll 
xilinx/altera,etc.?
Bei der orginalversion wird z.B. nur Kombinatorik erzeugt, der rest wird 
wegoptimiert da er nach der Beschreibung nichts tut!

Und um nochmal auf den BTN0 zurückzukommen Lothar hat zwar recht mit dem 
multiplexer aber trotzdem kommt davor ein Latch siehe Bild1(rot makiert 
ist BTN0).Und funktional sollte das wohl wie in Bild2 aussehen.

Mfg

von berndl (Gast)


Lesenswert?

dden schrieb:
> was davon ist den ein ausgefallener Ansatz??
Naja, der ausgefallene Ansatz ist ein zustandsgesteuertes 
Speicherelement, aka Latch. Den 'else' Zweig haette er sich uebrigens 
sparen koennen...

>
> Möchte hier nun niemanden runtermachen aber das das beschreibt was er
> machen möchte glaube ich kaum.
Ob er das selber weiss?

> Hilfreich wäre z.B. zu wissen auf was das laufen soll
> xilinx/altera,etc.?
Spielt hier glaube ich echt keine Rolle.

> Bei der orginalversion wird z.B. nur Kombinatorik erzeugt, der rest wird
> wegoptimiert da er nach der Beschreibung nichts tut!
Stimmt, das ist eine Ungereimtheit bei dem Design...

>
> Und um nochmal auf den BTN0 zurückzukommen Lothar hat zwar recht mit dem
> multiplexer aber trotzdem kommt davor ein Latch siehe Bild1(rot makiert
> ist BTN0).Und funktional sollte das wohl wie in Bild2 aussehen.
Klar, mehr steht da oben auch nicht (in den von Lothar gequoteten 
Teilen). Aber der zweite Teil dort oben, das ist echt starker Tobak... 
Das zeigt, dass es dem TO doch an elementaren Grundlagen fehlt. Und 
bisher ist er auf Hinweise von vermeintlich erfahreneren Leuten nicht 
eingegangen, sondern hat immer wieder eine neue geniale Loesung 
praesentiert. Meine persoenliche Meinung: So wird das nix!

von Fellap (Gast)


Lesenswert?

berndl schrieb:
> dden schrieb:
>> was davon ist den ein ausgefallener Ansatz??
> Naja, der ausgefallene Ansatz ist ein zustandsgesteuertes
> Speicherelement, aka Latch. Den 'else' Zweig haette er sich uebrigens
> sparen koennen...


Wenn ich den 'else'-Zweig weglasse, dann kommt folgender Fehler:
PAR done!
Process "Place & Route" failed

Sorry.. bin gerade auf dem Sprung.. Werde mich am Wochenende mal genauer 
damit beschaeftigen und eure Tipps mir zu Herzen nehmen.

Ich bezweifle ja auch nicht, dass ich viele Fehler drinnen habe und es 
mir an vielen Grundlagen fehlt. - Diese moechte ich auch nach diesem 
Projekt unbedingt nachholen.. Aber soviel Zeit bleibt mir momentan 
nicht... Nun versuche ich aus der Not heraus mir das aus meinen 
bisherigen "Wissen" alles zusammen zu wurschteln.... In der Hoffnung das 
ich auf einen gruenen Zweig komme.. irgendwie..

Wirklich vielen Dank soweit fuer eure Unterstuetzung. - Ich weiss das 
echt zu schaetzen...

von Fpgakuechle K. (Gast)


Lesenswert?

Fellap schrieb:

> Ich bezweifle ja auch nicht, dass ich viele Fehler drinnen habe und es
> mir an vielen Grundlagen fehlt. - Diese moechte ich auch nach diesem
> Projekt unbedingt nachholen.. Aber soviel Zeit bleibt mir momentan
> nicht... Nun versuche ich aus der Not heraus mir das aus meinen
> bisherigen "Wissen" alles zusammen zu wurschteln.... In der Hoffnung das
> ich auf einen gruenen Zweig komme.. irgendwie..


IMHO ist es eben frustierend zu sehen das es keinerlei Lernfortschritte 
gibt. Im ersten beispiel haben wir Dir gezeigt wie du dem Thema des 
threads
gemäß ordentlich synchron beschreibts. Und im zweiten Beispiel 
wiederholst du den Fehler! Geöhn dir einfach an alle prozeße synchron zu 
schreiben also mit process(clk) ... if rising_edge(clk) ... end if; end 
process;

Den bisheriges Wissen scheint C zu sein, darauf kannst du bei 
HW-beschreibungssprachen nicht bauen, das ist zu Großen teilen mehr 
hinderlich als nützlich.


MfG,

von Christoph Z. (christophz)


Lesenswert?

Fellap schrieb:
> Nun versuche ich aus der Not heraus mir das aus meinen
> bisherigen "Wissen" alles zusammen zu wurschteln.... In der Hoffnung das
> ich auf einen gruenen Zweig komme.. irgendwie..

Viel Glück mit dem Abgabetermin. Investiere deine Zeit lieber in eine 
gute Dokumentation, hat mir jeweils viel gerettet auch wenn das 
eigentliche Ziel nicht erreicht wurde in der geforderten Zeit.

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.