Forum: FPGA, VHDL & Co. Problem mit der Flankenerkennung


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von S.G (Gast)


Angehängte Dateien:

Lesenswert?

Hallo alle zusammen,

ICh arbeite gerade an einem interface eines AD7980 mittels VHDL und habe 
ein problem von dem ich die ursache nicht kenne.

Im Anhang sind einmal das AD7980 interface, die Topl Level entity, die 
Testbench und ein Modell des AD7980 zu finden. Das modell habe ich zum 
simulieren gemacht und ist eigentlich in diesem Fall egal. Es taktet 
einfach immer nur 16 bit auf anfrage raus.

Das eigentlich Problem ist die AD7980interface.vhd. im aquisition 
zustand sollen die über die Miso Line empfangenen bits mit der fallenden 
Taktflanke des Clken signals eingelesen werden, aber in der simulation 
werden die Bits bei steigender Taktflanke des Clken eingelesen.

zwar tut die simulation was sie soll, aber es steckt ja eindeutig ein 
fehler dahinter.


ich hoffe mein Problem habe ich verständlich dargelegt und ihr könnt mir 
helfen

von Lattice User (Gast)


Lesenswert?

Deine Flankenerkennung macht schon das was sie soll, aber so eine 
Erkennung hat nun mal einen Takt Delay und da deine SCLK sehr hoch ist 
geht das in die Hose.

Du willst eine SCLK Frequenz von 66 MHz hast aber eine 100 MHz 
Systemclock, das geht nicht. Aktuell ist deine SCLK nur 50 MHz (zu wenig 
um mit dem AD780 1 MSPS zu erreichen).

Ich würde eine Systemtakt von 66 MHz benutzen, und die IOs zum ADC als 
IDDR und ODDR realisieren.

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


Lesenswert?

S.G schrieb:
> habe ein problem von dem ich die ursache nicht kenne.
1
    if sckl_freq_counter <(100000000/SCKLFREQ) then
In Integer gerechnet sind 100000000/66000000 = 1   :-o

Und hier wartest du 730 ns, weil der Synthesizer deinen Code übersetzt, 
nicht deine Kommentare:
1
  elsif ( conversioncounter = 72) and CNVtemp = '1' then -- warte 720ns

Wie schon erwähnt: wenn du mit deinen internen Datenraten dicht an die 
Takfrequenz rankomst, dann ist es nicht mehr mit pauschalen Berechnungen 
wie 100000000/66000000 getan. Sondern du musst jeden einzelnen Takt per 
Handschlag verabscheiden und dir bewusst sein, dass die Granularität 
dort recht groß ist. Du kannst dir also nicht 62MHz erzeugen, denn es 
gibt nur Verzögerungszeiten von 10ns, 20ns, 30ns, 40ns... ergo 100MHz, 
50MHz, 33MHz, 25MHZ...

von Jürgen S. (engineer) Benutzerseite


Lesenswert?

Versuche mal, das Design so umzustellen, dass Du den ADC die Daten 
selbst eintakten lässt, z.B. mit einem asynchronen Fifo.

Ansonsten musst Du wie erwähnt überabtasten. Du könntest auch mit einem 
DDR-FF arbeiten und parallel mit einfacher Frequenz weitergehen.

: Bearbeitet durch User
von S.G (Gast)


Lesenswert?

Danke für eure Antworten, es wurde natürlich punkte angesprochen die ich 
noch nicht bedacht habe.

@lothar

Du hast natürlich recht mit den 100mhz/62,5mhz. Ich hab da ein wenig 
rumprobiert und vergessen es zu ändern. Mein derzeitiges enable Signal 
läuft mit 50mhz und ist für 1MSPS wie lattice_user bereits gesagt hat.

Mit den 720ns Wartezeit habe ich dich auch verwirrt, es ist natürlich 
730ns und auch so gewollt. Die Convention dauert max 720ns und danach 
muss noch 10ns-15ns gewartet werden bis die Daten auf der Miso Leitung 
anliegen.

Da 50mhz Etwas zu langsam sind muss ich jetzt erstmal alternativen 
betrachten. Ich benutze einen spartan6 und muss erstmal gucken welche 
Möglichkeiten mir der DCM bietet.

