busy-Flag richtig setzen

Gast #3033779
Lesenswert?

Hallo zusammen,

ich habe einen Prozess, der während seiner Aktivität ein busy-Flag 
ausgeben soll.

Dabei wird ein start-Signal angelegt, welches aber nur für einen Takt 
high ist.
Daraufhin soll ein counter gestartet werden und zwar solange, bis der 
Counter einen bestimmten Wert erreicht hat. Während dieser Zeit soll das 
busy-Flag gesetzt bleiben und erst beim Erreichen des Counters wieder 
auf Null gesetzt werden und alles geht erst mit einem start-Signal 
wieder los.

Dazu habe ich folgendes probiert:
1
busy_flag : PROCESS(clk, res)
2
begin
3
  IF res = '1' THEN
4
     counter <= (others => '0');
5
     busy <= '0';
6
  ELSIF rising_edge(CLK) THEN
7
     IF start = '1' THEN                  -- für einen Takt start = 1
8
        busy <= '1';                      -- busy länger als einen Takt setzen
9
     END IF;                              
10
     IF busy <= '1' THEN                  -- sobald busy = 1
11
        counter <= counter + 1;           -- counter hochzählen
12
        IF and_reduce(counter) = '1' THEN -- wenn counter am Maximum
13
           rdy <= '1';                    -- ready flag auf 1 setzen
14
           busy <= '0';                   -- busy flag zurücksetzen
15
        ELSE                              -- solange counter noch zählt
16
           rdy <= '0';                    -- ready flag ist 0
17
           busy <= '1';                   -- busy bleibt auf 1
18
        END IF;
19
     END IF;
20
  END IF;
21
END PROCESS;

Leider geht das busy-Signal schon mit der ersten Flanke nach dem Reset 
auf 1, damit fängt der Counter an zu zählen und alles geht schief.

Erkennt ihr meine Beschreibung in dem VHDL Code wieder, oder habe ich 
einen groben Schnitzer gemacht.

Man könnte die Sache auch einfach mit einer FSM umgehen (ein state auf 
start warten, zweiter state busy=1 und counter zählen und dann wieder 
zurück), aber das wollte ich bewusst vermeiden.

Hat jemand einen Hinweis?
Liegt es an der sensitivity list? Wenn ja, habe ich es noch nicht ganz 
verstanden, was da rein muss... meines Erachtens nur Signale, die 
außerhalb des Prozesses getrieben werden, im Prozess aber abgefragt.

Vielen Dank!
Ralf
Gast #3033824
Lesenswert?

Hallo,

Cihan Kalayci schrieb:
> Wie wird das Start gesetzt? Ist res und start synchron zur Clock?
start ist synchron, res nicht, wird aber im Topfile einsynchronisiert.
In diesem Block sit also alles synchron :)

> Abgesehen davon wie hast du start und busy initialisiert?
Diese beiden Signale werden doch mit dem Reset mit einem eindeutigen 
Wert belegt. Also sollte doch nach dem Reset alles glatt gehen?

Vielen Dank!
Ralf
#3033853
Lesenswert?

Dussel schrieb:
> In C tritt so ein Fehler häufig auf:
> IF busy <= '1' THEN
> Überleg mal ;-)

Ist auf der ersten Hinsicht nicht zu sehen.

Ich hatte mal den gleichen Fehler gemacht und das Signal wurde die ganze 
Zeit in der Synthese wegoptimiert. Nach langem suchen hatte ich dann 
selber entdeckt, dass ich das Signal mit <= abgefragt habe. Dummer C&P 
Fehler.

Cihan
Gast #3033868
Lesenswert?

AAAAHHHHH !!!!!
Dussel schrieb:
> In C tritt so ein Fehler häufig auf:
> IF busy <= '1' THEN
> Überleg mal ;-)
Sowas müsste der Compiler doch aber bemerken und meckern?
Krasse Sache... auf was man alles achten muss.

Bei solchen Sachen hat man nach 1h Fehlersuche keine Chance mehr. Da ist 
man einfach blind...

Vielen Dank!
#3033921
Lesenswert?

Ralf P. schrieb:
> AAAAHHHHH !!!!!
> Dussel schrieb:
>> In C tritt so ein Fehler häufig auf:
>> IF busy <= '1' THEN
>> Überleg mal ;-)
> Sowas müsste der Compiler doch aber bemerken und meckern?
> Krasse Sache... auf was man alles achten muss.
>
> Bei solchen Sachen hat man nach 1h Fehlersuche keine Chance mehr. Da ist
> man einfach blind...
>
> Vielen Dank!

Bei mir kam eine Warnung dazu. Müsste bei dir auch drin sein eigentlich.
Naja, hauptsache Fehler gefunden, Danke hier an Dussel.

Cihan
Moderator (Firma: Titel) Persönliche Seite #3034140
Lesenswert?

Ralf P. schrieb:
>>>> IF busy <= '1' THEN
> Sowas müsste der Compiler doch aber bemerken und meckern?
Nein, sieh dir mal die Definition eines std_logic an:
1
PACKAGE std_logic_1164 IS
2

3
    -------------------------------------------------------------------    
4
    -- logic state system  (unresolved)
5
    -------------------------------------------------------------------    
6
    TYPE std_ulogic IS ( 'U',  -- Uninitialized
7
                         'X',  -- Forcing  Unknown
8
                         '0',  -- Forcing  0
9
                         '1',  -- Forcing  1
10
                         'Z',  -- High Impedance   
11
                         'W',  -- Weak     Unknown
12
                         'L',  -- Weak     0       
13
                         'H',  -- Weak     1       
14
                         '-'   -- Don't care
15
                       );
Kleiner als '0' ist hier also noch 'X' und 'U'. Und deshalb ist diese 
Abfrage prinzipiell korrekt, und kann in der Simulation durchaus Sinn 
machen...

> Krasse Sache... auf was man alles achten muss.
Tja, das durchaus...  ;-)

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