Probleme bei VHDL Synthese

Gast #672445
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 ?
#672503
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?
Gast #672525
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;
Gast #672537
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 ???
Gast #672544
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).
Gast #672554
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.
Admin Persönliche Seite #672584
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.
Gast #672712
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.
#672763
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
Gast #672774
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.
Admin Persönliche Seite #672967
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?
Angehängte Dateien:
Gast #673045
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.
Admin Persönliche Seite #673070
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.
#673097
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

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