mikrocontroller.net

Forum: FPGA, VHDL & Co. Timing Probleme


Autor: matzunami (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: matzunami (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
eventuell noch erwähnenswert: das ganze soll in VHDL realisiert werden

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: matzunami (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: matzunami (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> das ganze soll in VHDL realisiert werden

na die Ansteuerung der schnittstelle

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: matzunami (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht 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.....

Autor: matzunami (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: matzunami (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht 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:
if rising_edge(MPMC_CLK0) then
  if (AddrACK = '1') then
    state <= next_state;
  end if;
end if;

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

Autor: matzunami (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok wenn das so funktionier dann ist es ja ok

vielen Dank

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.