Forum: FPGA, VHDL & Co. Xilinx Latch Problem


von finalcu (Gast)


Lesenswert?

Hallo Zusammen,

hier ist ein Ausschnitt aus meinem VHDL Code der beim Kompilieren 
Probleme bereitet:
1
  p_memless : process (InputSrcRdyxS, STATExDP, ValuexD)
2
  begin  -- process p_memless
3
4
    -- defaults
5
    STATExDN      <= reset;
6
    InputDstRdyxS <= '0';
7
8
    case STATExDP is
9
      when reset =>
10
        ValuexD  <= 0;
11
        STATExDN <= waitforSrc;
12
      when waitforSrc =>
13
        if InputSrcRdyxS = '1' then
14
          STATExDN <= count;
15
        else
16
          STATExDN <= waitforSrc;
17
        end if;
18
        InputDstRdyxS <= '1';
19
      when count =>
20
        InputDstRdyxS <= '0';
21
        if ValuexD >= 9999 then
22
          STATExDN <= reset;
23
        else
24
          ValuexD <= ValuexD + 1;
25
        end if;
26
        STATExDN <= waitforSrc;
27
      when others => null;
28
                     
29
    end case;
30
    
31
  end process p_memless;
32
33
  p_memzing : process (CLKxCI, RSTxRBI)
34
  begin  -- process p_memzing
35
    if RSTxRBI = '0' then               -- asynchronous reset (active low)
36
      STATExDP <= reset;
37
    elsif CLKxCI'event and CLKxCI = '1' then  -- rising clock edge
38
      STATExDP <= STATExDN;
39
    end if;
40
  end process p_memzing;

Es handelt sich dabei um eine FSM die Daten aus einer FIFO-Queue 
ausliest und dabei einen Zaehler inkrementiert. Die Warnungen die ich 
bekomme lauten wie folgt:

WARNING:Xst:737 - Found 1-bit latch for signal <ValuexD<13>>. Latches 
may be generated from incomplete case or if statements. We do not 
recommend the use of latches in FPGA/CPLD designs, as they may lead to 
timing problems.
WARNING:Xst:737 - Found 1-bit latch for signal <ValuexD<12>>. Latches 
may be generated from incomplete case or if statements. We do not 
recommend the use of latches in FPGA/CPLD designs, as they may lead to 
timing problems.

etc.

Mir ist klar, dass ich im waitforSrc state keine ValuexD Zuweisung mache 
aber dort soll ValuexD ja auch denselben Wert behalten. Und im naechtsen 
state habe ich eine unvollstaendige if-Schleife aber wenn ich nach der 
Bedingung "if ValuexD >= 9999 then" eine Zuweisung mache z.B. ValuexD <= 
0, dann kommen die Warnungen immernoch...

Gruss und Danke.

von berndl (Gast)


Lesenswert?

Deine Sensitivity-Liste im ersten Prozess ist kompletter Muell! Damit 
waere (falls hoffentlich vorhanden Simulation!=Implementierung).

Und dein 'case' im ersten Prozess ist nicht vollstaendig. Wenn keiner 
deiner Faelle eintritt behaelt ValuexD sowie STATExDN und auch 
InputDstRdyxS den alten Wert --> Latch!

Schreib' diese ganzen Sachen mal alle als 'concurrent' statements hin 
und du wirst deine Fehler sofort merken...

Und das ganze Problem kannst du einfach umgehen, indem du die beiden 
Prozesse in einen einzigen getakteten reinschreibst...

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


Lesenswert?

Der Synthesizer liegt falsch, und es ist noch viel schlimmer:
du hast eine kombinatorische Schleife gebastelt!

Der übliche Anfängerfehler bei der Zwei-Prozess-Schreibweise:
du zählst in einem kombinatorischen Prozess einen Zähler hoch...
http://www.lothar-miller.de/s9y/archives/42-Kombinatorische-Schleifen.html

von berndl (Gast)


Lesenswert?

ups du hast ja 2 Defaultzuweisungen im ersten Prozess. Deshalb kommt im 
Report auch nur das dritte Signal...

Ansonsten gilt auch was Lothar angemerkt hat...

von berndl (Gast)


Lesenswert?

da wir ja alle heutzutage breite Bildschirme haben, bietet sich 
'concurrent' geradezu an:
1
InputDstRdyxS <= '1' when STATExDP = waitforSrc else
2
                 '0';
1
STATExDN <= waitforSrc when STATExDP = reset else
2
            count when STATExDP = waitforSrc and InputSrcRdyxS = '1' else
3
            waitforSrc when STATExDP = waitforSrc else
4
            waitforSrc when STATExDP = count else -- das steht in deinem Code!
5
            reset;
Deine Zuweisung in der vorletzten Zeile verpufft, weil im Prozess die 
letzte (hier unconditional) gewinnt.

Und ueber die Loop mit dem Counter hat ja Lothar schon was dazu 
geschrieben.

Eine Frage habe ich aber: Wieso werden solche einfachen Sachen wie das 
hier immer von euch in einen Prozess geschrieben? Mit 'concurrent' sieht 
das alles viel einfacher aus...

von user (Gast)


Lesenswert?

finalcu schrieb:
> Und im naechtsen
> state habe ich eine unvollstaendige if-Schleife aber wenn ich nach der
> Bedingung "if ValuexD >= 9999 then" eine Zuweisung mache z.B. ValuexD <=
> 0, dann kommen die Warnungen immernoch...

http://www.if-schleife.de/

von finalcu (Gast)


Lesenswert?

Alles klar, habs verstanden. Ist eigentlich logisch. Habe nun eine 
zusaetzliche Variable Value_next eingefuehrt welche im kombinatorischen 
Prozess zugewiesen wird und im zweiten prozess erfolgt dann ValuexD <= 
Value_next.

Funktioniert wunderbar (ohne Warnungen).

Gruss und Danke.

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


Lesenswert?

finalcu schrieb:
> Habe nun eine zusaetzliche Variable Value_next eingefuehrt welche im
> kombinatorischen Prozess zugewiesen wird und im zweiten prozess erfolgt
> dann ValuexD <= Value_next.
Ja, kann man machen, muss man aber nicht...  ;-)
Ich bevorzuge die Ein-Prozess-Schreibweise. Da kann sowas per 
Definition gar nicht passieren.

> eine zusaetzliche Variable ... eingefuehrt
Da bin ich mir nicht so sehr sicher, dass das eine VARIABLE ist. Der 
Unterschied zwischen Variablen und Signalen ist in VHDL nämlich ein 
eklatanter!
Siehe den Beitrag "Variable vs Signal"

> Funktioniert wunderbar (ohne Warnungen).
Gut so.
Wobei zwischen "keine Warnungen" und "funktioniert" noch Welten liegen 
können...

von finalcu (Gast)


Lesenswert?

Lothar Miller schrieb:
> Da bin ich mir nicht so sehr sicher, dass das eine VARIABLE ist. Der
> Unterschied zwischen Variablen und Signalen ist in VHDL nämlich ein
> eklatanter!
> Siehe den Beitrag "Variable vs Signal"

Ich meine natuerlich Signal. Der Unterschied ist mir bekannt.

Danke nochmals fuer die Hilfe.

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.