📄 i2c_av_config.vhd
字号:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
ENTITY I2C_AV_Config IS
port
(
o_I2C_END : out STD_LOGIC;
iCLK : in STD_LOGIC;
iRST_N : in STD_LOGIC;
I2C_SCLK : out STD_LOGIC;
I2C_SDAT : inout STD_LOGIC
);
END I2C_AV_Config ;
ARCHITECTURE I2C_AV OF I2C_AV_Config IS
COMPONENT I2C_Controller
port(
CLOCK : in STD_LOGIC;
I2C_SCLK : out STD_LOGIC; --I2C CLOCK
I2C_SDAT : inout STD_LOGIC; --I2C DATA
I2C_DATA : in STD_LOGIC_VECTOR(23 downto 0); --DATA:[SLAVE_ADDR,SUB_ADDR,DATA]
GO : in STD_LOGIC; --GO transfor
ENDE : out STD_LOGIC; --END transfor
ACK : out STD_LOGIC; --ACK
RESET : in STD_LOGIC
);
END COMPONENT;
---
CONSTANT CLK_Freq : INTEGER := 18432000; -- 18.432 MHz
CONSTANT I2C_Freq : INTEGER := 48000; -- 48 KHz
---
CONSTANT LUT_SIZE : INTEGER := 12; -- LUT Data Number
CONSTANT Dummy_DATA : UNSIGNED := "0000";
CONSTANT SET_LIN_L : UNSIGNED := "0001";
CONSTANT SET_LIN_R : UNSIGNED := "0010";
CONSTANT SET_HEAD_L : UNSIGNED := "0011";
CONSTANT SET_HEAD_R : UNSIGNED := "0100";
CONSTANT A_PATH_CTRL: UNSIGNED := "0101";
CONSTANT D_PATH_CTRL: UNSIGNED := "0110";
CONSTANT POWER_ON : UNSIGNED := "0111";
CONSTANT SET_FORMAT : UNSIGNED := "1000";
CONSTANT SAMPLE_CTRL: UNSIGNED := "1001";
CONSTANT SET_ACTIVE : UNSIGNED := "1010";
---
SIGNAL mI2C_CTRL_CLK: STD_LOGIC;
SIGNAL mI2C_CLK_DIV : UNSIGNED(8 downto 0);--(15 downto 0);
SIGNAL mI2C_DATA : STD_LOGIC_VECTOR(23 downto 0);
SIGNAL mI2C_GO : STD_LOGIC;
SIGNAL mI2C_END : STD_LOGIC;
SIGNAL mI2C_ACK : STD_LOGIC;
SIGNAL LUT_INDEX : UNSIGNED(3 downto 0);
SIGNAL mSetup_ST : UNSIGNED(1 downto 0);
SIGNAL LUT_DATA : STD_LOGIC_VECTOR(15 downto 0);
BEGIN
u0: I2C_Controller port map(CLOCK => mI2C_CTRL_CLK , -- Controller Work Clock
I2C_SCLK => I2C_SCLK , -- I2C CLOCK
I2C_SDAT => I2C_SDAT , -- I2C DATA
I2C_DATA => mI2C_DATA , -- DATA:[SLAVE_ADDR,SUB_ADDR,DATA]
GO => mI2C_GO , -- GO transfor
ENDE => mI2C_END , -- END transfor
ACK => mI2C_ACK , -- ACK
RESET => iRST_N
);
process(iCLK,iRST_N)
begin
if(iRST_N = '0')then
mI2C_CTRL_CLK <= '0';
mI2C_CLK_DIV <= (others =>'0');
elsif(rising_edge(iCLK))then
if(mI2C_CLK_DIV < (CLK_Freq/I2C_Freq))then
mI2C_CLK_DIV <= mI2C_CLK_DIV + 1;
else
mI2C_CLK_DIV <= (others =>'0');
mI2C_CTRL_CLK <= not mI2C_CTRL_CLK;
end if;
end if;
end process;
process(mI2C_CTRL_CLK,iRST_N)
begin
if(iRST_N = '0')then
LUT_INDEX <= (others =>'0');
mSetup_ST <= (others =>'0');
mI2C_GO <= '0';
elsif(rising_edge(mI2C_CTRL_CLK))then
if(LUT_INDEX<LUT_SIZE)then
o_I2C_END <= '0';
case(mSetup_ST)is
when "00" => mI2C_DATA <= X"34" & LUT_DATA;
mI2C_GO <= '1';
mSetup_ST <= "01";
when "01" => if(mI2C_END = '1')then
if(mI2C_ACK = '0')then
mSetup_ST <= "10";
else
mSetup_ST <= (others =>'0');
end if;
mI2C_GO <= '0';
end if;
when "10" => LUT_INDEX <= LUT_INDEX + 1;
mSetup_ST <= (others =>'0');
when others => NULL;
end case;
else
o_I2C_END <= '1';
end if;
end if;
end process;
------------------- Config Data LUT -------------------
process(LUT_INDEX)
begin
case(LUT_INDEX)is
when Dummy_DATA => LUT_DATA <= X"0000";
when SET_LIN_L => LUT_DATA <= X"001A";
when SET_LIN_R => LUT_DATA <= X"021A";
when SET_HEAD_L => LUT_DATA <= X"047B";
when SET_HEAD_R => LUT_DATA <= X"067B";
when A_PATH_CTRL => LUT_DATA <= X"08F8";
when D_PATH_CTRL => LUT_DATA <= X"0A06";
when POWER_ON => LUT_DATA <= X"0C00";
when SET_FORMAT => LUT_DATA <= X"0E01";
when SAMPLE_CTRL => LUT_DATA <= X"1002";
when SET_ACTIVE => LUT_DATA <= X"1201";
when others => LUT_DATA <= X"0000";
end case;
end process;
END I2C_AV;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -