Ich habe dies bereits z.b. für eine PLL gemacht wobei klar war, wie sie
zu benutzen war:
1
moduleclk_wiz_0
2
(
3
// Clock out ports
4
outputclk_out1,
5
// Status and control signals
6
inputreset,
7
outputlocked,
8
// Clock in ports
9
inputclk_in1
10
);
wird zu:
1
componentclk_wiz_0is
2
PORT(
3
--Clockoutports
4
clk_out1:outSTD_LOGIC;
5
--Statusandcontrolsignals
6
reset:inSTD_LOGIC;
7
locked:outSTD_LOGIC;
8
--Clockinports
9
clk_in1:inSTD_LOGIC
10
);
11
endcomponent;
Aber wie soll der generierte XADC angeschlossen werden?
1
modulexadc_wiz_0
2
(
3
dclk_in,// Clock input for the dynamic reconfiguration port
4
vauxp0,// Auxiliary channel 0
5
vauxn0,
6
busy_out,// ADC Busy signal
7
channel_out,// Channel Selection Outputs
8
eoc_out,// End of Conversion Signal
9
eos_out,// End of Sequence Signal
10
alarm_out,// OR'ed output of all the Alarms
11
muxaddr_out,
12
vp_in,// Dedicated Analog Input Pair
13
vn_in);
Meine Idee:
dclk_in -> std_logic --> Clock Eingang
vauxp0 -> std_logic -->Analog-Spannungseingang
vauxn0 -> std_logic -->Analog-Spannungseingang
busy_out -> std_logic --> Wandlung läuft
channel_out -> std_logic_vector(4 downto 0) --> Aktuell ausgegeber Kanal
eoc_out -> std_logic
eos_out -> std_logic
alarm_out -> std_logic
muxaddr_out -> std_logic_vector(4 downto 0) --> demnach für externen MUX
vp_in -> Analogeingang
vn_in -> Analogeingang
Was ich nicht verstehe ist die Datenschnittstelle.
--> Wie sollen denn nun die Daten heraus kommen?
Alternativ gibt es nich diese Inst-Beschreibung:
1
inst(
2
.CONVST(GND_BIT),
3
.CONVSTCLK(GND_BIT),
4
.DADDR(GND_BUS7[6:0]),
5
.DCLK(dclk_in),
6
.DEN(GND_BIT),
7
.DI(GND_BUS16[15:0]),
8
.DWE(GND_BIT),
9
.RESET(GND_BIT),
10
.VAUXN(aux_channel_n[15:0]),
11
.VAUXP(aux_channel_p[15:0]),
12
.ALM(alm_int),
13
.BUSY(busy_out),
14
.CHANNEL(channel_out[4:0]),
15
.DO(),
16
.DRDY(),
17
.EOC(eoc_out),
18
.EOS(eos_out),
19
.JTAGBUSY(),
20
.JTAGLOCKED(),
21
.JTAGMODIFIED(),
22
.OT(),
23
.MUXADDR(muxaddr_out),
24
.VP(vp_in),
25
.VN(vn_in)
26
);
Wie soll man hier diese GND_BUS signale verbinden?
Generell wäre es toll, wenn jemand weiß wie man den XADC richtig
einsetzt, oder generell wie so generierte Blöcke korrekt angeschlossen
werden?
Schöne Grüße,
Matthias
Hast du schon die Suche hier im Forum verwendet? XADC kam schon mehrmals
vor.
Allerdings funktioniert die Suche bei mir auf dem Telefon gerade nicht.
Aber die Google Suche hat geliefert:
Beitrag "Xilinx Artix-7 Nexys 4 mit VGA und XADC"
Da ist ein Beispiel ZIP im ersten Post enthalten.
Danke euch beiden :)
Duke Scarring schrieb:> Da hilft der Xilinx Library Guide (UG953), S. 411 ff.> https://www.xilinx.com/support/documentation/sw_manuals/xilinx2012_2/ug953-vivado-7series-libraries.pdf
Super, da gibt es auf Steite 414 ein konkretes beispiel einer
VHDL-Instanz.
Werde ich ausprobieren...
Gustl B. schrieb:> Hast du schon die Suche hier im Forum verwendet? XADC kam schon mehrmals> vor.>> Allerdings funktioniert die Suche bei mir auf dem Telefon gerade nicht.>> Aber die Google Suche hat geliefert:> Beitrag "Xilinx Artix-7 Nexys 4 mit VGA und XADC"> Da ist ein Beispiel ZIP im ersten Post enthalten.
Werd ich mir dann auch noch anschauen, sowie ich dazu komme.
Bin nun um einiges weiter, jedoch passt es noch nicht ganz:
Ich bekomme für jeden Port den Error:
[Synth 8-485] no port 'DCLK' on instance
Weiße jemand vielleicht wo man sowas nachlesen kann, wie eben ein
solcher generierter Verilog Code in VHDL genutzt werden kann?
Bei den beispielen scheint es immer selbsterklärend, aber mit dem XADC
ist es das eher nicht...
Habe noch kein Beispiel gefunden, welches es zeigt, insbesondere mit den
Config-Register.
Grüße,
Matthias
Hier der generierte Code:
Matthias schrieb:> Weiße jemand vielleicht wo man sowas nachlesen kann, wie eben ein> solcher generierter Verilog Code in VHDL genutzt werden kann?
Für das Verilog-Modul schreibt man eine passende VHDL-Component
Beschreibung.
Welche Datentypen dort zulässig sind, steht im Synthesis-Guide.
Wenn Du generell Probleme mit der Arbeitsweise des XADC hast, dann
solltest Du Dir den UG480 anschauen:
https://www.xilinx.com/support/documentation/user_guides/ug480_7Series_XADC.pdf
Duke
P.S.: Große VHDL-Dateien besser als Anhang einstellen, das schont mein
Scrollrad an der Maus...
Wieso nutzt du denn nicht gleich die generierten *.vho Files? Da ist
doch ein Instanziierungs Beispiel drin.
Matthias schrieb:> Was ich nicht verstehe ist die Datenschnittstelle.> --> Wie sollen denn nun die Daten heraus kommen?
Wenn du mit dem CoreGen den XADC so parametriert hast dass er im
Sequencing Mode arbeitet, dann kannst du die Daten einfach so raus
holen:
1
--after each channel sampling is finished, read the result via DRP interface
2
DADDR_IN<="00"&CHANNEL_OUT;
3
DEN_IN<=EOC_OUT;
Immer wenn dann DRDY_OUT = 1 ist, kannst du an DO_OUT ein Ergebnis
auslesen. Aus welchem Register da kommt, sagt dir CHANNEL_OUT, somit
kannst du das den Eingängen zuordnen.
Was mich wundert, wieso hast du so viele Parameter und Signale bei dir?
Benutzt du den "nackten" XADC ohne Core? Kann man machen, aber ist halt
ungleich aufwendiger, als sich den Wrapper generieren zu lassen...
Christian R. schrieb:> Wieso nutzt du denn nicht gleich die generierten *.vho Files? Da ist> doch ein Instanziierungs Beispiel drin.
SUPER! Genau nach sowas habe ich gesucht, wusste aber bisher nicht dass
es das gibt!
Hie gibts nun noch ein Problem mit der Datenausgabe:
1
COMPONENTxadc_wiz_0
2
PORT(
3
dclk_in:INSTD_LOGIC;
4
vp_in:INSTD_LOGIC;
5
vn_in:INSTD_LOGIC;
6
vauxp1:INSTD_LOGIC;
7
vauxn1:INSTD_LOGIC;
8
vauxp2:INSTD_LOGIC;
9
vauxn2:INSTD_LOGIC;
10
vauxp9:INSTD_LOGIC;
11
vauxn9:INSTD_LOGIC;
12
vauxp10:INSTD_LOGIC;
13
vauxn10:INSTD_LOGIC;
14
channel_out:OUTSTD_LOGIC_VECTOR(4DOWNTO0);
15
eoc_out:OUTSTD_LOGIC;
16
alarm_out:OUTSTD_LOGIC;
17
eos_out:OUTSTD_LOGIC;
18
busy_out:OUTSTD_LOGIC
19
);
20
ENDCOMPONENT;
21
22
your_instance_name:xadc_wiz_0
23
PORTMAP(
24
dclk_in=>dclk_in,
25
vp_in=>vp_in,
26
vn_in=>vn_in,
27
vauxp1=>vauxp1,
28
vauxn1=>vauxn1,
29
vauxp2=>vauxp2,
30
vauxn2=>vauxn2,
31
vauxp9=>vauxp9,
32
vauxn9=>vauxn9,
33
vauxp10=>vauxp10,
34
vauxn10=>vauxn10,
35
channel_out=>channel_out,
36
eoc_out=>eoc_out,
37
alarm_out=>alarm_out,
38
eos_out=>eos_out,
39
busy_out=>busy_out
40
);
Also an sich sehr schön, aber mit fehlt hier die Datenausgabe.
Damit kann ich mir nun am LA anschauen, dass er neue Daten hat, dass die
Sequenz fertig ist, das gerade eine Wandlung läuft und auch welcher
Kanal grage gewandelt wird.
Was ist denn nötig um eine Datenschnittstelle zu bekommen?
Christian R. schrieb:> Matthias schrieb:>> Was ich nicht verstehe ist die Datenschnittstelle.>> --> Wie sollen denn nun die Daten heraus kommen?>> Wenn du mit dem CoreGen den XADC so parametriert hast dass er im> Sequencing Mode arbeitet, dann kannst du die Daten einfach so raus> holen:> --after each channel sampling is finished, read the result via DRP> interface> DADDR_IN <= "00" & CHANNEL_OUT;> DEN_IN <= EOC_OUT;>> Immer wenn dann DRDY_OUT = 1 ist, kannst du an DO_OUT ein Ergebnis> auslesen. Aus welchem Register da kommt, sagt dir CHANNEL_OUT, somit> kannst du das den Eingängen zuordnen.>> Was mich wundert, wieso hast du so viele Parameter und Signale bei dir?> Benutzt du den "nackten" XADC ohne Core? Kann man machen, aber ist halt> ungleich aufwendiger, als sich den Wrapper generieren zu lassen...
Das habe ich auch schon so vor gehabt / Kommt in einem anderen Thread
vor.
Problem ist aber dass ich es mit der oben geposteten
Component-Deklaration nicht schaffe ein Image zu bauen, wegen einer
Meldung:
[Synth 8-485] no port 'DCLK' on instance
für sämtliche Ports.
Duke Scarring schrieb:> Wenn Du generell Probleme mit der Arbeitsweise des XADC hast, dann> solltest Du Dir den UG480 anschauen:> https://www.xilinx.com/support/documentation/user_guides/ug480_7Series_XADC.pdf>> Duke>> P.S.: Große VHDL-Dateien besser als Anhang einstellen, das schont mein> Scrollrad an der Maus...
Generelle Probleme mit der Nutzung/Arbeitsweise sehe ich nicht, es ist
eben nur fraglich wie ich zu einem Image mit (vollständigem) XADC kommen
kann.
Wenn nun schon ein Image mit laufendem XADC da ist, wäre es nun echt
super wenn jemand noch wüsste wie man die Daten raus holen kann?
Also bei mir kommen die Daten mit dem oben geposteten Code raus. Dazu
muss natürlich der Sequenzer aktiv sein und der DCLK am DRP laufen. Bist
du sicher dass da ein CLK aktiv ist? Die Meldung ist ja recht eindeutig.
Nach den genauen Einstellungen im CoreGen kann ich dann nochmal gucken.
Deine Instanz sieht aber so aus als hättest du DRP gar nicht aktiviert
im Core? Da fehlt daddr, drdy, dout usw...
Christian R. schrieb:> Also bei mir kommen die Daten mit dem oben geposteten Code raus. Dazu> muss natürlich der Sequenzer aktiv sein und der DCLK am DRP laufen. Bist> du sicher dass da ein CLK aktiv ist? Die Meldung ist ja recht eindeutig.> Nach den genauen Einstellungen im CoreGen kann ich dann nochmal gucken.> Deine Instanz sieht aber so aus als hättest du DRP gar nicht aktiviert> im Core? Da fehlt daddr, drdy, dout usw...
Da hast du recht, ich hatte bei Interface-Options None ausgewählt.
Mit der Einstellung DRP hat der XADC auf einmal ein Interface, das nun
auch schon läuft :)
Er ist wie oben beschrieben angeschlossen und die Daten kommen raus :)
Christian R. schrieb:> So in etwa müsste das aussehen, damit die Daten auch irgendwie nach> außen gelangen braucht man natürlich AXI oder DRP.
Genau so sieht's nun auch aus...
Nun macht es auch Sinn dass ich mit meinem ersten Versuch oben die
Meldung bekamm dass es diverse Ports nicht gibt. Wobai das vermutlich
nicht das einzige Problem war.
Der wichtigste Hinweis ist nun zu wissen dass es *.vho files gibt!
Aber eine Frage bleibt dann doch:
Warum kann man "Kein" Interface auswählen?
Macht es sinn den XADC ohne Datenausgabe zu betreiben?
Vielen Dank für eure Antworten,
Viele Grüße,
Matthias
Matthias schrieb:> Warum kann man "Kein" Interface auswählen?> Macht es sinn den XADC ohne Datenausgabe zu betreiben?
Wenn Dich nur die Alarm-Bits interessieren, dann schon, z.B. für einen
simplen Übertemperaturalarm. Eine andere Anwendung wäre, wenn den XADC
inklusive der VAUX-Pins nur per JTAG benutzen möchte.