Cómo generar sonido en VHDL

1

Soy nuevo en FPGA y VHDL. Estoy trabajando en prácticas de laboratorio y para la práctica ya nos dieron un archivo que tiene un códec I2C y ya se hicieron los conceptos básicos para los registros de códecs, pero encontré que los archivos dados eran demasiado complicados y no pude entenderlo; Eran cosas como esclavos y amos. Así que decidí seguir un tutorial en línea.

Estoy usando una placa DE0-Nano. Quiero hacer tres ondas diferentes (sonido), así que seguí un tutorial en línea para hacer una onda sinusoidal, pero cuando lo probé en mi tablero no sucedió nada y no obtuve ningún sonido. ¿Falta algo en mi código o lo asigné a los pines incorrectos? Aquí es la documentación de la pizarra en caso de que la necesite.

También agradecería que me informaras sobre cualquier fuente que me ayude a entender I2C y el esclavo / maestro.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;   
entity sinewave is
port (
      clk :in  std_logic; -- I tried connecting it to PIN_B14 & PIN_R8
      dataout : out integer range -128 to 127 -- connect to PIN_A9
      );
end sinewave;

architecture Audio of sinewave is
  signal i : integer range 0 to 30:=0;
  type memory_type is array (0 to 29) of integer range -128 to 127; 
  signal sine : memory_type := (0,16,31,45,58,67,74,77,77,74,67,58,45,31,16,0,
-16,-31,-45,-58,-67,-74,-77,-77,-74,-67,-58,-45,-31,-16);

begin

process(clk)
begin
  if(rising_edge(clk)) then     
    dataout <= sine(i);
    i <= i+ 1;
    if(i = 29) then
      i <= 0;
    end if;
  end if;
end process;

end Audio;
    
pregunta glassesRCool

1 respuesta

5

Tienes un montón de cosas mezcladas:

  • Primero que nada, el DE0 Nano tiene un ADC, no un DAC. Convierte voltajes analógicos a valores digitales, no al revés.

  • No puede escribir un integer en un solo pin, no tiene ningún sentido. Un pin GPIO puede ser un cero o uno. Para emitir una señal paralela, debe declarar un std_logic_vector y asignar un conjunto de pines.

  • R8 es la entrada de un reloj de 50MHz. Probablemente querrá dividir eso un poco antes de intentar generar una onda sinusoidal de frecuencia de audio.

  • Incluso si el ADC era en realidad un DAC (no lo es), no puede simplemente asignar números a los pines a los que está conectado. Debe leer la hoja de datos para comprender cómo comunicarse con un dispositivo. Para el ADC, aquí la hoja de datos, tenga en cuenta que se comunica a través de un serial flujo de datos (compatible con SPI).

  • I2C y el audio realmente no se mezcla. Podría estar pensando en I2S , que es digital, serial, a menudo multicanal , audio I2C suele ser demasiado lento / no es adecuado para el audio. Si desea obtener más información sobre I2C, la página de Wikipedia es bastante sencilla. Si desea obtener más información sobre I2S, lea sobre I2S y obtenga un DAC I2S.

Entonces, con todo esto en mente: si desea emitir audio, en lugar de intentar usar el DAC inexistente en el DE0 Nano, use PWM para generar un voltaje analógico. Puede usar un PLL para obtener una frecuencia PWM de alta frecuencia, de modo que se pueda filtrar muy fácilmente (RCF simple RC) para obtener una señal de audio pasable.

    
respondido por el uint128_t

Lea otras preguntas en las etiquetas