Unerklärlicher Latch hat "combinatorial logic" zur Folge auf Spartan601.

OP #4377147
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
Angehängte Dateien:
Gast #4377219
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.

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