Forum: FPGA, VHDL & Co. Unerklärlicher Latch hat "combinatorial logic" zur Folge auf Spartan601.


von FJ S. (fj_s)


Angehängte Dateien:

Lesenswert?

Hallo Community,

beim Beschreiben (VHDL) meiner ersten Hardware bin ich auf folgendes 
Problem gestoßen:

In meinem Top-Modul (beachte Anhang) möchte ich über einen Inout-Port 
Daten transferieren. Durch die externen Synchronisationssignale FMC_WR 
und FMC_RD (low-aktiv) soll der Lese und Schreibzugriff geregelt werden. 
Im Submodul "u_parallelbus_read" werden die Daten per Flankenerkennung 
registriert und in einen Outputbuffer für die weitere Verarbeitung 
gespeichert. Jetzt bekomme ich aber folgende, unerklärliche Warnings:

WARNING:Xst:737 - Found 1-bit latch for signal 
<FMC_WR_FMC_WR_DLATCH_878_q>. Latches may be...

WARNING:Xst:1710 - FF/Latch <Z_5_o_FMC_WR_DLATCH_883_q> (without init 
value) has a constant value of 0 in block <parallelbus_top>

was nach eigener Recherche auch noch dies zur Folge hat:

Clock Information:
------------------
-----------------------------------------------------+------------------ 
-----------------------+-------+
Clock Signal                                         | Clock buffer(FF 
name)                   | Load  |
-----------------------------------------------------+------------------ 
-----------------------+-------+
FMC_WR_FMC_RD_AND_4580_o(FMC_WR_FMC_RD_AND_4580_o1:O)| 
NONE(*)(FMC_WR_FMC_WR_DLATCH_878_q)     | 5     |
u_parallelbus_read/Rise                              | 
NONE(u_parallelbus_read/Outputstorage_7)| 8     |
CLKIN_P                                              | DCM_SP:CLKFX 
| 7     |
u_converter/Fall                                     | BUFG 
| 70    |
-----------------------------------------------------+------------------ 
-----------------------+-------+
(*) This 1 clock signal(s) are generated by combinatorial logic,
and XST is not able to identify which are the primary clock signals.

Was letztendlich zur Folge hat das mein Programm mit Gatterlaufzeit in 
der Simulation nicht mehr funktioniert.

Hat jemand vielleicht eine Idee wo der Fehler liegt?

Viele Grüße
FJS

von Achim S. (Gast)


Lesenswert?

FJ S. schrieb:
> Hat jemand vielleicht eine Idee wo der Fehler liegt?

Dein erster Fehler ist, ein VHDL-File von 10kB rar-komprimiert 
hochzuladen. Wenn man dir helfen will, muss man erst runterladen und 
entpacken, bevor man den Code tatsächlich sieht ;-)

Was das Latch angeht:

in folgendem Teil setzt du FMC in zwei Fällen entweder auf 0 (im elsif) 
oder auf Z (im else). Aber in der ersten if-Abfrage machst du keine 
Zuweisung an FMC (sollte auf Z gehen). Also muss sich in diesem Fall der 
Wert von FMC "gemerkt" werden. Und weil dieses merken nicht in einem 
getakteten Prozess abläuft, findet es nicht in einem Flip-Flop statt 
sondern in einem Latch.
1
    -- if µC wants to write data, write from FMC to FMC_in 
2
      if ( FMC_WR = '0' and FMC_RD = '1' )then 
3
        FMC_in <= FMC; 
4
    -- if µC wants to read data, write from FMC_out to FMC 
5
      elsif ( FMC_WR = '1' and FMC_RD = '0' )then 
6
        FMC <=  FMC_out; 
7
        FMC_in <= (others => '0');  
8
      else
9
        FMC_in <= (others => '0');
10
        FMC <= (others => 'Z');
11
      end if;

Also: wenn du es wirklich unbedingt ohne Takt machen willst, dann muss 
auch im ersten Teil eine Zuweisung an FMC rein (FMC<= (others => 'Z'))


Auch bei der Flankendetektion hast du noch Probleme. Deine eigentliche 
Flankendetektion nach Lothars Vorlage ist schon mal ganz gut:
1
EdgeDetection : process        
2
 variable Shiftreg : std_logic_vector (1 downto 0) := "00";
3
  begin
4
    wait until rising_edge(clk_read);
5
    Rise <= not shiftreg(1) and shiftreg(0);          -- detect edge
6
    --Fall <= not shiftreg(0) and shiftreg(1); 
7
    Shiftreg := Shiftreg(0) & not WR;     -- read input shift register
8
end process EdgeDetection;

Aber dann benutzt du in einem anderen Prozess Rise als Takt, und das ist 
Quatsch: Rise ist ein normales Signal, dessen Pegel du abfrägst. Es geht 
bei einer Flanke von WR genau für einen Takt (von clk_read) auf high.

Also nutze in ReadCheck_func ebenfalls clk_read als Takt und bau dann 
eine Abfrage "if Rise='1' then..." ein.

von FJ S. (fj_s)


Lesenswert?

Hui, das ging ja flott.

Vielen Dank für die schnelle Antwort, alle Warnings wurden beseitigt und 
ich hab wieder was dazu gelernt.

VG

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


Lesenswert?

Achim S. schrieb:
> Wenn man dir helfen will, muss man erst runterladen und entpacken, bevor
> man den Code tatsächlich sieht ;-)
Wenn das auf dem Handy nur auch ginge...

BTW: wenn hier im Forum eine *.vhd oder *.vhdl Datei angehängt wird, 
dann gibts Syntaxhighlighting gratis.

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.