Hallo,
ich frage mich gerade, wie ich einen Takt bzw. ein Datenkanal, der per
LVDS in den Spartan3A DSP gegeben wird, simulieren kann.
Ich bin bisher immer wie folgt vorgegangen:
New Source => Testbench waveform und dann im Fenster meinen Referenztakt
oben rechts angegeben und dann alle Eingänge entsprechend dazu gesetzt
oder eben nicht gesetzt.
Nun sind ja zwei Pads mit einem LVDS Signal belegt, die dann mit Hilfe
eines IBUFDS bzw. IBUFGDS in ein verwertbares Signal gewandelt werden.
Wie kann ich in der Simulation auf diesen Resultierenden Takt zugreifen?
Bzw wie teile ich dem testbench mit, dass sich mein Takt/ meine Daten,
aus zwei Pads ergeben, denn die IBUFDS bzw. IBUFGDS wird ja erst
mitsimuliert und kann nicht einfach weggelassen werden.
DANKE!
In der Testbench einfach den Takt invertieren und auf den _P Eingang
geben. Fertig. Oder halt einen 2. Takt mit 180° Phasenlage zum ersten
erzeugen, wenn du dieses grafische Dingens da benutzt....
Dieses "grafische Dingens" war so in dem Einsteigertutorial von Xilinx
beschrieben. Habe bisher noch keine Anleitung dazu gefunden, wie ich
eine Testbench selber schreiben kann. Wenn ich mir aus dem Wizzard eine
.vhw Datei erstellen lassen, sieht das ganze auch sehr "unbekannt" aus,
also nicht das ich mir das hätte selbst beibringen können...
Ich werd mal einen Blick in das Buch VHDL Synthese werfen, vielleicht
steht ja dort etwas dazu.
Denn mit deinem Tip, einfach den einen Takt zu invertieren und auf das
_p Pad zu geben, damit kann ich momentan leider noch nichts anfangen.
Steht in meinem Kopf aktuell noch im Widerspruch zum eigentlichen
Design, wo ja das _P Pad ein extra Eingang ist. Das würde bedeuten, dass
ich im Testbench EIngänge auch "extern" verschalten kann?
DANKE
> Habe bisher noch keine Anleitung dazu gefunden, wie ich> eine Testbench selber schreiben kann.
Rechtsklick in dein Projekt --> New Source --> Testbench
Und dann in diese VHDL-Datei deine Stimulidaten eingeben.
Natürlich kannst/musst du die Eingänge extra verschalten. Für eine
normale Testbench macht es prinzipiell erst mal keinen Unterschied, ob
sie ein einzelnes VHDL Modul oder ein ganzes Top-Level-Design incl.
aller Unter-Module anspricht.
VHDL-Testbench erzeugt ISE automatisch: New Source -> VHDL Testbench ->
Dann das Top-Level File auswählen und schon erzeugt der das VHDL File
zum simulieren. Im Normalfall erkennt der auch die CLKs, da musst du nur
noch die Periodendauer eintragen.
-- Component Declaration for the Unit Under Test (UUT)
13
14
COMPONENTLVDS_CLOCK_IN
15
PORT(
16
AFE_CLK_P:INstd_logic;
17
AFE_CLK_N:INstd_logic;
18
AFE_DAT_P:INstd_logic;
19
AFE_DAT_N:INstd_logic;
20
DCM_RESET:INstd_logic;
21
DDR_RESET:INstd_logic;
22
SET_DDR:INstd_logic;
23
CLOCK_OUT0:OUTstd_logic;
24
DATA_OUTQ0:OUTstd_logic;
25
DATA_OUTQ1:OUTstd_logic
26
);
27
ENDCOMPONENT;
28
29
30
--Inputs
31
signalAFE_CLK_P:std_logic:='0';
32
signalAFE_CLK_N:std_logic:='0';
33
signalAFE_DAT_P:std_logic:='0';
34
signalAFE_DAT_N:std_logic:='0';
35
signalDCM_RESET:std_logic:='0';
36
signalDDR_RESET:std_logic:='0';
37
signalSET_DDR:std_logic:='0';
38
39
--Outputs
40
signalCLOCK_OUT0:std_logic;
41
signalDATA_OUTQ0:std_logic;
42
signalDATA_OUTQ1:std_logic;
43
44
BEGIN
45
46
-- Instantiate the Unit Under Test (UUT)
47
uut:LVDS_CLOCK_INPORTMAP(
48
AFE_CLK_P=>AFE_CLK_P,
49
AFE_CLK_N=>AFE_CLK_N,
50
AFE_DAT_P=>AFE_DAT_P,
51
AFE_DAT_N=>AFE_DAT_N,
52
DCM_RESET=>DCM_RESET,
53
DDR_RESET=>DDR_RESET,
54
SET_DDR=>SET_DDR,
55
CLOCK_OUT0=>CLOCK_OUT0,
56
DATA_OUTQ0=>DATA_OUTQ0,
57
DATA_OUTQ1=>DATA_OUTQ1
58
);
59
60
AFE_CLK_N<=NOTAFE_CLK_P;
61
62
-- No clocks detected in port list. Replace <clock> below with
63
-- appropriate port name
64
65
constantAFE_CLK_Pperiod:=10ns;-- <== FEHLER
66
67
AFE_CLK_P_process:process
68
begin
69
AFE_CLK_P<='0';
70
waitforAFE_CLK_Pperiod/2;
71
AFE_CLK_P<='1';
72
waitforAFE_CLK_Pperiod/2;
73
endprocess;
74
75
76
-- Stimulus process
77
stim_proc:process
78
begin
79
-- hold reset state for 100ms.
80
waitfor100ms;
81
82
waitforAFE_CLK_Pperiod*10;
83
84
-- insert stimulus here
85
86
wait;
87
endprocess;
88
89
END;
Nun meldet er mir in Zeile 89 einen Fehler, nahe des Ausdruckes
constant... ich habe lediglich das automatisch erzeugte <clock> ersetzt,
da er keinen CLK gefunden hat.
Der Aufbau dieser Testbench ist mir nun klar, nur habe ich auch die
beiden LVDS Takteingänge AFE_CLK_N und AFE_CLK_P richtig verschaltet mit
AFE_CLK_N <= NOT AFE_CLK_P; ?
VIELEN DANK für die schnelle und umfangreiche Hilfe :)
Habe es jetzt hinter und vor den signalen versucht, dann kommt dieser
Fehler:
1
Line 55. Syntax error near :=
Eigentlich war ich davon ausgegangen, dass so ein automatisch
generiertes File fehlerfrei ist, vor allem was die Platzierung der
Deklarationen angeht. Das das Programm nicht wissen kann, welches Pad
nun mein Takt ist und ich das nachtragen muss, ist ja in Ordnung, aber
dass ich bei Syntax Check über 20 und mehr Fehler stolpere, die nix mit
meinen Änderungen zu tun haben, finde ich schon sehr komisch.
Kann ich denn im eigentlichen Design Fehler gemacht haben, die sich hier
fortsetzen?
Aber der Syntaxcheck des Designs ist fehlerfrei, läßt sich auch umsetzen
und ein Bitstream erhalte ich auch. Programmiert habe ich es auch schon,
nur leider wird eine Teilfunktion (nämlich ein IDDR2) nicht richtig
ausgeführt und ich wollte nun mit Hilfe der Simulation schauen, woran es
liegt. NUr deswegen bin ich auf das Problem gestoßen.
DANKE!
PS: Hier nochmal der VOllständigkeithalber mein Design:
Q0=>DATA_OUTQ0,-- 1-bit output captured with C0 clock
93
Q1=>DATA_OUTQ1,-- 1-bit output captured with C1 clock
94
C0=>CLOCK_OUT0_int,-- 1-bit clock input
95
C1=>CLOCK_OUT180_int,-- 1-bit clock input
96
CE=>IDDR2_CE,-- 1-bit clock enable input
97
D=>DATA_INT,-- 1-bit DDR data input
98
R=>DDR_RESET,-- 1-bit reset input
99
S=>SET_DDR-- 1-bit set input
100
);
101
102
103
endBehavioral;
Ich möchte einfach einen LVDS Takt und einen LVDS Datenstream einlesen
und dann in 3,3V Pegeln an drei Ausgängen wieder messbar machen. Der
Ausgangstakt des DCM ist messbar und plausibel, nur die beiden Ausgänge
des IDDR2 spucken noch nix aus.
> constant AFE_CLK_Pperiod := 10 ns; -- <== FEHLER
Jetzt sehe ich es: die Konstante hat keinen Typ :-o
Da es eine Zeit ist, könnte man das so machen:
constant AFE_CLK_Pperiod : time := 10 ns; -- <== FEHLER
1000 DANK !!!
Oh je oh je... wo soll das nochmal hinführen mit mir, dem alten
Programmiergenie :D
Ok, ich hoffe ich kann das jetzt Untersuchen, wo mein Fehler im Design
liegt....
Andreas schrieb:
> 1000 DANK !!!> Oh je oh je... wo soll das nochmal hinführen mit mir, dem alten> Programmiergenie :D
Naja, Programmieren und Hardware beschreiben sind zwei völlig
verschiedene Dinge. Sieht nur ähnlich aus...
Das es zwei Paar Schuhe sind weiß ich... aber die Tätigkeit ist in
meinen Augen sehr ähnlich. Ich sitze vorm Rechner und mache mir
Gedanken, wie ich dieses und jenes Problem in eine bestimmte Syntax
zwängen kann.
Ich mag es lieber Hardware mit Platinen und fertigen Bauelementen zu
gießen :)
DANKE für Eure Hilfe!
Ich mußte jetzt erstmal ISE neu installieren, weil mir bei einer
vorangegangenen Simulation etwas abgeschmiert ist. Ich hoffe ich kann
den Testbench jetzt testen und meinen Fehler beim IDDR2 finden :)
NUn hänge ich bei diesem Fehler :(
ERROR: no Simulation Engine found in the Transform Input that matches
tb_IDDR2_Dataout_isim_beh.exe
Irgendwas scheint in meinem uhrsprünglichen Design noch falsch zu sein,
denn darauf basiert ja der Testbench.
Hallo,
ich noch einmal.
Nachdem ich nun quasi von vorne anfangen muss, weil ich den Fehler in
meinem Design nicht finde, hänge ich nun wieder an der LVDS
Simulationsgeschichte.
Wenn ich einen LVDS Takt habe, habe ich ein _p und ein _n Pad als Takt,
die dann über ein IBUFGDS aufgelöst werden. Also habe ich auch im
Testbench zwei Pads, die dem Takt entsprechen. Diese beiden Pads habe
ich dann wie folgt gesetzt:
1
AFE_CLK_P_process:process
2
begin
3
AFE_CLK_P<='0';
4
AFE_CLK_N<='1';
5
waitforAFE_CLK_P_period/2;
6
AFE_CLK_P<='1';
7
AFE_CLK_N<='0';
8
waitforAFE_CLK_P_period/2;
9
endprocess;
Nun kommt aber die Fehlermeldung, dass ich keinen Clock Port habe:
1
ERROR:HDLCompiler:245 - "tb_test2.vhd" Line 42. Binding entity lvds_clock_in does not have port clock
Wie kann ich dem Simulator sagen, dass der Takt sich aus zwei Pads
zusammen setzt?
Der Syntax Check läuft problemlos durch, die Fehlermeldung taucht erst
beim eigentlichen simulieren auf.
DANKE!
Also ich hab das schon so simuliert. Allerdings mit ModelSim. Hast du
denn die unisim Library mit drin?
In dem File, in dem du die IBUFGDS drin hast, musst du auch die Xilinx
Lib drin haben:
Die UNISIM ist mit eingebunden, sonst würde er ja auch in dem Topfile
was zu meckern haben.
Ich bin gerade etwas ratlos, wie ich diesem Programm mitteilen soll, das
er doch bitte diesen LVDS Takt hat.
Kann ich denn irgendwie den Takt (CLOCK_INT) nach dem IBUFGDS "anzapfen"
und den Testbench nach diesem Signal laufen lassen? Ich könnte zwar
einfach einen Takt annehmen (den resultierenden Takt der LVDS Signale
kenne ich ja) und den IBUFGDS weglassen, aber dann muss ich ja immer zum
simulieren alles umschreiben, was dann bei forgeschrittenem Design
sicher sehr aufwändig wird...
Zumal ich dann bei LVDS Ausgängen wieder das gleiche Problem bekommen
könnte.
DANKE!
Kannst du mal ModelSim XE Starter installieren, und schauen, ob es da
klappt? Ich hab gerade nochmal geschaut, ich hab das genauso simuliert,
und das hat funktioniert. Hatte zwar hinter den differenziellen
Eingängen direkt einen DCM, aber der hat auch nur einen IBUFGDS am
Eingang dann.
Oder kannst du das ganze Projekt mal zippen und reinstellen? Also nur
die Source Files, dann schau ich mal im ModelSim.
Achso, hab ich noch gar nicht beachtet... ich habe hinter dem IBUFGDS
auch einen DCM hängen, also hat der das schon integriert?
Muss ich mal schauen, ob ich einen DCM mit diff. Eingängen finde. Hab
das bisher immer mit einen extra IBUFGDS gelöst.
Im Anhang die beiden Dateien... das Design File (ist nur eins) und der
dazugehörige Testbench.
MfG & DANKE
Hallo,
ich habe ein wenig mit Modelsim rumprobiert und nun funktioniert es.
Aber ich habe noch zwei kleinere Fragen:
- Wieso speichert Modelsim, wenn ich die Parameter der Takte und
Einsgangssignale festelege, diese Werte nicht? Ich gehe meinetwegen mit
Rechtsklick - Clock und gebe alles ein. Wenn ich dann wieder einen
Rechtsklick mache, steht alles wieder auf Standard. Sehr nervig, wenn
man nur eine kleine Änderung machen kann.
- Wie komme ich nochmal in den DCM Wizzard? Ich suche schon eine ganze
Weile, habe ihn auch schon mal benutzt, aber ich finde ihn einfach nicht
mehr. Auch das Tutorial, was ich damals genutzt habe und wo drin stand,
ist scheinbar offline.
DANKE!!!
PS: Kannst du dir in deiner Simulation den Taktaussetzer bei ca. 50ps
erklären? Dieses Bild stellt sich auch ab und zu bei mir ein... gibt es
dafür eine Erklärung?
Zu deinen Fragen:
1. Was für Takte und Eingangssignale? Die werden in der TestBench in
VHDL beschrieben. Kann man zwar auch per forca machen, ist aber etwas
unschön. Und das VHDL bleibt ja gespeichert. Desweiteren kannst du dir
eine .do Datei schreiben, die die Simulation startet, die Signale in das
Wave Fenster einträgst usw.
2. Im ISE New Source -> IP Core
3. Die Taktaussetzer sind normal bei dem DCM, da initialisiert sich das
DIng, bzw. die DLL da drin rastet ein. Deswegen ist da ein LOCK Ausgang
dran, der zeigt an, dass der DCM Takt stabil ist. Hab ich extra deswegen
mit ins Bild reingenommen
Das mit dem TestBench hab ich noch nicht hinbekommen. Da muss ich gleich
nochmal schauen, dass ich meine Testbench vhdl Datei zum laufen bekomme.
Habe es bisher immer über force/clock gemacht, so wie es in diversen
Tutorials gemacht wird. Ein Tutorial mit Testbench habe ich noch nicht
gefunden, werde danach nochmal intensiver suchen.
Vielen Dank für deine umfassende Hilfe!!!
Ich hab einfach deine Testbench genommen, funktioniert doch einwandfrei.
Nur die anderen Eingangssignale musst du dann selbst hinzufügen (bei
"Place Stimulus here"
Meinetwegen
nWE <= '0';
Data <= x"0000";
wait for rising_edge(CLK);
nWE <= '1';
Data <= (others => 'Z');
wait für 200 ns;
....
So mal als fingiertes Beispiel....
Ja, aber wie bekomme ich den Testbench simuliert.
Ich kann ihn öffnen, aber wie kann ich Modelsim sagen, dass er die
ganzen Simulationsparameter und waveforms aus der Datei nehmen soll?
Ist sicher eine ganz simple Sache, aber ich komm gerade nicht drauf.
Du hast in deinem Screen ja die tb_test3 im workspace drin, nicht mal
das schaffe ich.
DANKE!!!
Am besten eine .do Datei schreiben:
vsim work.tb_test3 -t 1ps
add wave *
run 20000ns
Und die .do Datei auch dem Projekt hinzufügen und dann einfach Execute.