www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Probleme bei VHDL Synthese


Autor: AlexW (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
bei der VHDL Synthese (Xilinx ISE WEBPACK 8.1 & Target: XC9500 Familie) 
bekomme ich folgende Warnmeldungen:

WARNING:Xst:1780 - Signal <BUFFER_A<1:0>> is never used or assigned.
WARNING:Xst:1780 - Signal <BUFFER_B<1:0>> is never used or assigned.

zu diesem Code:
library ieee;
use ieee.std_logic_1164.all;

entity DigitalFilter is
  port (  CHA    :  in    std_logic;
        CHB    :  in   std_logic;
        CLK    :  in   std_logic;
        RST    :  in   std_logic;
        CHA_FILT  :  out  std_logic;
        CHB_FILT  :  out  std_logic);
end DigitalFilter;


architecture VERHALTEN of DigitalFilter is

  -- Hilfssignale
  signal CHA_TEMP : std_logic;
  signal CHB_TEMP : std_logic;

  begin
    
    ChannelA:  process ( CLK, RST )
    -- Variabelndeklaration
    variable BUFFER_A : std_logic_vector (3 downto 0);
    begin
      if RST = '1' then 
        BUFFER_A := "0000";
        CHA_TEMP <= '0';
      elsif CLK = '1' and CLK'event then
        BUFFER_A (2 downto 0) := BUFFER_A (3 downto 1);
        BUFFER_A (3) := CHA;
        if BUFFER_A (3 downto 0) = "0000" then
          CHA_TEMP <= '0';
        end if;
        if BUFFER_A (3 downto 0) = "1111" then
          CHA_TEMP <= '1';
        end if;
      end if;
    end process ChannelA;
  
    CHA_FILT <= CHA_TEMP;
  
    ChannelB:  process ( CLK, RST )
    -- Variabelndeklaration
    variable BUFFER_B : std_logic_vector (3 downto 0);
    begin
      if RST = '1' then 
        BUFFER_B := "0000";
        CHB_TEMP <= '0';
      elsif CLK = '1' and CLK'event then
        BUFFER_B (2 downto 0) := BUFFER_B (3 downto 1);
        BUFFER_B (3) := CHB;
        if BUFFER_B (3 downto 0) = "0000" then
          CHB_TEMP <= '0';
        end if;
        if BUFFER_B (3 downto 0) = "1111" then
          CHB_TEMP <= '1';
        end if;
      end if;
    end process ChannelB;
  
    CHB_FILT <= CHB_TEMP;
    
end VERHALTEN;

Kann mir jemand sagen was ich da falsch gemacht habe ?
Warum werden da FlipFlops rausoptimiert ?

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Variablen sollte man in VHDL meiden wo es nur geht - und hier ist 
eigentlich kein Grund welche zu verwenden.
Grund: Soetwas wie eine Variable, die ihren Wert instantan ändert, gibt 
es in Hardware nicht - die Synthese muss also irgendwie versuchen, das 
in Hardware zu realisieren und das scheint hier nicht ganz zu 
funktionieren.
PS: Ist der asynchrone Reset wirklich notwendig?

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Poste doch mal einen Screenshot vom RTL Schematic, würde mich 
interessieren was da entstanden ist.

Autor: Fpga Kuechle (fpgakuechle) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
versuch das:
architecture VERHALTEN of DigitalFilter is

  -- Hilfssignale
   signal BUFFER_A : std_logic_vector (3 downto 0);
   signal BUFFER_B : std_logic_vector (3 downto 0);
  begin
   ChannelA:  process ( CLK, RST )
    begin
      if RST = '1' then 
        BUFFER_A <= "0000";
        CHA_FILT <= '0';
      elsif CLK = '1' and CLK'event then
        BUFFER_A  <= CHA & BUFFER_A (3 downto 1);
         if BUFFER_A  = "0000" then
          CHA_FILT <= '0';
        elsif BUFFER_A = "1111" then
          CHA_FILT <= '1';
        end if;
      end if;
    end process ChannelA;
  
    ChannelB:  process ( CLK, RST )
      begin
      if RST = '1' then 
        BUFFER_B <= "0000";
        CHB_FILT <= '0';
      elsif CLK = '1' and CLK'event then
        BUFFER_B <= CHB & BUFFER_B (3 downto 1);
        if BUFFER_B = "0000" then
          CHB_FILT <= '0';
        elsif BUFFER_B  = "1111" then
          CHB_FILT <= '1';
        end if;
      end if;
    end process ChannelB;  
end VERHALTEN;

Autor: AlexW (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Fpga Kuechle
Wenn man einem Signal einen Wert zuweist, dann wird der doch erst am 
Ende des Prozesses aktualisiert? Damit wird verschiebt sich alles um 
einen Takt/ Prozessaufruf...? hmmm..

@Jan M.
Dann stößt das Synthese Tool an seine Grenzen ? kann man sich die 
Warnmeldung irgendwie erklären weil jetzt weiß ich ja dann nie wann man 
Variablen verwenden darf und wann nicht ???

Autor: Fpga Kuechle (fpgakuechle) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AlexW wrote:
> @Fpga Kuechle
> Wenn man einem Signal einen Wert zuweist, dann wird der doch erst am
> Ende des Prozesses aktualisiert? Damit wird verschiebt sich alles um
> einen Takt/ Prozessaufruf...? hmmm..

Ja, du willst doch FF fuer Buffer_, FF sind nun mal um einen Takt 
verzögert.
Und CHB_FILT schaltet auch nicht jeden takt sondern erst nach frühestens 
4.
Also ist dieses Signal auch ein FF (mit Verzögerung).

Autor: Jan M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@AlexW: Zeige uns deine RTL Schematic und du weißt, warum diese Warnung 
kommt.
Zur Benutzung von Variablen:
1) Variablen benutzt man nicht.
2) Wenn es nicht ohne geht, tritt 1) in Kraft.
3) Wenn es wirklich nicht ohne geht, dann benutzt man sie.

