Udo Weizenheim schrieb:
> Eigentlich müßte der Code so aussehen:
1 | if (rising_edge(Clk150) and rising_edge(Clk75)) then ...
|
2 | elsif (rising_edge(Clk150) and falling_edge(Clk75)) then ...
|
3 | end if;
|
Ich vermute, eigentlich müsste dein Code so aussehen:
1 | if rising_edge(Clk75) then ...
|
2 | elsif falling_edge(Clk75) then ...
|
3 | end if;
|
Und der Witz: das geht sogar, wenn man weiß, was dabei erlaubt ist...
;-)
Das hatten wir letzhin im
Beitrag "Re: Seriell-Parallel-Wandlung mit VHDL"
Udo Weizenheim schrieb:
> Das Problem ist jetzt folgendes:
> Wenn ein 8-Bit-Daten-Paket dann beginnt, wenn auch der 75MHz-Clock eine
> steigende Flanke hat, ist alles gut.
> Wenn ein 8-Bit-Daten-Paket aber dann beginnt, wenn der 75MHz-Clock
> gerade eine fallende Flanke hat, muß ich die Daten zwischenpuffern und
> quasi einen "Wait-State" einlegen.
Dann hast du eigentlich kein Problem, nur ist eben der betroffene 75MHz
Pfad ebenfalls mit 150MHz zu constrainen. Dann haben eben die "zweiten"
8-Bit nur 6,6ns (statt der 13,3ns) Zeit bis zum Ausgang.
Allerdings ist es bei solchen Taktraten eh' sinnvoll, sowohl den Eingang
wie auch den Ausgang zu registieren, damit die FFs im IOB verwendet
werden. Sonst bekommst du da nie ein brauchbares Timing hin...
> Lothar Miller schrieb:
>> Denn du kannst ganz problemlos Signale zwischen zwei per DCM
>> erzeugten Domänen hin- und her übertragen. Die Toolchain sorgt (bei
>> angegebenem Constraint auf den Basistakt) für die Überwachung der
>> Laufzeiten...
> Wenn ich Dich richtig verstehe, heißt das: Eigentlich hab ich eine
> Setup/Hold-Verletzung, aber die Toolchain ist clever genug, um das
> zu berücksichtigen.
Richtig, zum Preis einer viel höheren "virtuellen" Taktfrequenz bei
ungünstigen Verhältnissen: wenn du z.B. 150MHz (6,666ns) über einen DCM
auf 100MHz (10ns) wandelst (3:2), dann hast du beim Domänenübergang eine
"virtuelle" Taktfrequenz von 300MHz (10ns-6,666ns). Und da tut sich die
Toolchain dann schon mal schwer...