von Valko Z. (hydravliska)


Lesenswert?

Ich glaube du solltest erstmal dein Fehler rausfinden (auf welche Flanke 
die bits rein/rausgetaktet werden) und dann erst den Clock anpassen.
Der ADC kannst du auch mit eine niedrigere Rate erstmal ansteuern. Somit 
kannst du die MISO Leitung mit Systemtakt überabtasten und einfach über 
einen Schieberegister eintakten.


Gruss

von experte (Gast)


Lesenswert?

S.G schrieb:
> Ich benutze einen spartan6 und muss erstmal gucken welche
> Möglichkeiten mir der DCM bietet.
1050 MHz !

50 x 21 -> 1050 -> /8 -> 132 MHz

von S.G (Gast)


Lesenswert?

experte schrieb:
> S.G schrieb:
>> Ich benutze einen spartan6 und muss erstmal gucken welche
>> Möglichkeiten mir der DCM bietet.
> 1050 MHz !
>
> 50 x 21 -> 1050 -> /8 -> 132 MHz

Danke, aber könntest du mir diese Rechnung ein wenig erläutern?


Mein Fpga board bekommt hat einen Takt von 50mhz. im moment sieht mein 
Lösungsansatz so aus, dass ich mithilfe der SPartan6 PLL komponentne 
einen SPi Takt von 62,5 und einen Systemtakt von 125Mhz generiere. mit 
den 62,5 erreiche ich die 1MSPS des ADc und die 125 werde ich dann zum 
verarbeiten der Daten verwenden.
Würde eurer meinung etwas gegen diese Idee sprechen?

von Lattice User (Gast)


Lesenswert?

S.G schrieb:
> Mein Fpga board bekommt hat einen Takt von 50mhz. im moment sieht mein
> Lösungsansatz so aus, dass ich mithilfe der SPartan6 PLL komponentne
> einen SPi Takt von 62,5 und einen Systemtakt von 125Mhz generiere. mit
> den 62,5 erreiche ich die 1MSPS des ADc und die 125 werde ich dann zum
> verarbeiten der Daten verwenden.
> Würde eurer meinung etwas gegen diese Idee sprechen?

Solgange bei einem SPI Master der Systemtakt ein ganzzahliges Vielfaches 
des SPI Taktes ist, brauchst du diesen nicht extra mit einer PLL 
erzeugen.

Betrachte einfach den SPI Takt als zusätzliches Signal, das in deiner 
Statemachine erzeugt wird. Wichtiger ist dass man darauf achtet IO FFs 
zu verwenden, sonst wird es bei höheren Gechwindigkeiten schwierig bis 
unmöglich die Setup und Holdzeiten einzuhalten

In Verilog könnte ich es dir schnell hinschreiben, aber in VHDL bin ich 
nicht fit genug.

von S.G (Gast)


Lesenswert?

Stimmt natürlich, da habe ich zu kompliziert gedacht mit den 
verschiedenen Takten.


Danke

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


Lesenswert?

S.G schrieb:
> Würde eurer meinung etwas gegen diese Idee sprechen?
Dass du unnötigerweise zwei Taktdomänen aufmachst. Uin diesem Fall hier 
ist das "nur" die Hälfte, das kann dir die Toolchain noch aufrechnen, 
aber wehe, du machst unbedarft ("das hat das letzte Mal auch schon so 
toll geklappt!") einen "krummen" Takt auf. Dann hast du auf einmal zwei 
asynchrone Takte in deinem Design und damit all die Probleme an der 
Backe, die ein solches asynchrones Design mit sich bringt (Stichworte: 
Eintakten, Fifo, Synchronisieren, Handshake)...

Lattice User schrieb:
> Betrachte einfach den SPI Takt als zusätzliches Signal, das in deiner
> Statemachine erzeugt wird.
Es gibt nämlich nur einen Takt: der, der vom Quarzoszillator kommt 
(meinetwegen noch durch eine PLL aufgehübscht). Aber ein SPI-Takt ist 
KEIN Takt, sondern nur ein Symbol, das die Buchstabenfolge t, a, k und t 
(von mir aus auch c, l, o, c und k) in seinem Namen trägt.

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.