library IEEE; use IEEE.std_logic_1164.all; LIBRARY lpm; USE lpm.lpm_components.all; ENTITY WM8731_Config IS GENERIC ( acc_width : integer := 16; accAddWidth : integer := 13; toneDurationWidth : integer := 16 ); PORT ( mclk : IN STD_LOGIC; -- PIN_B12 - USB 24MHz clock switch : IN STD_LOGIC_VECTOR( 9 downto 0 ); push : IN STD_LOGIC_VECTOR( 3 downto 0 ); bit0seg : OUT STD_LOGIC_VECTOR( 6 downto 0 ); bit1seg : OUT STD_LOGIC_VECTOR( 6 downto 0 ); bit2seg : OUT STD_LOGIC_VECTOR( 6 downto 0 ); bit3seg : OUT STD_LOGIC_VECTOR( 6 downto 0 ); reset : OUT STD_LOGIC; sclk : OUT STD_LOGIC; -- PIN_A3 - I2C_SCLK sdat : OUT STD_LOGIC; -- PIN_B3 - I2C_SCLK xck : OUT STD_LOGIC; -- PIN_B4 - AUD_XCK bclk : OUT STD_LOGIC; -- PIN_A4 - AUD_BCLK daclrck : OUT STD_LOGIC; -- PIN_A5 - AUD_DACLRCK dacdat : OUT STD_LOGIC -- PIN_B5 - AUD_DACDAT ); END ENTITY WM8731_Config; ARCHITECTURE WM8731_Config_imp of WM8731_Config IS SIGNAL nodeReset : STD_LOGIC; SIGNAL nodeUsbDiv02 : STD_LOGIC; -- Sets the Master clock at 12MHz SIGNAL nodeUsbDiv04 : STD_LOGIC; -- Sets the Master clock at 12MHz SIGNAL nodeUsbDiv08 : STD_LOGIC; -- Sets the Master clock at 12MHz SIGNAL nodeUsbDiv16 : STD_LOGIC; -- Sets the I2C clock at 1500000Hz SIGNAL nodeUsbDiv32 : STD_LOGIC; -- Sets the I2C clock at 750000Hz SIGNAL nodeUsbDiv64 : STD_LOGIC; -- Sets the I2C clock at 375000Hz SIGNAL nodeI2cData : STD_LOGIC; SIGNAL nodeDacData : STD_LOGIC; SIGNAL nodeMask : STD_LOGIC; SIGNAL nodeSclk : STD_LOGIC; -- SIGNAL amplTc : STD_LOGIC; SIGNAL usb250Tc : STD_LOGIC; -- SIGNAL msbDly : STD_LOGIC; SIGNAL romOut : STD_LOGIC_VECTOR( acc_width - 1 downto 0 ); BEGIN reset_cnt : lpm_counter generic map ( LPM_WIDTH => 8, LPM_DIRECTION => "UP" ) port map ( CLOCK => mclk, CLK_EN => not nodeReset, Q( 7 ) => nodeReset ); usb_div : lpm_counter generic map ( LPM_WIDTH => 6, LPM_DIRECTION => "UP", LPM_SVALUE => "32" ) port map ( CLOCK => mclk, Q( 0 ) => nodeUsbDiv02, Q( 1 ) => nodeUsbDiv04, Q( 2 ) => nodeUsbDiv08, Q( 3 ) => nodeUsbDiv16, Q( 4 ) => nodeUsbDiv32, Q( 5 ) => nodeUsbDiv64 ); usb250 : lpm_counter generic map ( LPM_WIDTH => 9, LPM_DIRECTION => "UP", LPM_SVALUE => "131" ) port map ( CLOCK => not nodeUsbDiv04, SSET => usb250Tc, Q( 8 ) => usb250Tc ); i2c_sdata : lpm_shiftreg generic map ( LPM_WIDTH => 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128, LPM_DIRECTION => "LEFT" ) port map ( DATA( 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 127 downto 0 ) => "111111110000" & "0000000011111111000011110000" & "00000000" & "00000000000000001111111100000000" & "0000" & "00000000000011110000111111111111" & "000011111111" & -- Reg $06 Power Down CTRL "111111110000" & "0000000011111111000011110000" & "00000000" & "00000000000000000000111100000000" & "0000" & "00001111111111111111000011110000" & "000011111111" & -- Reg $02 Left DAC Out "111111110000" & "0000000011111111000011110000" & "00000000" & "00000000000000000000111111110000" & "0000" & "00001111111111111111000011110000" & "000011111111" & -- Reg $03 Right DAC Out "111111110000" & "0000000011111111000011110000" & "00000000" & "00000000000000001111000000000000" & "0000" & "11111111000011110000111111111111" & "000011111111" & -- Reg $04 A Path CTRL "111111110000" & "0000000011111111000011110000" & "00000000" & "00000000000000001111000011110000" & "0000" & "00000000000000000000111111110000" & "000011111111" & -- Reg $05 D Path CTRL "111111110000" & "0000000011111111000011110000" & "00000000" & "00000000000000001111111111110000" & "0000" & "00000000000011110000000011111111" & "000011111111" & -- Reg $07 D I/F CTRL "111111110000" & "0000000011111111000011110000" & "00000000" & "00000000000011110000000000000000" & "0000" & "00000000000000000000000000001111" & "000011111111" & -- Reg $08 Sampling CTRL "111111110000" & "0000000011111111000011110000" & "00000000" & "00000000000011110000000011110000" & "0000" & "00000000000000000000000000001111" & "000011111111" & -- Reg $09 Active CTRL "111111110000" & "0000000011111111000011110000" & "00000000" & "00000000000000001111111100000000" & "0000" & "00000000000000000000111111111111" & "000011111111", -- Reg $06 Power Down CTRL CLOCK => nodeUsbDiv64, -- Sets the I2C clock at 375000Hz LOAD => not nodeReset, ENABLE => '1', SHIFTIN => '1', SHIFTOUT => sdat ); i2c_sclk : lpm_shiftreg generic map ( LPM_WIDTH => 128, LPM_DIRECTION => "LEFT" ) port map ( DATA( 127 downto 0 ) => "11111111111001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011111111111", CLOCK => nodeUsbDiv64, -- Sets the I2C clock at 375000Hz LOAD => not nodeReset, ENABLE => not nodeMask, SHIFTIN => nodeSclk, SHIFTOUT => nodeSclk ); dat_shift : lpm_shiftreg generic map ( LPM_WIDTH => 2*acc_width, LPM_DIRECTION => "LEFT" ) port map ( DATA( 2*acc_width - 1 downto acc_width ) => romOut( acc_width - 1 downto 0 ), DATA( acc_width - 1 downto 0 ) => romOut( acc_width - 1 downto 0 ), CLOCK => not nodeUsbDiv04, LOAD => usb250Tc, ENABLE => nodeMask, SHIFTOUT => nodeDacData, SHIFTIN => '0' ); mask_cnt : lpm_counter generic map ( LPM_WIDTH => 18, LPM_DIRECTION => "UP", LPM_SVALUE => "00" ) port map ( CLOCK => mclk, SSET => not nodeReset, CLK_EN => not nodeMask, Q( 17 ) => nodeMask ); xck <= nodeUsbDiv02; bclk <= nodeUsbDiv04; sclk <= nodeSclk; dacdat <= nodeDacData; daclrck <= usb250Tc and nodeMask; reset <= nodeMask; END WM8731_Config_imp;