www.mikrocontroller.net

Forum: FPGA, VHDL & Co. CLOCK Modelsim vs Realität


Autor: Plau Sein (radih)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Ich schreibe eine Komponente für den H48C3-Achsen Beschleunigungssensor 
und habe folgende Frage:

Für das Clock verwende ich(weil es so leichter für mich scheint):

if (event 1)
clk<= '1' after 5 us, '0' after 15 us;

und das aus folgendem Grund:

wenn ich Befehle schicken soll, soll ich das Data-signal setzen und dann 
Clock erzeugen.

Wenn ich Signale empfange, soll ich sie auf der falling_edge abfragen.

Also zum Zeitpunkt des Events 1 setze ich Data-Signal
nach 5 us kommt die rising_edge und nach 15 us die falling_edge

im Modelsim sieht das Ganze sehr schön aus, aber die Daten die ich vom 
Sensor bekomme sind fragwürdig:

x,z-Achsen immer 0
y-Achse bei 12 Bit Messung 111111111111
vRef auch 111111111111


Kann es sein, dass in der Realität sachen wie after so und so viel 
nichts taugen oder liegt der Fehler irgendwo anders?
Vielleicht bin ich zu langsam, in der Datenblatt steht 1-2 Mhz.
Ich bin bei 50Khz, aber das sollte nicht das Problem sein, da das 
Minimumclock bei 10 khz liegt.

Autor: Morin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Kann es sein, dass in der Realität sachen wie after so und so viel
> nichts taugen oder liegt der Fehler irgendwo anders?

Ja, "after ..." wird vom Synthesetool gelöscht bevor es überhaupt mit 
der Synthese losgeht.

Autor: Mathi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> clk<= '1' after 5 us, '0' after 15 us;

Das after ist nicht synthetisierbar. So kann man keinen Takt für ein 
reales Design erzeugen. Du musst vielmehr einen Takt aus Deinem 
Systemtakt generieren. Oder noch besser: Dein Design und der Sensor 
benutzen den gleichen Takt.

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bitte poste mehr von Deinem Code, sonst kann Dir keiner helfen.

Falls
clk<= '1' after 5 us, '0' after 15 us;
ein Teil deines FPGA oder CPLD programm ist, dann liegt dort der Fehler, 
weil man das "after" statement nicht synthetisieren kann.

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

Bewertung
0 lesenswert
nicht lesenswert
> if (event 1)
>   clk<= '1' after 5 us, '0' after 15 us;
Das soll so in der Logik (FPGA/CPLD) abgebildet werden? Wie denn das?
Auf dieser Hardware gibt es keine einstellbaren Zeitglieder (auf jeden 
Fall nicht für das, was du hier vorhast).
Glaub es mir: du bist weiter vom Ziel entfernt, als du denkst ;-)

Zeig doch mal den kompletten Code.

Du hast offenbar irgendwie eine falsche Vorstellung von programmierbarer 
Hardware. Im Großen und ganzen ist es so:
Da gibt es einen Haufen Flip-Flops und ein paar logische Funktionen und 
Verdrahtung. Damit mußt du fertig werden. Wenn ein Pegel für eine 
definierte Zeit stabil sein soll, dann braucht es dazu ein Flip-Flop. 
Wenn du also deinen Takt 5 us low haben willst, und danach 15us high, 
dann brauchst du einen Takt, der dir das Weiterschalten (<<-Stichwort) 
zwischen diesen Zuständen (<<- Stichwort) erlaubt.

Du solltest dir erst mal die grundlegenden Grundlagen zum 
Hardware-Design anschauen (z.B. Jürgen Reichardt, Bernd Schwarz: 
VHDL-Synthese). Und dann langsam mit einer Blinkenden LED anfangen.

Dass der Simulator das richtig macht, ist nur deshalb so, weil in der 
Simulation viel mehr möglich ist, als in der Realität. Diese Zeile
> clk<= '1' after 5 us, '0' after 15 us;
wird der Synthesizer entweder komplett ignorieren, oder clk auf einen 
festen Wert setzen.

Autor: Plau Sein (radih)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Vielen Dank für die schnellen Antworten.

Es ist ja so, dass ich mich schon mit den grundlegenden Sachen des 
Hardwareprogrammierens auskenne(natürlich ist einer besser vertraut als 
der andere), ABER von so viel Denken vergisst man manchmal elementare 
Dinge wie das hier. Ansonsten habe ich schon Vorlesungen über die 
Flip-Flops gehört, nur habe ich nicht darüber nachgedacht, einfach 
losprogrammiert.:))))


Wenn ich das 'after' korriegiere, denke ich dass es dann funktionieren 
soll.

Weiteren Codeausschnitt habe ich nicht gepostet, weil ich schon vermutet 
habe, dass es an dem 'after' liegen wird.

Danke nochmals

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.