• 0
Sign in to follow this  
Kampi

Audio with PmodI2S with ZYBO

Question

Hello,

I receive my I2C Audio PMOD (http://store.digilentinc.com/pmodi2s-stereo-audio-output/) today and I want to use it with my ZYBO.
My I2S transmitter look like this:

library ieee;
use ieee.std_logic_1164.all;

entity I2S_Transmitter is
    generic (  
        DATA_WIDTH : integer := 32
    );
    port (
        Clock   :   in  STD_LOGIC;
        MCLK    :   out STD_LOGIC;
        Data_In :   in STD_LOGIC_VECTOR(DATA_WIDTH - 1 downto 0); 
        LRCLK   :   Out  STD_LOGIC;
        DOUT    :   out STD_LOGIC;
        Reset   :   in  STD_LOGIC;
        Empty   :   out STD_LOGIC
    );
end entity;

architecture I2S_Transmitter_Arch of I2S_Transmitter is

    signal InputBuffer  :   std_logic_vector(DATA_WIDTH - 1 downto 0) := (others => '0');
    signal Empty_Signal :   std_logic := '1';
    
    signal DOUT_D1      :   std_logic := '0';
    signal WS           :   std_logic := '0';
    signal Counter      :   integer := 0;

begin
 
LRCLK_Logic:
        process (Clock)
        begin
            if(falling_edge(Clock)) then
                if(Reset = '1') then
                    Counter <= 0;
                    WS <= '1';
                else
                            
                    Counter <= Counter + 1;
                    
                    if(Counter > (DATA_WIDTH / 2 - 1)) then
                        WS <= '1';
                    else
                        WS <= '0';
                    end if;
                    
                    if(Counter = (DATA_WIDTH - 1)) then
                        Counter <= 0;
                    end if;
                end if; 
            end if;
        end process;
    
Load_and_shift_out_Data:
        process(Clock)
        begin
            if(falling_edge(Clock)) then
                if(Reset = '1') then
                    InputBuffer <= (others => '0');
                    Empty_Signal <= '1';
                else
                    if(Empty_Signal = '1') then
                        InputBuffer <= Data_In;
                        Empty_Signal <= '0';
                    else
                        InputBuffer <= InputBuffer((DATA_WIDTH - 2) downto 0) & '0';   
                        DOUT_D1 <= InputBuffer(DATA_WIDTH - 1);
                    end if;        
                    
                    if(Counter = (DATA_WIDTH - 1)) then
                        Empty_Signal <= '1';
                    end if;     
                end if;
            end if;
        end process;

    MCLK <= Clock;
    LRCLK <= WS;
    DOUT <= DOUT_D1;
    Empty <= Empty_Signal;

end architecture I2S_Transmitter_Arch;

With this Testbench:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity I2S_Transmitter_TB is
--  Port ( );
end I2S_Transmitter_TB;

architecture I2S_Transmitter_TB_Arch of I2S_Transmitter_TB is

    signal MCLK     :   std_logic;
    signal WS       :   std_logic := '0';
    signal SCK      :   std_logic := '1';
    signal DOUT     :   std_logic;
    signal Empty    :   std_logic := '0';
    signal Reset    :   std_logic := '0';
    signal Data_In  :   std_logic_vector(31 downto 0) := (others => '0');
    
    -- 8,192 MHz Clock
    constant clk_period:    Time := 122 ns;
    constant ws_period:     Time := 16 * clk_period;

begin

DUT:
    entity work.i2s_transmitter
        port map (
            LRCLK => WS,
            MCLK => MCLK,
            Data_In => Data_In,
            Clock => SCK,
            DOUT => DOUT,
            Empty => Empty,
            Reset => Reset
        );
CLOCK:

    process
    begin
        wait for clk_period / 2;
        SCK <= not SCK;
    end process;

STIMULUS:

    process
    begin
        Data_In <= x"507B507B";
        Reset <= '1';
        wait for 10 us;
        Reset <= '0';
        wait for 10 us;
        Data_In <= (others => '0');
        wait for 30 ms;
        Reset <= '1';
        wait for 5 ms;
        
    end process;

end I2S_Transmitter_TB_Arch;

I use Port JC on my ZYBO and this is my XDC-File:

# Clock
set_property PACKAGE_PIN L16 [get_ports Clock_In]
set_property IOSTANDARD LVCMOS33 [get_ports Clock_In]

set_property PACKAGE_PIN V15 [get_ports MCLK]
set_property IOSTANDARD LVCMOS33 [get_ports MCLK]

set_property PACKAGE_PIN W15 [get_ports LRCLK]
set_property IOSTANDARD LVCMOS33 [get_ports LRCLK]

set_property PACKAGE_PIN T10 [get_ports DOUT]
set_property IOSTANDARD LVCMOS33 [get_ports DOUT]

set_property IOSTANDARD LVCMOS33 [get_ports DEM]
set_property PACKAGE_PIN T11 [get_ports DEM]

The clock frequency for MCLK is 8,192MHz, generated with a MMCM. I´ve connected this speaker (http://store.digilentinc.com/speaker/) to the PMOD, but I doesn´t hear any sound. Why?
Thank you for help!

Share this post


Link to post
Share on other sites

2 answers to this question

Recommended Posts

  • 0

If I get a chance I'll simulate it this weekend.... but chances are that it is the mismatch of the DAC output impedance and the speaker impedance. The speaker is 4 ohm, and the DAC is for driving 10k ohm loads. Have you got some powered speakers you can test with?

For an un-amplifed speaker you might want to use PMOD-AMP3 ( http://store.digilentinc.com/pmodamp3-stereo-power-amplifier ) which is also I2S. As it is a bridged class-D amplifier you can't connect a PMOD-AMP3 to an external power amp but it is ideally suited to to the 4 ohm speaker.

Also, sending the clock directly to a pin isn't best practices (but should work for this application). Have a look for "clock forwarding" in http://www.xilinx.com/support/documentation/user_guides/ug471_7Series_SelectIO.pdf at around page 128.

Edited by hamster

Share this post


Link to post
Share on other sites
  • 0

Hello,

thanks for your reply. I don´t have self powered speakers, so I have to buy some :(.... I think I could use . The PMOD-AMP3 looks like a good alternative, but it has I²C for configuration and I want to test I²S alone and without I²C configuration. Otherwise I could choose the audio codec on my ZYBO (which will be the next step after I²S is running).

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this