Genau wie ein "after 10 ns" kann eine Variable halt nicht in Hardware 
benutzt werden. Natürlich kann man sie irgendwie umschreiben. Bei 
"after" kann die Synthese das gar nicht (obwohl es in den allermeisten 
Fällen doch einen Weg gäbe, es zu tun) und bei Variablen kann sie es 
häufig.

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Variablen sind nichts mysteriöses. In diesem Fall gibt es für die 
Synthese eigentlich keinen Grund sich so anzustellen, das ist 
straightforward: daraus dass die Variable vor der ersten Zuweisung 
gelesen wird ergibt sich ein FlipFlop; daraus dass der zugewiesene Wert 
gleich weiterverarbeitet wird ergibt sich, dass die restliche Logik im 
Prozess mit den FlipFlop-Eingängen arbeitet. Naja, warten wir mal auf 
den schematic.

Autor: T.M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
BUFFER_A (2 downto 0) := BUFFER_A (3 downto 1);

Naja, die Variable wird ja im Prinzip nicht gelesen, bevor sie 
geschrieben wird, sondern sie wird gleichzeitig gelesen und beschrieben, 
zumindestens Teile davon (2 downto 1). Das kann schon zur Irretierung 
des Synthesetools führen. Was anders wäre es, wenn der Variable ein 
anderes Objekt als sich selbst zugeweisen wird, da wäre alles klar.

Autor: AlexW (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen ;-),

ich hoffe das Schematic können alle anschauen.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ T.M. (Gast)

>BUFFER_A (2 downto 0) := BUFFER_A (3 downto 1);

>Naja, die Variable wird ja im Prinzip nicht gelesen, bevor sie
>geschrieben wird, sondern sie wird gleichzeitig gelesen und beschrieben,
>zumindestens Teile davon (2 downto 1). Das kann schon zur Irretierung
>des Synthesetools führen.

Es irritiert nicht nur, es IST eine elementarer Unterschied in VHDL. UNd 
weil man den immer wieder schwer verclickern kann, sollen vor allem 
Anfängr die Finger von Variablen loassen? Wo ist das Problem?

