⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c_av_config.vhd

📁 Pacman 4 DE1-FPGA-Board
💻 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 + -