Oui, dans un premier temps, je te conseillerais de tester avec une approche bête et méchante : avoir la partie "émulation" et la partie "transmission audio" complètement séparées (et potentiellement asynchrones), avec la partie transmission qui se limite à un timer à la fréquence d'échantillonnage de sortie (48 kHz est probablement le meilleur choix si tu veux que ce soit compatible avec le maximum de trucs). À chaque déclenchement du timer, tu copies simplement les valeurs des registres L_DAC et R_DAC dans le buffer de sortie audio HDMI. Tu peux éventuellement ajouter un étage intermédiaire qui latche la valeur des registres au moment où l'interruption I²S se produit, pour éviter la race condition qui se produit si la lecture tombe en même temps que l'écriture (et donc se retrouver potentiellement avec une ancienne valeur pour le canal gauche et une nouvelle pour le canal droit, ou le contraire).
C'est crade, mais c'est de loin la solution la plus simple pour avoir quelque chose qui fonctionne, à défaut d'être de haute qualité.
J'ai un peu de code pour le resampling, mais en y réfléchissant, c'est pas vraiment adapté à ce cas-là :
- les calculs sont en virgule flottante, donc chiant sur FPGA
- c'est prévu pour une fréquence de sortie variable, or on peut beaucoup simplifier les choses si les fréquences d'entrée et de sortie sont fixes, et encore plus si on accepte de retoucher un peu l'une ou l'autre (de façon à ce que le ratio des deux soit un nombre rationnel, avec un PPCM(numérateur, dénominateur) pas trop grand).
- c'était dans un contexte où le "contrôle de flux" est fait en externe (en gros, le resampler se contente de transformer les échantillons d'entrée en échantillons de sortie, sans devoir gérer le buffering, ce qui se passe quand le nombre d'échantillons en sortie varie de +/-1 par rapport au buffer précédent, etc.)
Donc si tu veux une solution "qualité", je pense qu'il vaut mieux un truc sur mesure conçu d'après les contraintes que tu as :
- est-ce que l'horloge d'entrée et/ou de sortie doit être synchrone avec autre chose (soit directement via un diviseur ou une PLL, soit à plus long terme), par exemple la génération vidéo ?
- est-ce qu'il est acceptable de changer un peu leur fréquence, et si oui, de combien ? (sachant que la fréquence est déjà pas exactement la même entre une Jaguar NTSC et une Jaguar PAL, donc même à la base, il y a déjà une marge de tolérance)
- de quelles horloge(s) et PLL(s) tu disposes dans ton FPGA ?
- est ce qu'il y a un peu de buffering côté audio HDMI, ou c'est strictement isochrone ?
(après, je peux détailler un peu la partie algo, mais je ne sais pas si ce n'est pas mettre la charrue avant les bœufs
)