MFG
Falk

Autor: T.M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieso sollte Ich ein Problem damit haben? Ich habe nur darauf 
hingewiesen, würde Variablen selber so nicht verwenden. Wenn ich FFs 
haben will, dann lese ich die Variable zuerst, bevor ich sie beschreibe, 
aber beschreibe sie nicht mit (Teilen von) sich selbst, wie es hier 
gemacht wurde.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ T.M. (Gast)

>Wieso sollte Ich ein Problem damit haben?

Wer sagt denn das? Ich? Nein, das war indirekt an den OP und alle 
Variablenfetischtisten gerichtet. ;-)

MfG
Falk

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Falk
> Es irritiert nicht nur, es IST eine elementarer Unterschied in VHDL.

Wo ist der Unterschied zwischen
a(2 downto 0) := a(3 downto 1);
und
temp := a(3 downto 1);
a(2 downto 0) := temp;
?

@Alexw: wenn ich ISE hier hätte hätte ich den Code auch selbst 
synthetisieren können, poste doch lieber mal ein Bild.

Autor: FPGAküchle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
IMHO entspricht das Problem dem unterschied zw.:

 a(2 downto 0) := a(3 downto 1);
und
 a(2 downto 0) := temp;
 temp := a(3 downto 1);


also die lebensdauer einer variablen

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Andreas Schwarz (andreas)

>> Es irritiert nicht nur, es IST eine elementarer Unterschied in VHDL.

>Wo ist der Unterschied zwischen
>a(2 downto 0) := a(3 downto 1);
>und
>temp := a(3 downto 1);
>a(2 downto 0) := temp;

Ich meinte zwischen Variablen und Signalen.

MFG
Falk

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Das Bit 0 im Register ist definitiv überflüssig, weil es bei der
Zuweisung sofort überschrieben wird. Das Schieberegister ist also nur 3
Bit lang. Bleibt nur noch die Frage warum auch das Bit 1 wegoptimiert
wird. Ich bin mir gar nicht mehr sicher dass es sich dabei um einen
Fehler handelt, siehe Anhang (ISE 9.2, selbe Warnung). Verdächtig ist,
dass CHA_FILT an das Netzwerk vor dem FlipFlop-Eingang zurückgeführt
wird. Könnte da doch noch das im richtige Verhalten rauskommen?

Autor: FPGAküchle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jungs, die Frage ist ob Variablen nach Abarbeitung des Processes ihren 
Wert
behalten oder nicht! IMHO tun sie es nicht, es sind einfach nur 
Leitungen, keine Speicher.

Und so macht XST auch die Schaltung draus, es verbindet CHB direkt mit 
BUFFER_B[3], und BUFFER_B[2] mit BUFFER_B[3].
Die unteren beiden bits der variable werden bei jedem Aufruf 
(Taktflanke) neuinitialiert, entsprechen also offenen Leitungen. Also 
fliegen sie aus der synthese.

Wie gesagt die lebensdauer einer Variable ist der Schlüssel zur Antwort.
Signale werden dagegen nur einmal initialisiert.

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Variablen behalten schon ihren Wert, deshalb macht XST auch FlipFlops 
daraus. So wie ich das gelernt habe wird eine Variable dann zum 
FlipFlop, wenn sie in einem Prozess vor der ersten Zuweisung gelesen 
wird (http://www.vhdl-online.de/~vhdl/tutorial/deutsch/t_216.htm). 
Bisher hat das immer mit dem was ich als Syntheseergebnis gesehen habe 
übereingestimmt.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ FPGAküchle (Gast)

>behalten oder nicht! IMHO tun sie es nicht, es sind einfach nur
>Leitungen, keine Speicher.

Irrtum, Variablen können auch zu FlipFlops werden. Allerdings kann das 
bisweilen daneben gehen, weil die Unterscheidung in VHDL eben etwas 
kniffelig ist. Aber wir drehen uns im Kreis. Nehmt Signale und gut ist.

MFG
Falk

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.