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