Forum: FPGA, VHDL & Co. busy-Flag richtig setzen


von Ralf P. (Gast)


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

von Cihan K. (lazoboy61)


Lesenswert?

Wie wird das Start gesetzt? Ist res und start synchron zur Clock? Wenn 
nicht könntest du Probleme damit haben. Abgesehen davon wie hast du 
start und busy initialisiert?

Cihan

von Ralf P. (Gast)


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

von Ralf P. (Gast)


Lesenswert?

Aber selbst wenn ich alle signale mit
1
  signal start     : std_logic := '0';
2
  signal rdy       : std_logic := '0';
3
  signal busy      : std_logic := '0';
initialisiere, geht es leider immer noch nicht.

von Dussel (Gast)


Lesenswert?

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

von Cihan K. (lazoboy61)


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

von Ralf P. (Gast)


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!

von Cihan K. (lazoboy61)


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

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


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...  ;-)

von Dussel (Gast)


Lesenswert?

Lothar Miller schrieb:
> Und deshalb ist diese
> Abfrage prinzipiell korrekt,
Heißt das, dass das ein kleiner-gleich ist? Ich bin jetzt davon 
ausgegangen, dass das eine (ungewollte) Zuweisung wie das bekannte 
if(a=b) in C ist.
Dann war das ja nur ein Zufallsfund. :-)

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


Lesenswert?

Dussel schrieb:
> Heißt das, dass das ein kleiner-gleich ist?
Ja.

> Ich bin jetzt davon ausgegangen, dass das eine (ungewollte) Zuweisung
> wie das bekannte if(a=b) in C ist.
In VHDL kann an dieser Stelle nichts zugewiesen werden.

> Dann war das ja nur ein Zufallsfund. :-)
Tja, nochmal Dussel gehabt. Nomen est Omen...  ;-)

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.