Forum: FPGA, VHDL & Co. Timing Probleme


von matzunami (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich möchte über ein Interface auf etwas zugreifen. Das Timing ist im 
Anhang. Wie man dort sieht, kommt das AddACK in dem gleichen Zyklus, wie 
das AddReq. Da ich die Ansteuerung in einer StateMachine machen wollte, 
welche auf die positive Taktflake triggert, bekomme ich das AddACK nicht 
mit. Gibt es eine möglichkeit das AddACK Signal denoch zu erfassen, oder 
bleibt mir nix anderes übrig, als meine Taktfrequenz der StateMachine zu 
verdoppeln?

Danke für Hilfe

MfG
matzunami

von matzunami (Gast)


Lesenswert?

eventuell noch erwähnenswert: das ganze soll in VHDL realisiert werden

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


Lesenswert?

> AddrACK
ist eine Antwort auf AddrREQ.
Dieses Signal wird offenbar mit dem steigenden Takt gesetzt, und 
irgendeine Kombinatorik antwortet darauf mit dem AddrACK.

Du kannst auf dieses Signal dann sowieso erst mit der folgenden 
Taktflanke reagieren.

EDIT:
> das ganze soll in VHDL realisiert werden
Was denn überhaupt?

von matzunami (Gast)


Lesenswert?

Das AddrREQ wird von mir gesetzt, und das AddrACK kommt in dem selben 
Taktzyklus, doch wird bei der nächsten steigenden Flanke wider 
abgeschalten. D.h. wenn ich bis zur nächsten steigenden Flanke warte ist 
AddrACK nicht mehr da.

von matzunami (Gast)


Lesenswert?

> das ganze soll in VHDL realisiert werden

na die Ansteuerung der schnittstelle

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


Lesenswert?

> D.h. wenn ich bis zur nächsten steigenden Flanke warte ist
> AddrACK nicht mehr da.
Wenn ich das Timing-Diagramm ansehe, dann ist das stabil bis zum 
nächsten Takt. Und erst dann wird durch das Vorhandensein von AddrACK 
das Signal AddrREQ zurückgesetzt.

EDIT
Zum Verständnis: Bei so einem Timing-Diagramm interessiert immer, was 
vor dem Takt anliegt. Dieser Zustand ergibt bei der Taktflanke dann 
den nächsten.

von matzunami (Gast)


Lesenswert?

hm.. nagut, bei mir siehts so aus als fällt AddrACK genau zur steigenden 
flanke wider ab, dass musst ja dann doch noch ein wenig länger 
anbleiben... ich wert mal so tun als ist AddrACK mit der steigenden 
Flanke auswertbar und schauen obs geht

danke für die schnelle antwort

von Christian R. (supachris)


Lesenswert?

Willst du dir jetzt doch das NPI antun? Wie gesagt, der MPMC setzt das 
Signal mit der steigenden Flanke und nimmt es mit der nächsten wieder 
weg, wenn das ACK vor der Flanke kam. So wie ich das verstehe, kannst du 
das ACK auch synchron setzen, dann muss der MPMC eben noch einen Takt 
warten, bis er das REQ wieder wegnehmen darf. Dazu ist das ACK ja 
da.....

von matzunami (Gast)


Lesenswert?

:) ja ich werd mir das jetzt doch an tun...
bei deinem letzten post hast du, glaub ich was verwechselt... das 
AddrREQ setzt ich mit der steigenden Flanke und nehm es auch wider bei 
der nächstn steigenden flanke weg, wenn das AddrACK zwischenzeitlich 
kam.

von Christian R. (supachris)


Lesenswert?

Achso, du setzt das REQ und der MPMC setzt daraufhin das ACK? Naja, ist 
ja egal, bleibt das gleiche. Dann musst du das REQ solange halten, bis 
der das ACK gegeben hat. Das ganze kann doch synchron zur steigenden 
Flanke passieren, also kannst du deine State Machine nutzen....wo ist 
denn jetzt das Problem?

von matzunami (Gast)


Lesenswert?

das problem ist:
AddrACK: "Valid for one cycle of MPMC_Clk0."
Das heißt bei mir das wenn ich das Signal teste (in etwa so)

if (AddrACK = '1') then
    state <= next_state;
end if;

das AddrACK nicht mehr da ist, weil es mit der steigenden flanke wider 
vom MPMC weggenommen wird

von Christian R. (supachris)


Lesenswert?

Achso. Das ist aber immer so. Man setzt ein Signal mit der steigenden 
Flanke und nimmt es mit der nächsten wieder weg. Mit der Flanke, mit der 
es weggenommen wird, wird es ins nächste FlipFlop übernommen. Das ist ja 
noch ein paar hundert ps nach der Flnake da. Innerhalb eines FPGA geht 
das problemlos, weil die FF am gleichen Taktnetz hängen. Wenn das Signal 
den FPGA verlassen soll, muss man halt aufpassen, dass man mit den 
Laufzeiten hinkommt.

Du kannst es also so übernehmen:
1
if rising_edge(MPMC_CLK0) then
2
  if (AddrACK = '1') then
3
    state <= next_state;
4
  end if;
5
end if;

Wie Lothar schon schrieb: wichtig ist, was vor der Flanke anliegt.

von matzunami (Gast)


Lesenswert?

ok wenn das so funktionier dann ist es ja ok

vielen Dank

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.