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


von AlexW (Gast)


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:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
4
entity DigitalFilter is
5
  port (  CHA    :  in    std_logic;
6
        CHB    :  in   std_logic;
7
        CLK    :  in   std_logic;
8
        RST    :  in   std_logic;
9
        CHA_FILT  :  out  std_logic;
10
        CHB_FILT  :  out  std_logic);
11
end DigitalFilter;
12
13
14
architecture VERHALTEN of DigitalFilter is
15
16
  -- Hilfssignale
17
  signal CHA_TEMP : std_logic;
18
  signal CHB_TEMP : std_logic;
19
20
  begin
21
    
22
    ChannelA:  process ( CLK, RST )
23
    -- Variabelndeklaration
24
    variable BUFFER_A : std_logic_vector (3 downto 0);
25
    begin
26
      if RST = '1' then 
27
        BUFFER_A := "0000";
28
        CHA_TEMP <= '0';
29
      elsif CLK = '1' and CLK'event then
30
        BUFFER_A (2 downto 0) := BUFFER_A (3 downto 1);
31
        BUFFER_A (3) := CHA;
32
        if BUFFER_A (3 downto 0) = "0000" then
33
          CHA_TEMP <= '0';
34
        end if;
35
        if BUFFER_A (3 downto 0) = "1111" then
36
          CHA_TEMP <= '1';
37
        end if;
38
      end if;
39
    end process ChannelA;
40
  
41
    CHA_FILT <= CHA_TEMP;
42
  
43
    ChannelB:  process ( CLK, RST )
44
    -- Variabelndeklaration
45
    variable BUFFER_B : std_logic_vector (3 downto 0);
46
    begin
47
      if RST = '1' then 
48
        BUFFER_B := "0000";
49
        CHB_TEMP <= '0';
50
      elsif CLK = '1' and CLK'event then
51
        BUFFER_B (2 downto 0) := BUFFER_B (3 downto 1);
52
        BUFFER_B (3) := CHB;
53
        if BUFFER_B (3 downto 0) = "0000" then
54
          CHB_TEMP <= '0';
55
        end if;
56
        if BUFFER_B (3 downto 0) = "1111" then
57
          CHB_TEMP <= '1';
58
        end if;
59
      end if;
60
    end process ChannelB;
61
  
62
    CHB_FILT <= CHB_TEMP;
63
    
64
end VERHALTEN;

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

von Jan M. (mueschel)


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?

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

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

von Fpgakuechle K. (Gast)


Lesenswert?

versuch das:
1
architecture VERHALTEN of DigitalFilter is
2
3
  -- Hilfssignale
4
   signal BUFFER_A : std_logic_vector (3 downto 0);
5
   signal BUFFER_B : std_logic_vector (3 downto 0);
6
  begin
7
   ChannelA:  process ( CLK, RST )
8
    begin
9
      if RST = '1' then 
10
        BUFFER_A <= "0000";
11
        CHA_FILT <= '0';
12
      elsif CLK = '1' and CLK'event then
13
        BUFFER_A  <= CHA & BUFFER_A (3 downto 1);
14
         if BUFFER_A  = "0000" then
15
          CHA_FILT <= '0';
16
        elsif BUFFER_A = "1111" then
17
          CHA_FILT <= '1';
18
        end if;
19
      end if;
20
    end process ChannelA;
21
  
22
    ChannelB:  process ( CLK, RST )
23
      begin
24
      if RST = '1' then 
25
        BUFFER_B <= "0000";
26
        CHB_FILT <= '0';
27
      elsif CLK = '1' and CLK'event then
28
        BUFFER_B <= CHB & BUFFER_B (3 downto 1);
29
        if BUFFER_B = "0000" then
30
          CHB_FILT <= '0';
31
        elsif BUFFER_B  = "1111" then
32
          CHB_FILT <= '1';
33
        end if;
34
      end if;
35
    end process ChannelB;  
36
end VERHALTEN;

von AlexW (Gast)


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

von Fpgakuechle K. (Gast)


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

von Jan M. (Gast)


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.

von Andreas S. (andreas) (Admin) Benutzerseite


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.

von T.M. (Gast)


Lesenswert?

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

von AlexW (Gast)


Angehängte Dateien:

Lesenswert?

Guten Morgen ;-),

ich hoffe das Schematic können alle anschauen.

von Falk B. (falk)


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

von T.M. (Gast)


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.

von Falk B. (falk)


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

von Andreas S. (andreas) (Admin) Benutzerseite


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.

von FPGAküchle (Gast)


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

von Falk B. (falk)


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

von Andreas S. (andreas) (Admin) Benutzerseite


Angehängte Dateien:

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?

von FPGAküchle (Gast)


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.

von Andreas S. (andreas) (Admin) Benutzerseite


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.

von Falk B. (falk)


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

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.