hi,
Ich habe mir über das Karnevalswochenende vorgenommen mich des obigen
Themas anzunehmen und da sind natürlich Fragen aufgetaucht.
Nachdem ich erst mal ziemlich dröge die xilinx pdf gewälzt habe, ist mir
das zu bunt geworden und ich habe mir 'hands on' zu Herzen genommen. Mit
folgendem code habe ich die 50 MHz vom Nexys 2 verdoppelt. Mit dem
coregenerator eine single dcm ausgewählt und den CLK_FB als intern
zurückgekoppelt eingestellt.
Ein nächster Schritt wird sicher sein, den Eingangstakt zu teilen oder
einen krummen Takt zu bauen. Aber dafür muss ich das einfach besser
verstehen.
1
libraryIEEE;
2
useIEEE.STD_LOGIC_1164.ALL;
3
4
entitydcm_topis
5
Port(clk:inSTD_LOGIC;
6
led:outSTD_LOGIC);
7
enddcm_top;
8
9
architectureBehavioralofdcm_topis
10
signalled_s:std_logic;
11
signalcount_s:integerrange0to50000000/1:=0;
12
signalclk_s:std_logic;
13
signaldcm_lock:std_logic;
14
componentdcm
15
port(CLKIN_IN:instd_logic;
16
CLKIN_IBUFG_OUT:outstd_logic;
17
CLK2X_OUT:outstd_logic;
18
LOCKED_OUT:outstd_logic);
19
endcomponent;
20
21
22
begin
23
led<=led_s;
24
--clk_s <= clk; --das dann an die dcm
25
instantiate_dcm:dcmportmap(
26
CLKIN_IN=>clk,
27
CLKIN_IBUFG_OUT=>open,
28
CLK2X_OUT=>clk_s,
29
LOCKED_OUT=>dcm_lock);
30
31
toggle:processbegin
32
waituntilrising_edge(clk_s);
33
if(dcm_lock='1')then
34
if(count_s<50000000/1)then
35
count_s<=count_s+1;
36
else
37
count_s<=0;
38
led_s<=notled_s;
39
endif;
40
endif;--dcm_lock
41
endprocesstoggle;
42
43
endBehavioral;
Meine primäre Frage gilt dem Signal CLKIN_IBUFG_OUT, der auf open
gesetzt sein kann. Kann als Frage, denn wozu zwingt der Coregenerator
das Signal auf, wenn man es doch offen lässt?
Wie ich es verstanden habe, würde die Sache bei mir so laufen, daß der
Eingangstakt (bei dem Nexys ja ein global clk Eingang) über einen global
Buffer Input in den CLK_IN der dcm gelangt. Vom Ausgang dann über einen
Buffer ins Taktnetzwerk. Die Rückkopplung auf CLK_FB hat die Komponente
tatsächlich selber gemacht.
Meine Frage also: warum CLKIN_IBUFG_OUT => open und warum ist CLK_IN
mit clk zufrieden? Ich beziehe das auf ug331 S.69 wo es mir so scheint,
als ob eben CLK_IN aus diesem Buffer kommen müsste.
Wäre der Eingangstakt eigentlich zusätzlich zu einer angeschlossenen dcm
noch als clk im design verfügbar, oder müsste dafür eine zweite dcm
angeschlossen werden?
EDIT: ich habe den logischen Weg gewählt und es einfach mal probiert -
"Port <clk> has illegal connections. This port is connected to an input
buffer and other components." hört sich so an, als ob das tatsächlich
nicht geht. Macht auch Sinn. Eine zweite dcm an einen Buffer kann ich
aber vermutlich generieren?
Verworrene Fragen, aber ich hoffe jemand versteht es, mir zu helfen.
Ach und zuletzt: wann müsste man eigentlich von Hand irgendwelche Buffer
Zuweisungen machen? Das habe ich auf auto gelassen. Auto klingt einfach
und funktionierend ;-)
Diese Formatierung von port map, also mit den => Pfeilen sehe ich hier
öfters und finde sie leicht verwirrend.
Du schreibst:
CLKIN_IN => clk,
Was bewirkt das? Müsste der Pfeil nicht die andere Richtung haben? Es
wird doch den CLKIN_IN die clk zugewiesen und nicht anders herum?
Ich schreibe port map immer so:
instantiate_dcm : dcm port map(clk,open,clk_s,dcm_lock);
Dabei geht der erste Eintrag, also clk, an den ersten Eintrag der
component Definition, also hier an CLKIN_IN. Und alle Weiterin der
Reihenfolge nach.
Oder habe ich einen Denkfehler?
Clemens M. schrieb:> Kann als Frage, denn wozu zwingt der Coregenerator> das Signal auf, wenn man es doch offen lässt?
Der Code, den der Coregenerator generiert, ist nicht immer logisch.
(Aber fast immer verwirrend ;-)
Vielleicht ist das Signal drin, weil es in einer anderen Konfiguration
gebraucht wird.
> Wäre der Eingangstakt eigentlich zusätzlich zu einer angeschlossenen dcm> noch als clk im design verfügbar, oder müsste dafür eine zweite dcm> angeschlossen werden?
Wenn ich mir UG331 [1], Seite 47, Bild 2-2 "Spartan-3E and Extended
Spartan-3A Family Internal Quadrant-Based Clock Structure" anschaue,
eher nicht. Du kannst aber aus einer DCM verschiedene Takte rausholen
und im Design verwenden.
> Ach und zuletzt: wann müsste man eigentlich von Hand irgendwelche Buffer> Zuweisungen machen?
Ich instanziiere die DCM immer per Hand. Da kommt ein IBUFG (oder
IBUFGDS) an den Eingangstakt. Die restlichen Buffer (für DCM-Feedback
und das interne Design) macht der Synthesizer (zumindest beim Spartan 6)
automatisch.
Duke
[1] http://www.xilinx.com/support/documentation/user_guides/ug331.pdf
Gustl Buheitel schrieb:> Ich schreibe port map immer so:>> instantiate_dcm : dcm port map(clk,open,clk_s,dcm_lock);
Genau das vermeide ich wie die Pest.
Das mag zwar bei Code schreiben etwas Tipparbeit sparen, aber man muß
sich merken, an welcher Position welches Signal steht.
Und die Reihenfolge hab ich längst vergessen, wenn ich nach einer
gewissen Zeit mal wieder in den Code schauen muss.
Bei der ausführlichen Beschreibung ist die Reihenfolge egal und es passt
auch noch ein Kommentar an jedes Signal:
Weiß man denn, an welchem IBUFG der clk ankommt? Das kann vom pin
unterschiedlich verdrahtet sein?
Ist die obige componente vielleicht da, daß man das nicht wissen muss?
Könnte ich CLKIN_IN oder CLKIN_IBUFG_OUT aus dem generierten code
rauswerfen?
Clemens M. schrieb:> Weiß man denn, an welchem IBUFG der clk ankommt?
Ja. Weil Du ja sagst, an welchem Pin der Takt anliegt. Wenn der Pin die
GCLK-Funktion enthält, hängt da dran auch der entsprechende IBUFG.
sein?
> Könnte ich CLKIN_IN oder CLKIN_IBUFG_OUT aus dem generierten code> rauswerfen?
Versuch macht kluch.
Ich denke schon. Der Core-generator erzeugt ja für die DCM-Sachen keine
Netzlisten, sondern einigermaßen lesbaren VHDL (oder Verliog) Code.
Duke
Ich probier mal weiter. War mir nicht klar geworden, daß zu einem pin
ein fester Buffer gehört. Ich dachte die könnten auch irgendwie geroutet
werden.
Wenn ich noch irgendwas überhaupt nicht verstehe pushe ich mich noch
mal.
Danke einstweilen!
Clemens M. schrieb:> Ich probier mal weiter. War mir nicht klar geworden, daß zu einem pin> ein fester Buffer gehört. Ich dachte die könnten auch irgendwie geroutet> werden.
Prinzipiell ja. Aber für globale Netzwerke (wie den Takt) gibt es
dedizierte Pins. Und die sollte man auch dafür nutzen.
Duke