Autor Tema: Controlador bus i2s  (Leído 5048 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado gabirel

  • PIC10
  • *
  • Mensajes: 4
Controlador bus i2s
« en: 18 de Noviembre de 2005, 09:00:00 »
Muuuuuuuuuuyy buenas gente!!! Stoy tratando de hacer andar un core que me he bajado de opencores.org. Es el controlador i2s pero la verdad es que no se por donde agarrarlo, me parece bastante complicado. Alguna idea RollEyes, alguna ayuda Flash...

GRACIASSSSSSSSSSsss Rebotado

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: Controlador bus i2s
« Respuesta #1 en: 22 de Noviembre de 2005, 06:34:00 »
Buenas.

Como se llama el core porque no lo encuentro en la página de opencoresloco

De todas formas tengo un módulo que hize yo hace tiempo. Era muy sencillo. Simplemente leía los datos de un conversor AD en formato IIS y los entregaba a un conversor DA tambien en este formato. Lo busco y te lo paso.

Puedes darme un poco más de información acerca de tu proyecto?

Te puedo ayudar estoy intentando hacerme un decodificador de MP3 y la parte de audio (de la que se encarca un codec IIS)la tengo bastante controlada.

Lo que no doy pie con bola es en el algoritmo de decodificacionLlorandoLlorandoLlorando

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: Controlador bus i2s
« Respuesta #2 en: 29 de Noviembre de 2005, 11:56:00 »
Bueno lo prometido es deuda.

Aqui os pongo el código para manejar un códec en VHDL. En primer lugar deciros que no lo he probao, es decir, lo tenía escrito en VERILOG y lo he pasado a VHDL, osea que puede haber errores de sintáxis algún ";" que se haya olvidao etc. Revisarlo.

El diseño es un módulo para manejar el ADC, otro para el DAC y otro que los une y genera los relojes. Los módulos están diseñados para una frecuencia de reloj de 50MHz.

Módulo ADC:

Codigo:
--------------------------------------------------------------------------------
-- Modulo para leer de un codec en formato I2S.
-- Los datos vienen en serie por el pin "data_in".
-- Los datos de audio se entregan por los buses "data_out_l" y "data_out_r"
-- correspondoientes a las salidas izquierda y derecha de la señal de audio.
-- La señal "count clk" proviene del módulo "top" y sirve para sincronizar
-- los frames de audio.
--------------------------------------------------------------------------------

library IEEE;
use IEEE.std_logic_1164.all;
use ieee.numeric_std.all;

entity adc is
  port (
     clk               :   in   std_logic;
     rst               :   in   std_logic;
     data_out_l   :   out   std_logic_vector(31 downto 0);
     data_out_r   :   out   std_logic_vector(31 downto 0);
    data_in     : in   std_logic;
    count_clk      :   in   std_logic_vector(5 downto 0)
   );
end entity adc;

architecture behavioral of adc is

signal   shift_reg : std_logic_vector(32 downto 0);

begin    -- architecture behavioral

SHIFT_REG_PROC : process(clk, rst) is
   begin
      if (rst="1") then
         shift_reg <= 0;
         data_out_l <= 0;
         data_out_r <= 0;
      elsif (clk"event and clk="1")   then
         if (count_clk="111110"Giño then
            data_outl <= shift_reg(60 downto 37) & X"00";
            data_outl <= shift_reg(28 downto 5) & X"00";
         else
            shift_reg <= shift_reg(62 downto 0) & data_in;
         end if;
      end if;
   end process SHIFT_REG_PROC;
end architecture behavioral;         







Módulo DAC



Codigo:
--------------------------------------------------------------------------------
-- Modulo para escribir en un codec en formato I2S.
-- Los datos vienen en paralelo por los buses "data_in_l" y "data_in_r".
-- Los datos de audio se entregan en serie po la señal "data_out".
-- La señal "count clk" proviene del módulo "top" y sirve para sincronizar
-- los frames de audio.
--------------------------------------------------------------------------------

library IEEE;
use IEEE.std_logic_1164.all;
use ieee.numeric_std.all;

entity dac is
  port (
     clk               :   in   std_logic;
     rst               :   in   std_logic;
     data_in_l      :   in   std_logic_vector(31 downto 0);
     data_in_r      :   in   std_logic_vector(31 downto 0);
    data_out    : out   std_logic;
    count_clk      :   in   std_logic_vector(5 downto 0)
   );
end entity dac;

architecture behavioral of dac is

signal   shift_reg : std_logic_vector(32 downto 0);

begin    -- architecture behavioral

SHIFT_REG_PROC : process(clk, rst) is
   begin
      if (rst="1") then
         shift_reg <= 0;
      elsif (clk"event and clk="1")   then
         if (count_clk="111111"Giño then
            shift_reg <= data_in_l & data_in_r;
         else
            shift_reg <= shift_reg(62 downto 0) & "0";
         end if;
      end if;
   end process SHIFT_REG_PROC;

data_out <= shift_reg(63);
   
end architecture behavioral;         





Y el top




Codigo:
--------------------------------------------------------------------------------
-- Modulo que genera los relojes y se comunica con los módulos del adc y del dac.
-- La frecuencia para el reloj "clk" es de 50MHz obligatoriamente
-- La frecuencia de muestreo del sistema es de 48.8KHz
--------------------------------------------------------------------------------

library IEEE;
use IEEE.std_logic_1164.all;
use ieee.numeric_std.all;

entity top_codec is
  port (
     clk               :   in   std_logic;
     rst               :   in   std_logic;
     data_in         :   in   std_logic_vector(31 downto 0);
     sck               :   out   std_logic;
     bck               :   out   std_logic;
     lrck            :   out   std_logic;
    data_out    : out   std_logic;
    count_clk      :   in   std_logic_vector(5 downto 0)
   );
end entity top_codec;

architecture behavioral of top_codec is

signal   count_clk : std_logic_vector(9 downto 0);
signal   datal_in   :   std_logic_vector(31 downto 0);
signal   datar_in   :   std_logic_vector(31 downto 0);
signal   datal_out   :   std_logic_vector(31 downto 0);
signal   datar_out   :   std_logic_vector(31 downto 0);

-- Conversor analógico a digital

component adc is
    port (
     clk               :   in   std_logic;
     rst               :   in   std_logic;
     data_out_l   :   out   std_logic_vector(31 downto 0);
     data_out_r   :   out   std_logic_vector(31 downto 0);
    data_in     : in   std_logic;
    count_clk      :   in   std_logic_vector(5 downto 0)
   );
end component adc;

-- Conversor  digital a analógico

component dac is
    port (
     clk               :   in   std_logic;
     rst               :   in   std_logic;
     data_in_l      :   in   std_logic_vector(31 downto 0);
     data_in_r      :   in   std_logic_vector(31 downto 0);
    data_out    : out   std_logic;
    count_clk      :   in   std_logic_vector(5 downto 0)
   );
end component dac;


begin    -- architecture behavioral

COUNT_CLK_PROC : process(clk, rst) is
   begin
      if (rst="1") then
         count_clk <= 0;
      else
         count_clk <= count_clk + 1;
      end if;
   end process COUNT_CLK_PROC;
   
LRCK_PROC : process(clk, rst) is
   begin
      if (rst="1") then
         lrck <= 0;
      else
         lrck <= count_clk(9);   -- (fs) 48.8 KHz
      end if;
   end process LRCK_PROC;   

bck <= count_clk(3);      -- 3.125 MHz   (64fs)
sck <= count_clk(1);      -- 12.5 MHz      (256fs)
-- 64fs = 50 MHz/16 -> fs = 48.828KHz
-- La frecuencia de muestreo se fija en 48 KHz para un reloj de entrada de 50MHz

datal_in <= datal_out;
datar_in <= datar_out;


-- ADC

adc_i : adc
   port map (
     clk => bck,                                          --   in   std_logic;
     rst => rst,                                          --   in   std_logic;
     data_out_l => datal_out,                     --   out   std_logic_vector(31 downto 0);
     data_out_r => datar_out,                     --   out   std_logic_vector(31 downto 0);
    data_in => data_in,                              --   in   std_logic;
    count_clk => count_clk(9 downto 4));   --   in   std_logic_vector(5 downto 0)
   
-- DAC

dac_i : dac
   port map (
     clk => bck,                                          --   in   std_logic;
     rst => rst,                                          --   in   std_logic;
     data_in_l => datal_in,                        --   in   std_logic_vector(31 downto 0);
     data_in_r => datar_in,                        --   in   std_logic_vector(31 downto 0);
    data_out => data_out,                           --   out   std_logic;
    count_clk => count_clk(9 downto 4));   --   in   std_logic_vector(5 downto 0)    

   
end architecture behavioral;         

Desconectado gabirel

  • PIC10
  • *
  • Mensajes: 4
RE: Controlador bus i2s
« Respuesta #3 en: 20 de Diciembre de 2005, 02:54:00 »
Hola de nuevo, siento la tardanza pero ya estoy aqui de nuevo. En primer lugar, el core se llama i2s interface y para llegar a él tienes que entrar en la seccion CVS. Mi sistema funciona con un clock de 50Mhz y lo que necesito es comunicarme con un codec (DAC y ADC). Mi fpga tiene que ser transmisora y receptora de informacion en modo maestro, tiene que generar el clock y la señal WS. Trabajo con el ISE Webpack 7.1 y Modelsim. Si puedes probar el core te lo agradecería pq sigo atascado.

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: Controlador bus i2s
« Respuesta #4 en: 20 de Diciembre de 2005, 17:47:00 »
Ok ya lo vi.

En primer lugar te pregunto si vas a utilizar en tu sistema el bus Wishbone, o algún otro bus que sea compatible con el.

Te lo pregunto porque este controlador I2S es ideal para incluirlo en un bus de algún microprocesador. Por lo que he podido ver, hasta te genera un buffer donde guardar las muestras.

Lo que quiero decir que es demasiado complicado. Hay que aprenderse el estándard Wishbone y conectar un micro para ver que realmente funcione.

Que es lo que quieres hacer con los codecs y la FPGA?

Desconectado gabirel

  • PIC10
  • *
  • Mensajes: 4
RE: Controlador bus i2s
« Respuesta #5 en: 21 de Diciembre de 2005, 09:35:00 »
Pues como bien dices, la interfaz Wishbone no me interesa. Aunque lo que necesito es mandar datos desde una RAM (256 posiciones x 16 bits). Mi codec es un texas ins. AIC23B en una TLV320AIC23B Eval. board. Por lo que he visto en i2s_codec, basta con usar la señal conf_en como reset y poniendola a 1 comienza a andar, ahora tengo que unir eso a la memoria y no se yo. Sobre todo no sé como lo voy a hacer a la hora de recibir. Tb comentar que esa RAM es distribuida, y realmente me interesa eso? En mi Spartan 3 puedo colocarla de otra manera?

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: Controlador bus i2s
« Respuesta #6 en: 21 de Diciembre de 2005, 12:31:00 »
Para probar el codec puedes utilizar perfectamente los archivos que te he puesto arriba y que ya estan corregidos. Tenian algunos fallos pero ya los he probado y funcionan a la perfeccción.

Con esos archivos puedes leer y escribir del códec simulatáneamente. De hecho, lo que hacen es leer datos del ADC y enviarlos al DAC en modo I2S, 24bits de resolución y 48.82KHz de frecuencia de muestreo. Una vez que compruebes el codec, pasa a lo de la RAM.

La RAM en la spartan3 la puedes hacer distribuida o con los block RAM. Yo te recomiendo que utilices los segundos, porque la memoria distribuida se hace a partir de registros y te vas a quedar sin ellos en cuanto superes los 2KBytes. El número de block RAM dependen de la spartan que tengas, pero como mínimo tienes para 9KBytes de memoria en una XC3S50. EN la mía que es una XC3S200 hay para 27KBytes de memoria. La ventaja de esta memoria es que es de DOBLE PUERTO, es decir, que la puedes leer y escribir simultáneamente en dos direcciones distintas.

La mejor forma de crear estas memorias es con el Core Generator que viene en el ISE. De todas formas aqui te paso un link que te explica como hacer memoria de doble puerto en la spartan 3:

http://www.xilinx.com/xlnx/xweb/xil_publications_display.jsp?sGlobalNavPick=&sSecondaryNavPick=&category=-1209884&iLanguageID=1

Es la XAPP463. Viene con un archivo zip con los ejemplos.


Desconectado gabirel

  • PIC10
  • *
  • Mensajes: 4
RE: Controlador bus i2s
« Respuesta #7 en: 02 de Enero de 2006, 04:15:00 »
El codec q estoy usando es el texas aic23b, no sabrías decirme como puedo conocer que formato de datos interpreta, verdad? Complemento a 2, binario normal...

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: Controlador bus i2s
« Respuesta #8 en: 02 de Enero de 2006, 07:12:00 »
Segun la data:



El codec por defecto está en modo Esclavo, 16Bits, y LEFT aligned.

Desconectado gabirel1

  • PIC10
  • *
  • Mensajes: 2
Detectar DTMF
« Respuesta #9 en: 24 de Abril de 2006, 04:57:27 »
Ahora estoy tratando de recibir señales DTMF por línea telefónica y no sé cuál puede ser la mejor táctica. La FFT me ocuparía casi toda la Spartan3, y me han comentado que con filtros Notch... pero cómo????? Tb he visto que con filtros IIR... Qué resulta lo más rentable computacionalmente hablando? Y por supuesto, dónde puedo encontrar información o ejemplos de cómo hacerlo, pq llevo buceando un buen tiempo y he naufragado súbitamente  :D .