1-Bit-Latch Warnung

Gast #2960536
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
Moderator (Firma: Titel) Persönliche Seite #2960566
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").
Moderator (Firma: Titel) Persönliche Seite #2960671
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...

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