Forum: FPGA, VHDL & Co. 1-Bit-Latch Warnung


von baumhous3 (Gast)


Lesenswert?

Hallo zusammen,
ich habe ein Problem. Bin aktuell dabei in VHDL ein kleines Programm für 
die Uni zu schreiben, nun bin ich soweit fertig nur bekomme ich folgende 
Fehlermeldung:
1
WARNING:Xst:737 - Found 1-bit latch for signal <HB_bot>. 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.
2
WARNING:Xst:737 - Found 1-bit latch for signal <HB_bot1>. 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.

Ich denke der Fehler liegt in folgendem Programmteil. Nun weiß ich aber 
nicht wie ich das ganze anders schreiben kann. Hoffe ihr könnt mir da 
helfen.
1
process(clk,pwm_out,delayt,delayb)
2
begin
3
  -- Totzeit HB_top
4
  if rising_edge(clk) then
5
    if pwm_out = '1' AND (delayt < 199)         
6
    then delayt <= delayt + 1;
7
        delayb <= 0;
8
  elsif (delayt = 199) then HB_top <= pwm_out;
9
    end if;
10
  end if;
11
  
12
  -- Totzeit HB_bot
13
  if pwm_out = '0' AND (delayb < 199) 
14
    then delayb <= delayb + 1;
15
        delayt <= 0;
16
  elsif (delayb = 199) then HB_bot <= NOT pwm_out;
17
  end if;
18
end process;

Gruß,
baumhous3

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


Lesenswert?

Man mischt nicht einen getakteten mit einem kombinatorischen Prozess:
1
process(clk,pwm_out,delayt,delayb)
2
begin
3
  -- Totzeit HB_top --- getaktet
4
  if rising_edge(clk) then
5
     ...
6
  end if;
7
  
8
  -- Totzeit HB_bot --- ohne Takt = kombinatorisch!
9
  if pwm_out = '0' AND (delayb < 199) 
10
     then delayb <= delayb + 1; --- hoppala, jetzt aber: eine kombinatorische Schleife!
11
     ...
12
  end if;
13
end process;
Zudem ist das Latch noch das kleinste Problem.
Viel schlimmer ist die versteckte kombinatorische Schleife:
http://www.lothar-miller.de/s9y/archives/42-Kombinatorische-Schleifen.html


Das hier ist das erste schlechte Zeichen:
1
process(clk,pwm_out,delayt,delayb)
Faustregeln:
In einem kombinatorischen Prozess steht kein "clk".
In einem getakteten Prozess sind keine anderen Signale ausser "clk"
(und schlimmstenfalls noch "rst").

von baumhous3 (Gast)


Lesenswert?

Okay, aber wie könnte ich das ganze denn aufteilen ohne das ich diese 
hinbekomme? Hänge da aktuell auf dem Schlauch :(

von Lutz Laserblick (Gast)


Lesenswert?

baumhous3 schrieb:
> Hänge da aktuell auf dem Schlauch :(

Nicht nur den Programmierstil ist sesaströs, auch im Deutschen greifts 
du auf zu "Stilblüten". Mang hängt nicht auf dem schlauch, man steht auf 
diesem!

SCNR

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


Lesenswert?

Lutz Laserblick schrieb:
> sesaströs
Gefällt mir, dieses neue Wort...
> Mang
Mangomang!

baumhous3 schrieb:
> Okay, aber wie könnte ich das ganze denn aufteilen
Was?
> ohne das ich diese hinbekomme?
Welche?

Du willst die kombinatorische Schleife weghaben?
Dann mach einen Takt in den Zähler. Denn ein Zähler braucht 
Speicherglieder, um den aktuellen Zählerwert festzuhalten.
Und Speicherglieder sind in FPGAs immer Flipflops.
Und Fipflops brauchen einen Takt.

Probiers einfach mal so:
1
process(clk)
2
begin
3
  -- Totzeit HB_top
4
  if rising_edge(clk) then
5
6
    if pwm_out = '1' AND (delayt < 199) then 
7
        delayt <= delayt + 1;
8
        delayb <= 0;
9
    elsif (delayt = 199) then 
10
        HB_top <= pwm_out;
11
    end if;
12
--  end if;  --<<< mach das hier hier weg!!!
13
  
14
  -- Totzeit HB_bot
15
    if pwm_out = '0' AND (delayb < 199) then 
16
      delayb <= delayb + 1;
17
      delayt <= 0;
18
    elsif (delayb = 199) then 
19
      HB_bot <= NOT pwm_out;
20
    end if;
21
22
  end if; --<<< und dafür hier rein!
23
24
end process;
Also: nicht einfach nur irgendwelchen Code irgendwo herkopopieren, 
sondern auch kapieren...

von Bronco (Gast)


Lesenswert?

Lothar Miller schrieb:
> herkopopieren
Gefällt mir, dieses neue Wort...

(Sorry, muß gerad auf ein Bitfile warten und hab nix besseres zu tun)

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


Lesenswert?

Bronco schrieb:
>> herkopopieren
> Gefällt mir, dieses neue Wort...
Musste ich auch lange für üben...   ;-)

von Bronco (Gast)


Lesenswert?

Könnte glatt von Helge Schneider sein:
Kopieren-po-pieren

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.