Forum: FPGA, VHDL & Co. Genesys 2 (Xilinx Kintex 7): Audio-Codec Implementierung und Filteranbindung


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von itse_me_mario (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich versuche gerade einen FIR-Filter mit einer Abtastrate von 16 kHz auf 
dem Genesys 2 Board 
(https://reference.digilentinc.com/reference/programmable-logic/genesys-2/reference-manual) 
zu implementieren (Vivado 2019.2, VHDL). Für diesen Zweck muss ich den 
boardinternen Audio-Codec (ADA1761) konfigurieren. Ich habe bereits ein 
FIR-Filter in der transponierten Direktform implementiert und getestet, 
welches ich zu einem späteren Zeitpunkt anbinden möchte.

Ich habe einen Artikel von Stefan Scholl „Audio Interface for the 
Zedboard“ gefunden (TU Kaiserslautern Germany, see 
https://kluedo.ub.uni-kl.de/frontdoor/deliver/index/docId/4034/file/zedboard_audio_doc.pdf). 
Dieses Framwork basiert auf einem Framework von Mike Field (alias 
hamster).
Die VHDL-files sind auch dabei 
(https://github.com/ems-kl/zedboard_audio).

Ich habe das alte Framework in ein angepasstes Framework für das Genesys 
2 umgewandelt, da es sich um denselben Audio-Codec handelt. Leider 
funktioniert etwas nicht, und ich weiß NOCH nicht wie ich den Fehler 
behebe (Critical Timing Problem).

Als erstes möchte ich den LINE IN Input direkt an den HP OUT Ausgang 
weitergeben. Als nächsten Schritt möchte ich dann meinen FIR-Filter 
(Festkommarealisierung) anbinden. Für die Funktionsanalyse benutze ich 
dann das Analog Discovery 2 von Digilent (Frequenzgang messen mit 
Sinussweeps).


Critical Warnings:
[Timing 38-282] The design failed to meet the timing requirements. 
Please see the timing summary report for details on the timing 
violations.

[Board 49-67] The board_part definition was not found for 
digilentinc.com:genesys2:part0:1.1. This can happen sometimes when you 
use custom board part. You can resolve this issue by setting 
'board.repoPaths' parameter, pointing to the location of custom board 
files. Valid board_part values can be retrieved with the 
'get_board_parts' Tcl command.


Ich dachte erst mein Framework funktioniert, aber wenn man hphone_out_l 
und hphone_out_r auf 0 setzt höre ich immer noch die Musik von meinem 
IPod über die Kopfhörern (aufgrund des defaultmäßigen 
Startup-Programms).

Wenn das Design funktioniert, möchte ich das Codec-Interface hochladen. 
Vielleicht kann auch jemand anderes dieses Interface benötigen.

Wenn mir jemand helfen könnte, oder ein anderes Audio-Codec Interface 
hat, würde ich mich sehr freuen.

Ich habe eine Modulübersicht, das Block Design und die vhdl-Dateien 
angehängt. Auch die Codec Konfiguration (docx) sowie die Fehlermeldungen 
befinden sich im Anhang. Wenn erwünscht, kann ich weitere Files 
hochladen.

Vielen Dank im Voraus.

Bleibt gesund und beste Grüße
Mario

von itse_me_mario (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Weitere Dateien

Ich werde jetzt mal versuchen den Systemtakt auf 50 MHz zu reduzieren. 
Vielleicht verschwinden die Timing-Probleme ja dann...

von Mario A. (itse_me_mario)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
VHDL-Dateien.

von Klakx -. (klakx)


Bewertung
1 lesenswert
nicht lesenswert
In der STA steht ein Requirement von 0.8 ns. Das kommt mir zu klein vor.

Asynchroner Taktübergang? Wahrscheinlich springst du ohne Vorkehrungen 
zwischen 48 MHz und 100 MHz. Die würde ich wie asynchrone Takte 
behandeln.

Oder du stellst diese auf 48 und 96 MHz (oder 48 und 144 MHz), falls 48 
MHz fix bleiben muss. Dann können die Übergänge wieder synchron bleiben.

Wie sieht das Constraint-File aus? ... und schau dir die Taktübergänge 
genauer an.

von Mario A. (itse_me_mario)


Bewertung
0 lesenswert
nicht lesenswert
Danke für deine Anmerkungen!

Was meinst du mit STA?

Das Constraints File sieht so aus 
(https://github.com/Digilent/digilent-xdc/blob/master/Genesys-2-Master.xdc):

#### This file is a general .xdc for the Genesys 2 Rev. H
#### To use it in a project:
#### - uncomment the lines corresponding to used pins
#### - rename the used ports (in each line, after get_ports) according 
to the top level signal names in the project

## Clock Signal
set_property -dict { PACKAGE_PIN AD11  IOSTANDARD LVDS     } [get_ports 
{ sysclk_n }]; #IO_L12N_T1_MRCC_33 Sch=sysclk_n
set_property -dict { PACKAGE_PIN AD12  IOSTANDARD LVDS     } [get_ports 
{ sysclk_p }]; #IO_L12P_T1_MRCC_33 Sch=sysclk_p



## Audio Codec
set_property -dict { PACKAGE_PIN AH19  IOSTANDARD LVCMOS18 } [get_ports 
{ aud_adc_sdata }]; #IO_L8N_T1_32 Sch=aud_adc_sdata
set_property -dict { PACKAGE_PIN AD19  IOSTANDARD LVCMOS18 } [get_ports 
{ aud_adr0 }];#{ aud_adr[0] }]; #IO_L10P_T1_32 Sch=aud_adr[0]
set_property -dict { PACKAGE_PIN AG19  IOSTANDARD LVCMOS18 } [get_ports 
{ aud_adr1 }];#{ aud_adr[1] }]; #IO_L8P_T1_32 Sch=aud_adr[1]
set_property -dict { PACKAGE_PIN AG18  IOSTANDARD LVCMOS18 } [get_ports 
{ aud_bclk }]; #IO_L11N_T1_SRCC_32 Sch=aud_bclk
set_property -dict { PACKAGE_PIN AJ19  IOSTANDARD LVCMOS18 } [get_ports 
{ aud_dac_sdata }]; #IO_L7P_T1_32 Sch=aud_dac_sdata
set_property -dict { PACKAGE_PIN AJ18  IOSTANDARD LVCMOS18 } [get_ports 
{ aud_lrclk }]; #IO_L9P_T1_DQS_32 Sch=aud_lrclk
set_property -dict { PACKAGE_PIN AK19  IOSTANDARD LVCMOS18 } [get_ports 
{ aud_mclk }]; #IO_L7N_T1_32 Sch=aud_mclk
set_property -dict { PACKAGE_PIN AE19  IOSTANDARD LVCMOS18 } [get_ports 
{ aud_scl }]; #IO_L10N_T1_32 Sch=aud_scl
set_property -dict { PACKAGE_PIN AF18  IOSTANDARD LVCMOS18 } [get_ports 
{ aud_sda }]; #IO_L11P_T1_SRCC_32 Sch=aud_sda



## IIC Bus
#set_property -dict { PACKAGE_PIN AE30  IOSTANDARD LVCMOS33 } [get_ports 
{ SYS_SCL }]; #IO_L16P_T2_13 Sch=sys_scl
#set_property -dict { PACKAGE_PIN AF30  IOSTANDARD LVCMOS33 } [get_ports 
{ SYS_SDA }]; #IO_L16N_T2_13 Sch=sys_sda

Ich habe die nicht verwendeten Ports gleich mal weggelassen.

: Bearbeitet durch User
von Mario A. (itse_me_mario)


Bewertung
0 lesenswert
nicht lesenswert
Okay --> STA = Static Timing Analysis.
Requirement 0.833.

von Markus F. (mfro)


Bewertung
0 lesenswert
nicht lesenswert
Mario A. schrieb:
> Das Constraints File sieht so aus

da sind nur PIN-Assignments drin?

Wenn Du die asynchronen Clock-Domänen nicht aktiv für die Timing-Analyse 
auftrennst, wird die Synthese (trotz evt. vorhandenen Synchronizern) 
versuchen, die sich aus der CDC ergebenden Timing-Requirements zu 
optimieren.
Das kann nicht gutgehen.

von Mario A. (itse_me_mario)


Bewertung
0 lesenswert
nicht lesenswert
Danke für den Tipp! Das wusste ich bisher nicht. Solange arbeite ich 
leider auch noch nicht mit FPGAs.

Hab mir gerade nochmal das vorher verwendete XDC für das Zedboard 
angesehen.
Unter Anderem sieht es folgendermaßen aus:

# timing constraints
create_clock -period 10.000 -name clk_100 [get_ports clk_100]

set_false_path -from [get_clocks zed_audio_clk_48M] -to [get_clocks 
clk_100]
set_false_path -from [get_clocks clk_100] -to [get_clocks 
zed_audio_clk_48M]


# 100 mhz clock
set_property PACKAGE_PIN Y9 [get_ports clk_100]
set_property IOSTANDARD LVCMOS33 [get_ports clk_100]




Die von dir beschriebene Auftrennung, die ich vornehmen muss ist dann 
wohl set_false_path ... ?

Ich werde das morgen probieren und die 2 Zeilen set_false_path anpassen 
und einbinden.

von Mario A. (itse_me_mario)


Bewertung
0 lesenswert
nicht lesenswert
Ich habe mal versucht das Constraintsfile anzupassen, aber bislang ohne 
Erfolg.

Unter Anderem habe ich es mit

set_false_path -from [get_clocks zed_audio_clk_48M] -to [get_clocks
clk_100]
set_false_path -from [get_clocks clk_100] -to [get_clocks
zed_audio_clk_48M]

--> [Vivado 12-4739] set_false_path:No valid object(s) found for '-to 
[get_clocks clk_100]'. [Genesys2Master.xdc:13]

und

set_false_path -from [get_clocks zed_audio_clk_48M] -to [get_clocks
sysclk_p]
set_false_path -from [get_clocks sysclk_p] -to [get_clocks
zed_audio_clk_48M]

--> The design failed to meet the timing requirements. Please see ...

und

set_false_path -from [get_clocks zed_audio_clk_48M] -to [get_clocks
sysclk_p]
set_false_path -from [get_clocks sysclk_p] -to [get_clocks
zed_audio_clk_48M]
set_false_path -from [get_clocks zed_audio_clk_48M] -to [get_clocks
sysclk_n]
set_false_path -from [get_clocks sysclk_n] -to [get_clocks
zed_audio_clk_48M]

--> [Vivado 12-4739] set_false_path:No valid object(s) found for '-to 
[get_clocks sysclk_n]'. [Genesys2Master.xdc:19]

versucht, nachdem ich clocking.vhd (Originaldatei) wieder eingebunden 
und die (Clock-)Signale wieder in den Ausgangszustand des Autors 
zurückgesetzt habe.


Da ich nur sysclk_p und sysclk_n über das XDC ansprechen kann, muss ich 
mir über den Clocking-Wizard meinen Clock (differential input) erzeugen 
oder?
Ich kann ja nicht einfach, wie der Autor:

create_clock -period 10.000 -name clk_100 [get_ports clk_100]
set_property PACKAGE_PIN Y9 [get_ports clk_100]
set_property IOSTANDARD LVCMOS33 [get_ports clk_100]

schreiben.

Leider muss ich jetzt bis zum Wochenende erstmal ein paar andere Dinge 
erledigen, bevor ich wieder viel Zeit investieren kann.

von Markus F. (mfro)


Bewertung
0 lesenswert
nicht lesenswert
Ich sehe in deinem Toplevel nur diese Clocks:
clk_48_MHz             : in STD_LOGIC;
clk_100_MHz            : in STD_LOGIC;

Die sehe ich aber wiederum in deinen Constraints nicht?

von Mario A. (itse_me_mario)


Bewertung
0 lesenswert
nicht lesenswert
Hallo Markus,

das eigentliche Toplevel ist audio_testbench (die Namensbezeichnung ist 
etwas unglücklich, aber entspricht dem Originalprojekt --> werde ich 
besser bald mal ändern!). Dort verwende ich sysclk_p und sysclk_n in der 
Entity. Aus denen erzeuge ich mir über den Clocking Wizard die weiteren 
Clocks.
Eine Ebene darunter kommt dann audio_top. Dort verwende ich die vom 
Clocking Wizard erzeugten Signale.

von Klakx -. (klakx)


Bewertung
0 lesenswert
nicht lesenswert
wenn die Clocks noch durch einen Clock-Manager laufen hilft es die 
generierten Clocks mit einzubeziehen:
get_clocks -include_generated_clocks clk1 

Natürlich kann man die Taktübergänge generell von der Prüfung 
abschalten.

Ich rate dir dies nicht kopflos zu tun. Schau dir betroffenen Signale 
ganz gut an und stell dir die Frage, ob du in jeder Phasenlage mit dem 
Signal umgehen kannst.

Will man vorsichtig sein, reicht es aus nur die betroffenen Signale per 
set_false_path (oder set_max_delay) zu constrainieren.

von Mario A. (itse_me_mario)


Bewertung
0 lesenswert
nicht lesenswert
Danke für deine Hilfe!

Also unter Report Timing Summary zeigt es mir den Fehler bei 
clk_out1_clk_wiz_0 to clk_out2_clk_wiz_0
und
clk_out2_clk_wiz_0 to clk_out1_clk_wiz_0
an.

Erst einmal nur diese beiden mit set_false_path setzen?

Variante 1 in xdc:

get_clocks -include_generated_clocks clk_out1_clk_wiz_0
get_clocks -include_generated_clocks clk_out2_clk_wiz_0

set_false_path -from [get_clocks clk_out1_clk_wiz_0] -to [get_clocks 
clk_out2_clk_wiz_0]
set_false_path -from [get_clocks clk_out2_clk_wiz_0] -to [get_clocks 
clk_out1_clk_wiz_0]

--> In den Messages steht nur noch [Board 49-67] The board_part 
definition was not found for digilentinc.com:genesys2:part0:1.1. This 
can happen sometimes when you use cumstom board part. You can resolve 
this issue by setting 'board.repoPaths' parameter, pointing to the 
location of custom board files. Valid board_part values can be retrieved 
with the 'get_board_parts' Tcl command.

Unter Implementation --> Report Timing Summary zeigt es mir allerdings 
immer noch denselben Fehler an.

Variante 2 in xdc:

get_clocks -include_generated_clocks clk_out1
get_clocks -include_generated_clocks clk_out2

set_false_path -from [get_clocks clk_out1] -to [get_clocks clk_out2]
set_false_path -from [get_clocks clk_out2] -to [get_clocks clk_out1]

--> set_false_path: No valid object(s) found for '-from [get_clocks 
clk_out1]'.

Leider schaffe ich es voraussichtlich nicht vorm Wochenende mich 
intensiv mit false_paths zu beschäftigen. Ich kann es aber kaum erwarten 
und hoffe, dass es der entscheidende Fehler ist und der Codec dann 
endlich funktioniert. Eine Stunde am Tag versuche ich dennoch bis dahin 
einzuräumen.

von Markus F. (mfro)


Bewertung
0 lesenswert
nicht lesenswert
Klakx -. schrieb:
> Will man vorsichtig sein, reicht es aus nur die betroffenen Signale per
> set_false_path (oder set_max_delay) zu constrainieren.

Kenne Vivado nicht, aber

set_clock_groups -asynchronous -group <clock1> -group <clock2> ...

ist meist die bessere Wahl (anstatt x set_false_path Statements)?

von Mario A. (itse_me_mario)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich hab heute mal wieder versucht die asynchronen Clocks zu setzen.

Unter anderem im XDC mit:
get_clocks -include_generated_clocks clk_out1_clk_wiz_0
get_clocks -include_generated_clocks clk_out2_clk_wiz_0
set_clock_groups -asynchronous -group {clk_out1_clk_wiz_0} -group 
{clk_out2_clk_wiz_0}

nachdem ich mir in der Tcl Console mit report_clocks die Clocks 
angesehen habe. Die Ergebnisse von report_cdc hänge ich euch auch noch 
an. Außerdem habe ich mir mit Report Clock Interaction die 
Abhängigkeiten angesehen.

Ein Critical Warning bzgl. Timing habe ich jetzt nicht mehr.
Allerdings: [Vivado 12-4739] set_clock_groups:No valid object(s) found 
for '-group clk_out1_clk_wiz_0'. 
["C:/Users/aim34424/Desktop/Forum/Genesys2AudioCodecPlayground/FIRFilter 
withCodec.srcs/constrs_1/new/Genesys2Master.xdc":56]

und

[Board 49-67] The board_part definition was not found for 
digilentinc.com:genesys2:part0:1.1. This can happen sometimes when you 
use custom board part. You can resolve this issue by setting 
'board.repoPaths' parameter, pointing to the location of custom board 
files. Valid board_part values can be retrieved with the 
'get_board_parts' Tcl command.



Ich habe dann noch einmal versucht statt
hphone_l <= line_in_l;
hphone_r <= line_in_r;
nur 0en an den Ausgang zu geben:
hphone_l <= (others => '0');
hphone_r <= (others => '0');
--> man hört immer noch die Musik vom IPod über die angeschlossenen 
Kopfhörer. Sche

von Mario A. (itse_me_mario)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Dateien

von Mario A. (itse_me_mario)


Bewertung
0 lesenswert
nicht lesenswert
set_property CFGBVS VCCO [current_design]
set_property CONFIG_VOLTAGE 3.3 [current_design]

habe ich noch ins XDC eingefügt. Jetzt sind wieder 2 Warnings weg.

von Mario A. (itse_me_mario)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Okay, ich habe nun set_clock_groups wie folgt angewandt:
https://www.xilinx.com/video/hardware/clock-group-constraints.html

Jetzt kennt Vivado auch auf einmal mein Constraints-File. Daraufhin 
wurde set_clock_groups -asynchronous -group [get_clocks *clk_out1*] 
-group [get_clocks *clk_out2*] automatisch eingefügt in ein neues 
(leeres) XDC-File. Anschließend habe ich noch meine Pin-Assignments 
eingefügt.

Nun habe ich noch:
[Board 49-67] The board_part definition was not found for 
digilentinc.com:genesys2:part0:1.1. This can happen sometimes when you 
use custom board part. You can resolve this issue by setting 
'board.repoPaths' parameter, pointing to the location of custom board 
files. Valid board_part values can be retrieved with the 
'get_board_parts' Tcl command.

: Bearbeitet durch User
von Mario A. (itse_me_mario)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Aktuelle Warnings.

von Mario A. (itse_me_mario)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt habe ich noch zusätzliche Board-Files hinzugefügt.
https://reference.digilentinc.com/reference/software/vivado/board-files.

Die Warning:

[Board 49-67] The board_part definition was not found for ...

hat sich nun auch erledigt.

Es bleiben die angehängten Warnings. Wenn ich den Bitstream auf das 
Board spiele hört man wieder die Musik vom IPod über die Kopfhörer. Wenn 
ich dann wieder hphone_l und hphone_r auf 0 setze höre ich leider immer 
noch die Musik vom IPod.

Die Warning "No constraints selected or write" kann man denke ich 
ignorieren.
https://www.xilinx.com/support/answers/73510.html

Ich denke ich werde nun mal versuchen den ILA einzubauen.

: Bearbeitet durch User

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.