mikrocontroller.net

Forum: FPGA, VHDL & Co. Inferring latch


Autor: Thomas Pototschnig (pototschnig)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Quartus2 V7.1 meckert neuerdings darüber, dass ctr_48 ctr90_48, 
ctr135_48 und ctr225_48 als latch implementiert werden:
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)
  process (clk, reset)
    variable step48 : unsigned (63 downto 0) :=   X"1938ECE0531174F2";
    variable ctr_48 : unsigned (63 downto 0) :=   X"FFC0000000000000";
    variable ctr90_48 : unsigned (63 downto 0):=  X"3FC0000000000000";
    variable ctr135_48 : unsigned (63 downto 0):= X"5FC0000000000000";
    variable ctr225_48 : unsigned (63 downto 0):= X"9FC0000000000000";
    variable curctr : unsigned (8 downto 0);
    
    variable abschnittu : unsigned (1 downto 0);
    variable indexu : unsigned (6 downto 0);
    

  begin
    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
      ctr_48 := ctr_48 + step48;
      ctr90_48 := ctr90_48 + step48;
      ctr135_48 := ctr135_48 + step48;
      ctr225_48 := ctr225_48 + step48;

      case phase is
        when "00" => curctr := ctr_48 (63 downto 55);
        when "01" => curctr := ctr90_48 (63 downto 55);
        when "10" => curctr := ctr135_48 (63 downto 55);
        when "11" => curctr := ctr225_48 (63 downto 55);
        when others => curctr := (others=>'0');
      end case;
      
      indexu := curctr (6 downto 0);  -- index f�r die tabelle

      case abschnittu(1) is
        when '1' => data <= conv_std_logic_vector(-signed(output),16);
        when '0' => data <= conv_std_logic_vector(signed(output),16);
        when others => data <= (others=>'0');
      end case;

      abschnittu := curctr (8 downto 7);

      case abschnittu(0) is
        when '0' => adr <= conv_std_logic_vector(indexu,7);
        when '1' => adr <= conv_std_logic_vector(127-indexu,7);      
        when others => adr <= (others=>'0');
      end case;
    end if;
  end process;  

Autor: der andere (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)?

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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? ;-)

Autor: Thomas Pototschnig (pototschnig)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas Pototschnig (pototschnig)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas Pototschnig (pototschnig)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Da Micha (damicha)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.

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

Gruß DaMicha.

Autor: Thomas Pototschnig (pototschnig)
Datum:

Bewertung
0 lesenswert
nicht 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

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.