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
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
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!
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
Werd wohl morgen auf der uni alles durch Modelsim schicken....hab allen Signalen ein initvalue gegeben aber es ändert sich leider nichts :(
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
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).
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!
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.