Diseño con AC'97: ¿por qué no tiene un búfer (FIFO)?

El códec AC'97 parece dominar el mundo de la E/S de audio digital, pero lo extraño es que no tiene interrupciones ni búfer, por lo que es difícil interactuar con un controlador, que tiene otras actividades. El AC97 exige sondearlo periódicamente (44k veces por segundo), verificando el tiempo para comunicar una siguiente muestra. Esta no es la forma habitual de comunicarse por lo general. Por lo general, la CPU llena un búfer y recibe una notificación cuando se completa la operación o espera explícitamente el resultado si no tiene nada más que hacer. Tal "procesamiento por lotes" es más eficiente porque, en primer lugar, enviar ráfagas es más eficiente que hacer un elemento a la vez y, en segundo lugar, reduce el cambio de contexto n veces, lo que también optimiza los recursos computacionales en consecuencia. Pero, necesitas un FIFO para eso. Lo que hay de bueno en esto, en muestra a tiempo, terrible diseño de AC97 y por qué a nadie le importa? Veo que Xilinx lo arregla con la placa de demostración ML507 (veo FIFO en el controlador AC97 presentado allí) pero tengo la placa V5 Genesys de Digilent cuyo controlador no proporciona ningún FIFO. De modo que Microblaze debe comunicar una muestra cada 1/44100 de segundo. ¿Es eficiente? ¿Cómo se supone que debes controlarlo?

En un FPGA, puede agregar fácilmente su propio FIFO al diseño.
Fue diseñado hace 15 años. Hoy en día, estos dispositivos son tan baratos que la mayoría de las placas base tienen uno o más de ellos, pero en esos días una tarjeta de sonido era bastante cara. Los diseñadores optaron por una interfaz económica implementada por software en contraste con un hardware DMA aún más costoso. Tenga en cuenta que el hardware de la computadora en el '90 era mucho más caro de lo que es hoy.
@jippie, Cómo mover HW de una parte a otra ahorra recursos de HW. En segundo lugar, ser un dispositivo antiguo no significa que debamos seguir usándolo. El hecho de que el códec carezca de controlador dificulta su uso y plantea una pregunta: ¿por qué desperdiciar recursos de diseñador/HW desarrollando un controlador personalizado en lugar de agregarlo a AC'97? Tercero, ¿por qué DMA? FIFO solo hace que las cosas sean mucho más útiles. Por ejemplo, UART también es un dispositivo antiguo, pero tienden a tener un búfer interno que puedo llenar y estar libre durante más tiempo que enviando cada byte por separado. DMA no es necesario aquí.
Es barato, los conductores están en todas partes. ¿Por qué agregar costoso hardware adicional a un sistema si la CPU puede hacerlo por usted de forma gratuita? Tenga en cuenta que un fabricante de hardware de grado de consumo no quiere gastar un solo centavo extra si no es realmente necesario.
¿Por qué se agregaron búferes a los UART si la CPU puede hacer lo mismo de forma gratuita? Porque si la CPU hace cosas estúpidas "gratis", no puede hacer nada más.

Respuestas (3)

La parte de enlace de CA de la especificación AC97 define la interfaz de cinco hilos entre el códec y un controlador. Esto no es solo una interfaz de datos, sino también una interfaz de tiempo. Esta distinción puede no parecer importante en un pequeño sistema integrado con solo un códec, pero se vuelve crucial en un sistema más grande, como una mesa de mezclas digital de 96 canales. En este tipo de sistema, todas las interfaces de audio deben funcionar exactamente con la misma frecuencia de muestreo y alineación de fase, y el estándar AC-link está diseñado para admitir eso.

Como han insinuado las otras respuestas, es responsabilidad del dispositivo en el otro extremo del enlace, el "controlador", que podría ser un ASIC dedicado, parte de un FPGA o un microcontrolador, administrar tanto el tiempo de la códecs en el sistema según sea necesario, así como el movimiento de datos de un dominio de tiempo a otro con el uso de FIFO o búfer adecuados.

Ok, esta respuesta explica muy bien por qué necesitamos sincronizar cada muestra. Pero, al mismo tiempo, AC'79 es el estándar de facto de la electrónica de consumo, la parte dominante del mercado, que no tiene nada que ver con las mesas de mezclas multicanal. Aunque los FIFO pueden mejorar el ancho de banda al cruzar dominios, no creo que este sea el problema principal aquí. En mi opinión, la eficiencia se ve afectada negativamente por el hecho de que la CPU tiene que desviarse todo el tiempo de sus funciones para controlar el códec. FIFO reduce la frecuencia de servir AC'97 y move(buf_ptr,len) es más eficiente que para cada i<len move(buf[i])
No precisamente. La mayoría de los microcontroladores que usaría en este tipo de aplicación tienen soporte de hardware para I2S, que generalmente es compatible con AC97, incluido DMA, lo que significa que la participación de la CPU debería ser bastante mínima.

Los códecs de audio son dispositivos en tiempo real. Esperan que les proporcione (o lea de ellos) muestras en cada período de muestra. El diseño de un códec de audio simple sería mucho más complejo si les trasladara esa responsabilidad. Más fácil para ti, más difícil y más caro para el códec.

Una posible solución sería usar un motor/canal DMA. Así que coloque sus bits de audio pcm en alguna ubicación contigua en la memoria y apunte el motor DMA a esos bits y su interfaz AC97. Haga que la frecuencia de escritura de dma sea de 44.1K y luego déjelo funcionar. Puede hacer lo contrario para obtener audio.

Usted también podría hacer este bloque usted mismo, simplemente teniendo su propio fifo hecho de memoria fpga interna.

Aquí hay un núcleo de controlador AC97 en OpenCores con soporte dma externo http://opencores.org/project,ac97

Todo el mundo necesita un códec con el que sea más fácil comunicarse. Ser en tiempo real no cambia este hecho. Sería más sencillo que el códec no existiera en absoluto. ¿Quiere decir que la interfaz existente permite la flexibilidad de elegir entre FIFO y DMA? Podría escribir en FIFO o ordenar al DMA que transfiera muestra por muestra en el momento adecuado. ¿Bien?
Estaba diciendo que podría DMA en el momento apropiado a cualquier interfaz AC97 que esté usando dentro del FPGA. Todavía necesita algo de lógica FPGA para convertir sus datos al flujo en serie que desea el AC97.
La lógica para convertir los datos en un flujo en serie que necesita el códec AC97 se denomina "controlador" del códec. Obviamente, el kit de desarrollo proporciona uno (de lo contrario, la CPU no podría continuar), pero no tiene FIFO en su interior. Esa es mi pregunta en realidad, ¿por qué un diseño de controlador tan estúpido?

Probablemente podría diseñar el FPGA para que contenga un MicroBklaze para sondear y escribir datos en el subsistema AC97. Sin embargo, realmente sugeriría dar un paso atrás y pensar de dónde provienen realmente los datos de origen. En la mayoría de los casos, querrá diseñar un widget de hardware, en lógica FPGA, para tomar el flujo de datos de origen y enviarlo al subsistema AC97 sobre la marcha a la velocidad correcta. Si la velocidad de datos es correcta pero puede haber algunas variaciones espurias en el flujo de datos, entonces tendría mucho sentido insertar búferes elásticos FIFO como parte del widget de hardware. Los FPGA tienen buenos módulos para crear FIFO