i2s.vhd

    1  -- title:              I2S I/F
    2  -- author:             Sebastian Weiss
    3  -- last change:        23.10.13
    4 
    5 
    6 library IEEE;
    7 use IEEE.std_logic_1164.all;
    8 use IEEE.numeric_std.all;
    9 use IEEE.math_real.all;
   10 
   11 entity i2s is
   12         generic
   13         (
   14                 prescaler       : natural := 2
   15         );
   16 
   17         port
   18         (
   19                 mck             : in std_logic;
   20                 dclk            : out std_logic;
   21                 sd              : out std_logic;
   22                 ws              : out std_logic;
   23                 ch0             : in std_logic_vector(15 downto 0);
   24                 ch1             : in std_logic_vector(15 downto 0)
   25         );
   26 end entity;
   27 
   28 architecture behavioral of i2s is
   29 constant log2pre        : integer := integer(ceil(log2(real(prescaler))));
   30 signal pre              : unsigned(log2pre-1 downto 0) := (others => '0');
   31 signal wsd      : std_logic := '0';
   32 signal wsdd     : std_logic := '0';
   33 signal wsp      : std_logic := '0';
   34 signal sr       : std_logic_vector(15 downto 0);
   35 signal cnt      : unsigned(7 downto 0) := (others => '0');
   36 signal wsi      : std_logic := '0';
   37 signal dclki    : std_logic := '0';
   38 signal clk_en   : std_logic := '0';
   39 begin
   40 
   41         process begin
   42                 wait until rising_edge(mck);
   43                 pre <= pre + 1;
   44                 if pre = 0 then
   45                         clk_en <= '1';
   46                 else
   47                         clk_en <= '0';
   48                 end if;
   49         end process;
   50 
   51         process begin
   52                 wait until rising_edge(mck);
   53                 if clk_en = '1' then
   54                         cnt     <= cnt + 1;
   55                 end if;
   56         end process;
   57 
   58                 dclki <= cnt(2);
   59                 wsi <= cnt(7);
   60 
   61         process begin
   62                 wait until rising_edge(dclki);
   63                 wsd     <= wsi;
   64                 wsdd    <= wsd;
   65                 wsp     <= wsd xor wsdd;
   66         end process;
   67 
   68         process begin
   69                 wait until falling_edge(dclki);
   70                         if wsp = '1' then
   71                                 if wsd = '1' then
   72                                         sr <= ch1;
   73                                 else
   74                                         sr <= ch0;
   75                                 end if;
   76                         else
   77                                 sr(0)   <= '0';
   78                                 sr(15 downto 1) <= sr(14 downto 0);
   79                         end if;
   80         end process;
   81 
   82         sd <= sr(15);
   83         ws <= wsd;
   84         dclk <= dclki;
   85 
   86 end behavioral;
   87 

This page was generated using GHDL 0.29 (20100109) [Sokcho edition], a program written by Tristan Gingold