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.
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');
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.
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