Forum: FPGA, VHDL & Co. Debug Hilfe benötigt bei Mixed Language Modul


von Alexx (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!

Für ein Uni Projekt habe ich ein FFT Modul geschrieben. Basieren auf dem 
Spiral FFT Generator. Ziel ist es ein Audiosignal auf dem Zedboard aus 
Linux in die PL zu schicken, dort soll die FFt durchgeführt werden. 
Damit möchte ich sowohl das Spektrum über HDMI anzeigen und auch einige 
Frequenzkomponenten löschen (Tief/Hochpass). Dannach werden diese 
mittels IFFT rücktransformiert und das Signal wird wieder an den ARM 
gesendet und soll ausgegeben werden (Schnittstelle Linux/PL mittel 
Xillybus IP core).

Ich habe nun folgendes Problem: In der beiliegenen (bei der Spiral FFT) 
Testbench funktioniert alles (ich musste einige Names ändern da ich 
sowohl die FFT als auch IFFT benutzen möchte und die componenten in 
beiden Files die gleichen namen hatten). In meinem VHDL Modul 
(FFT_Interface) wurden die Verilog Module (leider bin ich Verilog nciht 
mächtig) eingebunden. Das FFT modul zeigt mittels eines Flags(nextL_out, 
in der Testbench mytestsig) dass im nächsten Takt Daten ausgegeben 
werden. In der Verilog Testbench funktioniert das, in meinem Modul 
jedoch nicht. Das Signal mytest ist direkt mit dem Y0 Ausgang des FFT 
moduls verbunden und in die Testbench geleitet. In der Simulation ist 
das Signal jedoch undefiniert (XXXX).

Es wäre toll wenn jemand behilflich sein könnte und kurz drüberschaun 
möchte. Ich weis das mein Code Stil alles andere als perfekt ist, ich 
gelobe jedoch besserung!

LG und danke im Voraus
Alex

von Charles G. (Firma: Ingenieurbuero Gardiner) (cfgardiner)


Angehängte Dateien:

Lesenswert?

Für's Erste, würde ich sagen alle Signale die in deinen Processes ohne 
Reset ihre Treiber haben, sollten bei der Deklaration Default Werte 
bekommen

z.B. im Process clked in der Datei FFT_Interface.vhd

Ich habe einige probeweise gepatched aber es sind zu viele ...

Machst du was für Xilinx, dass du kein globales Reset Konzept hast? Ich 
würde trotzdem wenigstens einen synchronen Reset einführen.

: Bearbeitet durch User
von Alexx (Gast)


Lesenswert?

Hallo! Vielen Dank für die Tipps!

Ja es soll auf ein Zedboard mit Zynq! Ist ein globaler Reset so wichtig? 
Da auf dem System Linux laufen wird bekomme ich kein reset in die PL 
hinein.

Hattest du dieses Simulationsergebnis schon von anfang an? In meiner 
Simmulation bleibt der State bei WAITIFFT hängen! So bin ich erstmal auf 
den Fehler gekommen dass das ausgangssignal der FFT garnicht übernommen 
wird!

von Charles G. (Firma: Ingenieurbuero Gardiner) (cfgardiner)


Lesenswert?

Alexx schrieb:
> Ist ein globaler Reset so wichtig?
das kommt anscheinend darauf an, wen du fragst. Ich sage definitiv ja. 
Auch wenn Xilinx z.B. etwas anders propagieren möchte, du siehst hier 
was passiert mit einem OEM Simulator. ISim nehme ich gar nicht her. Es 
ist kein Standard, es sei denn ich entwickele ausschliesslich für X. Ein 
Design und vor allem ein Testbench braucht nun Mal einen definierten 
Startpunkt.

> Hattest du dieses Simulationsergebnis schon von anfang an? In meiner
> Simmulation bleibt der State bei WAITIFFT hängen! So bin ich erstmal auf
> den Fehler gekommen dass das ausgangssignal der FFT garnicht übernommen
> wird!

Yupp, alles schnell die Reihe nach durch Aldec Riviera gejagt und für 
ca. 150 us laufen lassen. (Keine Compile-/Elaborier-Fehler bei Vlog 2005 
bzw. vhdl 2008, also gratuliere)

Manuelle habe ich zunächst nur Command in der Testbench Datei einen 
Startwert gegeben.
   signal SigDataCommand : std_logic_vector (15 downto 0) := (others => 
'0');

: Bearbeitet durch User
von Alexx (Gast)


Lesenswert?

Werd wohl morgen auf der uni alles durch Modelsim schicken....hab allen 
Signalen ein initvalue gegeben aber es ändert sich leider nichts :(

von Charles G. (Firma: Ingenieurbuero Gardiner) (cfgardiner)


Angehängte Dateien:

Lesenswert?

Alexx schrieb:
> aber es ändert sich leider nichts

In der Tat, es schaut ein Bisschen verzwickter aus.
Ich habe Riviera mit folgendem Aufruf gestartet:
vsim -dbg fft_mnet_lib.Interface_TB -t 100ps +access +r -initregs 0;log 
-rec sim:/*;run 150 us

(Modelsim wird ein ähnlicher Aufruf haben.)

Damit muessten alle nicht intialisierte Verilog Regs einen Startwert 
bekommen. Die 'X'en sind trotzdem noch da. Auf dem ersten Blick scheinen 
sie aus den nicht initialisierten Memories zu kommen, -initregs wirkt 
nicht auf Memories.
Wahrscheinlich brauchst du z.B. eine Initialisierungs State Maschine, 
die alle Ausgänge maskiert bis die Memories geladen sind. Ich bin zwar 
nicht so weit durchgestiegen, dass ich alles verstehe was du machst, 
aber ich vermute, dass vorangegangene Werte in die Memories geschrieben 
werden um Delay Taps zu implementieren (oder so was ähnliches).

Jedenfalls ein 'X' Kern scheint der process in Zeile 4034 von FFT.v zu 
sein.

: Bearbeitet durch User
von Alexx (Gast)


Lesenswert?

Die Frage die sich mir nun stellt ist: Wie ist das in der hardware? Sind 
hier nur simmulationstools überfordert oder ist es tatsächlich ein 
Problem?

Den die DFT funktioniert eigentlich mit der mitgelieferten Testbench 
(wie gesagt, die ist nicht selbstgeschrieben, kommt von 
http://www.spiral.net/hardware/dftgen.html).

von Alexx (Gast)


Lesenswert?

Ohne den Ring buffer funktioniert das Design (nur kleine änderungen die 
ich eigentlich anders hatte und dann wieder zurückänderte)...Das problem 
war der undefined ausgangswert des Ringbuffers. Scheinbar funktioniert 
er nicht ganz richtig und ein undefined rutscht als Daten raus!

Vielen Dank für deine Hilfe!

von Charles G. (Firma: Ingenieurbuero Gardiner) (cfgardiner)


Lesenswert?

Alexx schrieb:
> Die Frage die sich mir nun stellt ist: Wie ist das in der hardware? Sind
> hier nur simmulationstools überfordert oder ist es tatsächlich ein
> Problem?
>

Überfordert sicher nicht. Es ist halt ein anderer Ansatz. Die 
Simulatoren arbeiten nach den Verilog bzw. VHDL Spezifikationen und da 
ist z.B. auch geregelt wie die Initialwerte zum Zeitpunkt T0 zu stehen 
haben.

In der Praxis gibt es natürlich kein 'X' oder 'U'. Was es aber geben 
kann sind obskure Konstellationen von speichernden Elementen, die mal 
harmlos, mal ein unangenehmer Knacks in einer Audioübertragung und mal 
ein FSM Hänger sind. Eine robuste Logik muss in der Lage sein nach einem 
'unangenehmen Zustand' selbst zu erholen oder eben braucht sie einen 
sauberen Reset.

> Den die DFT funktioniert eigentlich mit der mitgelieferten Testbench
> (wie gesagt, die ist nicht selbstgeschrieben, kommt von
> http://www.spiral.net/hardware/dftgen.html).

Jetzt habe ich mal interessenshalber den Verilog Testbench angeworfen, 
es kostet ja nur einen Ausruf. Im Testbench wird am Anfang sauber 
initialisiert, ich denke nach dem Wegnehemen des Resets braucht deine 
Logik eine 'Start Maschine', die alle X[15:0] Eingänge für z.B. 32 
Zyklen auf '0' treibt. Danach kann das Leben losgehen. Ich meine gesehen 
zu haben, dass die interne Mems eine 5-bit Adressvektor haben.

Wenn du den folgenden Abschnitt des Testbenches (fft.v) anschaust, 
schaut es so aus, dass zuerst bekannte Werte angelegt werden und dann 
auf ein aktives nextL gewartet wird bevor der eigentliche Test startet.

   222     initial begin
   223        // set initial values
   224        in[0] <= 0;
   225        in[1] <= 0;
   226        in[2] <= 0;
   227        in[3] <= 0;
   228        in[4] <= 0;
   229        in[5] <= 0;
   230        in[6] <= 0;
   231        in[7] <= 0;
   232        in[8] <= 0;
   233        in[9] <= 0;
   234        in[10] <= 0;
   235        in[11] <= 0;
   236        in[12] <= 0;
   237        in[13] <= 0;
   238        in[14] <= 0;
   239        in[15] <= 0;
   240        nextL <= 0;
   241        reset <= 0;
   242
   243        @(posedge clk);
   244        reset <= 1;
   245        @(posedge clk);
   246        reset <= 0;
   247        @(posedge clk);
   248        @(posedge clk);
   249        // Wait until nextL_out goes high, then wait one clock 
cycle and begin receiving data
   250        @(posedge nextL_out);
   251        @(posedge clk); #1;
   252        $display("--- begin output wire 1---");

Da du gemeint hast, dass deine Verilog Kenntnisse nicht ganz auf der 
Höhe sind, die "initial" Prozesse sind nichts anders als ein process, 
das nur einmal läuft und automatisch bei T0 gestartet wird.

von Alexx (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!

Endlich funktioniert alles :D
Ich hätte echt erwartet dass die Audioqualität schlechter wird, ist aber 
echt in ordnung. Bin echt begeistert davon :)


Danke nochmals für deine Hilfe. Bei VHDL lernt man mit jedem 
Projekt/Aufgabe mehr.

Ganz wichtige Lektion: Wenn man von wem anderen Code nimmt immer auf 
eine Testbench bestehen, bzw. nur Code weitergeben der von einem selbst 
getestbenched wurde...

Im Anhang eine Simmulation einer Transformation und Rücktransformation! 
(Nur während LOAD wird das eingangssignal gespeichert zur 
transformation)

LG Alex

von Dieter (Gast)


Lesenswert?

Hallo!

Ich arbeite momentaqn auch mit dem DFT von Spiral Project aber habe 
probleme mit dem format der Daten. Könntest du vielleicht deine Dateien 
hier hochladen um mir das Debuggen meines Problems erleichtern?

LG
Dieter

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.