Forum: FPGA, VHDL & Co. Inferring latch


von Thomas P. (pototschnig)


Lesenswert?

Hallo,

Quartus2 V7.1 meckert neuerdings darüber, dass ctr_48 ctr90_48, 
ctr135_48 und ctr225_48 als latch implementiert werden:
1
Inferring latch(es) for signal or variable "ctr_48" which holds its previous value in one or more paths through the process

Woher kommt denn das plötzlich? Ich kann mich nicht erinnern früher mal 
(frühere Version von Quartus2) die Warnung bekommen haben ... und ich 
weiß auch nicht wo hier das Problem sein soll ...

Hier mal mein Prozess (der Rest außenrum ist nur entity und component 
deklaration)
1
  process (clk, reset)
2
    variable step48 : unsigned (63 downto 0) :=   X"1938ECE0531174F2";
3
    variable ctr_48 : unsigned (63 downto 0) :=   X"FFC0000000000000";
4
    variable ctr90_48 : unsigned (63 downto 0):=  X"3FC0000000000000";
5
    variable ctr135_48 : unsigned (63 downto 0):= X"5FC0000000000000";
6
    variable ctr225_48 : unsigned (63 downto 0):= X"9FC0000000000000";
7
    variable curctr : unsigned (8 downto 0);
8
    
9
    variable abschnittu : unsigned (1 downto 0);
10
    variable indexu : unsigned (6 downto 0);
11
    
12
13
  begin
14
    if reset='0' then
15
      ctr_48 := X"FFC0000000000000";
16
      ctr90_48 := X"3FC0000000000000";
17
      ctr135_48 := X"5FC0000000000000";
18
      ctr225_48 := X"9FC0000000000000";
19
      data <= (others => '0');
20
    elsif clk'event and clk='1' then
21
      ctr_48 := ctr_48 + step48;
22
      ctr90_48 := ctr90_48 + step48;
23
      ctr135_48 := ctr135_48 + step48;
24
      ctr225_48 := ctr225_48 + step48;
25
26
      case phase is
27
        when "00" => curctr := ctr_48 (63 downto 55);
28
        when "01" => curctr := ctr90_48 (63 downto 55);
29
        when "10" => curctr := ctr135_48 (63 downto 55);
30
        when "11" => curctr := ctr225_48 (63 downto 55);
31
        when others => curctr := (others=>'0');
32
      end case;
33
      
34
      indexu := curctr (6 downto 0);  -- index f�r die tabelle
35
36
      case abschnittu(1) is
37
        when '1' => data <= conv_std_logic_vector(-signed(output),16);
38
        when '0' => data <= conv_std_logic_vector(signed(output),16);
39
        when others => data <= (others=>'0');
40
      end case;
41
42
      abschnittu := curctr (8 downto 7);
43
44
      case abschnittu(0) is
45
        when '0' => adr <= conv_std_logic_vector(indexu,7);
46
        when '1' => adr <= conv_std_logic_vector(127-indexu,7);      
47
        when others => adr <= (others=>'0');
48
      end case;
49
    end if;
50
  end process;

von der andere (Gast)


Lesenswert?

wenn du hierfür

if reset='0' then
      ctr_48 := X"FFC0000000000000";
      ctr90_48 := X"3FC0000000000000";
      ctr135_48 := X"5FC0000000000000";
      ctr225_48 := X"9FC0000000000000";
      data <= (others => '0');
elsif clk'event and clk='1' then
...

noch einen else-zweig hinzufügst mit gleichem inhalt wie der asynchrone 
reset? hast du es schonmal mit einem synchronem reset probiert (falls 
das möglich ist)?

von Falk (Gast)


Lesenswert?

@ Thomas Pototschnig (pototschnig)

Lass das mit den Variablen sein. Das ist zu 99% unnötig. Mit Signalen 
ergibt das zu 100% saubere FlipFlops.

Ausserdem scheint das ein kleiner Bug drin zu sein. indexu wird nciht 
verwendet, dafür abschnittu zweimal.


MfG
Falk

P.S. Da baut wohl jemand eine Multiphase DDS? ;-)

von Thomas P. (pototschnig)


Lesenswert?

Irgendwie hängts mit dem Reset zusammen, aber den Grund versteh ich 
nicht ganz ... Das ist nur eine Komponente und ich hab alle nach dem 
gleichen Schema programmiert und nirgendswo anders gibts die Warnung ...

Wenn ich die Initialisierung der ctr_xxx Variablen aus dem Reset 
auskommentier, kommt die Warnung nicht mehr.

Ich probiers mal mit einem synchronen Reset, das wollte ich eh schon 
lang mal umbauen ...

Sieht für mich nach einem Quartus2-Bug aus irgendwie ...

Mfg
Thomas Pototschnig

von Thomas P. (pototschnig)


Lesenswert?

Falk wrote:
> @ Thomas Pototschnig (pototschnig)
>
> Lass das mit den Variablen sein. Das ist zu 99% unnötig. Mit Signalen
> ergibt das zu 100% saubere FlipFlops.

Bisher hatte ich mit Variablen kein Problem ... Mir ist nur jetzt grad 
mit der neuen Quartus-Version die Warnung aufgefallen ... und Latches 
sind ja böse in der Regel.

> Ausserdem scheint das ein kleiner Bug drin zu sein. indexu wird nciht
> verwendet, dafür abschnittu zweimal.

Interessant ... ist mir nie aufgefallen, aber ich lass es lieber so wie 
es ist, weil es so richtig funktioniert :-)


> P.S. Da baut wohl jemand eine Multiphase DDS? ;-)

Jup - das sind die DDS für und von meinem PAL-Encoder g

Mfg
Thomas Pototschnig

von Thomas P. (pototschnig)


Lesenswert?

Mit synchronem Reset und Initialisierung der ctr-Variablen kommt die 
Warnung auch nicht ... wth ist denn das? G

Das ist doch bestimmt ein Quartus-Bug :-)

Mfg
Thomas Pototschnig

von Da M. (damicha)


Lesenswert?

Hallo.

Versuche mal step48 auch im reset Zweig zu setzen bzw. deklariere step48 
als constant.

Gruß DaMicha.

von Thomas P. (pototschnig)


Lesenswert?

Da Micha wrote:
> Hallo.
>
> Versuche mal step48 auch im reset Zweig zu setzen bzw. deklariere step48
> als constant.
>
> Gruß DaMicha.

Hallo,

ich hatte step48 sogar mal als reine Konstane zu den ctr-Variablen 
dazugezählt, aber das hat das Problem leider nicht beseitigt.

Synchroner Reset kommt mir aber eh nicht ungelegen, da sich der 
Asynchronen Reset teilweise merkwürdig verhalten hat ...

Mfg
Thomas Pototschnig

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.