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

📄 init9011.vhd

📁 自己写的iic配置芯片的源程序
💻 VHD
📖 第 1 页 / 共 3 页
字号:
----------------------------------------------------------------------------------实现了向slave iic machine随机写多个字节,写顺序为--1.从机地址--2.偏移地址 1个字节。如果读取两个字节的eeprom,需要两个字节--3.送出写的数据--4.等待10ms, 继续循环。--note:进程里面最好用variable,进程外最好用signallibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity Init9011 is	port (		clk : in std_logic;		ena : in std_logic;		nReset : in std_logic;		clk_cnt : in unsigned(7 downto 0);	-- 4x SCL 		-- input signals		CFGDONE :out std_logic;		Dout : out std_logic_vector(7 downto 0);		ack1,ack2: out std_logic;		-- i2c signals		SCL : inout std_logic;		SDA : inout std_logic;		--test		test1:out std_logic;		test3:out std_logic_vector(4 downto 0)	);end entity Init9011;architecture structural of Init9011 is    type cmds is (idle, start_a, start_b, start_c, start_d, stop_a, stop_b, stop_c, ack1_a, ack1_b, ack1_c, ack1_d,    ack2_a, ack2_b, ack2_c, ack2_d, ack3_a, ack3_b, ack3_c, ack3_d, ack4_a, ack4_b, ack4_c, ack4_d,       rd1_a, rd1_b, rd1_c, rd1_d, rd2_a, rd2_b, rd2_c, rd2_d, rd3_a, rd3_b, rd3_c, rd3_d, rd4_a, rd4_b, rd4_c, rd4_d,     rd5_a, rd5_b, rd5_c, rd5_d, rd6_a, rd6_b, rd6_c, rd6_d, rd7_a, rd7_b, rd7_c, rd7_d, rd8_a, rd8_b, rd8_c, rd8_d,     wr1_a, wr1_b, wr1_c, wr1_d, wr2_a, wr2_b, wr2_c, wr2_d, wr3_a, wr3_b, wr3_c, wr3_d, wr4_a, wr4_b, wr4_c, wr4_d,    wr5_a, wr5_b, wr5_c, wr5_d, wr6_a, wr6_b, wr6_c, wr6_d, wr7_a, wr7_b, wr7_c, wr7_d, wr8_a, wr8_b, wr8_c, wr8_d,  --从机地址    wr9_a, wr9_b, wr9_c, wr9_d, wr10_a, wr10_b, wr10_c, wr10_d, wr11_a, wr11_b, wr11_c, wr11_d, wr12_a, wr12_b, wr12_c, wr12_d,    wr13_a, wr13_b, wr13_c, wr13_d, wr14_a, wr14_b, wr14_c, wr14_d, wr15_a, wr15_b, wr15_c, wr15_d, wr16_a, wr16_b, wr16_c, wr16_d, --高字节地址    wr17_a, wr17_b, wr17_c, wr17_d, wr18_a, wr18_b, wr18_c, wr18_d, wr19_a, wr19_b, wr19_c, wr19_d, wr20_a, wr20_b, wr20_c, wr20_d,    wr21_a, wr21_b, wr21_c, wr21_d, wr22_a, wr22_b, wr22_c, wr22_d, wr23_a, wr23_b, wr23_c, wr23_d, wr24_a, wr24_b, wr24_c, wr24_d, --写的数据    wr25_a, wr25_b, wr25_c, wr25_d, wr26_a, wr26_b, wr26_c, wr26_d, wr27_a, wr27_b, wr27_c, wr27_d, wr28_a, wr28_b, wr28_c, wr28_d,    wr29_a, wr29_b, wr29_c, wr29_d, wr30_a, wr30_b, wr30_c, wr30_d, wr31_a, wr31_b, wr31_c, wr31_d, wr32_a, wr32_b, wr32_c, wr32_d, --低字节地址    TriState);	signal state       : cmds;	signal SDAo, SCLo  : std_logic;	signal txd         : std_logic;	signal slave_wait  : std_logic;	--	signal WrDone : std_logic ;                  --写完一个字节标志位	signal cycle  : integer range 0 to 20000;    --等待周期数	signal i      : integer range 0 to 40;        --标记当前正在写第几个字节	-- 访问eeprom.address = oxA8.	signal addwr      : std_logic_vector(7 downto 0); 	signal subadd     : std_logic_vector(7 downto 0); 	signal subadd2    : std_logic_vector(7 downto 0);	signal data       : std_logic_vector(7 downto 0);	-- 定义数组  每个数组17个字节	type MatrixAdd     is array(0 to 38) of std_logic_vector(7 downto 0);	type MatrixSubAdd  is array(0 to 38) of std_logic_vector(7 downto 0);	type MatrixSubAdd2 is array(0 to 38) of std_logic_vector(7 downto 0);	type Matrixdata    is array(0 to 38) of std_logic_vector(7 downto 0);	--定义数组常量	--9011 address 0x60/68; 9034 address 0x72/7A; eprom address 0xA8	constant AddSlave : MatrixAdd    :=( X"60",X"60",X"68",X"68",X"68",X"68",X"68",X"60",X"68",X"68",X"68",X"60",X"68",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60"   ,X"7A",X"72",X"7A",X"72",X"72",X"72",X"72",X"72",X"72",X"72",X"72",X"72",X"72",X"72",X"72",X"72",X"72" );	constant SubAddr  : MatrixSubAdd :=( X"09",X"05",X"18",X"13",X"14",X"15",X"16",X"08",X"26",X"35",X"38",X"79",X"37",X"88",X"89",X"81",X"B6",X"B7",X"B8",X"B5",X"5F",X"4A"   ,X"3D",X"82",X"2F",X"08",X"79",X"05",X"05",X"48",X"32",X"36",X"37",X"34",X"38",X"39",X"33",X"71",X"75" );	constant SubAddr2 : MatrixSubAdd2:=( X"68",X"68",X"30",X"31",X"32",X"30",X"31",X"32",X"33",X"34",X"37",X"34",X"37",X"34",X"37",X"34",X"37",X"34",X"37",X"60",X"60",X"09"   ,X"7A",X"3D",X"3D",X"3D",X"3D",X"3D",X"3D",X"3D",X"3D",X"3D",X"72",X"72",X"72",X"72",X"72",X"72",X"72" );	constant CfgData  : Matrixdata   :=( X"91",X"10",X"54",X"0F",X"20",X"00",X"00",X"07",X"40",X"06",X"0C",X"06",X"03",X"88",X"16",X"C3",X"C1",X"86",X"01",X"02",X"C8",X"0D"   ,X"07",X"25",X"00",X"37",X"01",X"03",X"00",X"00",X"7A",X"D0",X"02",X"24",X"E0",X"01",X"30",X"40",X"40" );	--                                     0                             5                            10                            15                            20                                25等待输入像素时钟稳定       30                            35                 38  begin	-- hookup i2c core--	u1: i2c_core port map (clk, nReset, clk_cnt, core_cmd, core_ack, core_busy, core_txd, core_rxd, SCL, SDA);--for debugger    test1 <= WrDone;    test3 <= conv_std_logic_vector(i,5);	-- 	process(i)	begin	    case (i) is		  when 1 =>	         addwr   <= AddSlave(0)(7 downto 0);             SubAdd  <= SubAddr(0)(7 downto 0);	         SubAdd2 <= SubAddr2(0)(7 downto 0);	         Data    <= CfgData(0)(7 downto 0);		  when 2 =>	         addwr   <= AddSlave(1)(7 downto 0);             SubAdd  <= SubAddr(1)(7 downto 0);	         SubAdd2 <= SubAddr2(1)(7 downto 0);	         Data    <= CfgData(1)(7 downto 0);		  when 3 =>	         addwr   <= AddSlave(2)(7 downto 0);             SubAdd  <= SubAddr(2)(7 downto 0);	         SubAdd2 <= SubAddr2(2)(7 downto 0);	         Data    <= CfgData(2)(7 downto 0);		  when 4 =>	         addwr   <= AddSlave(3)(7 downto 0);             SubAdd  <= SubAddr(3)( 7 downto 0);	         SubAdd2 <= SubAddr2(3)( 7 downto 0);	         Data    <= CfgData(3)(7 downto 0);	      when 5 =>	         addwr   <= AddSlave(4)(7 downto 0);             SubAdd  <= SubAddr(4)(7 downto 0);	         SubAdd2 <= SubAddr2(4)(7 downto 0);	         Data    <= CfgData(4)(7 downto 0);		  when 6 =>	         addwr   <= AddSlave(5)(7 downto 0);             SubAdd  <= SubAddr(5)(7 downto 0);	         SubAdd2 <= SubAddr2(5)(7 downto 0);	         Data    <= CfgData(5)(7 downto 0);		  when 7 =>	         addwr   <= AddSlave(6)(7 downto 0);             SubAdd  <= SubAddr(6)(7 downto 0);	         SubAdd2 <= SubAddr2(6)(7 downto 0);	         Data    <= CfgData(6)(7 downto 0);		  when 8 =>	         addwr   <= AddSlave(7)(7 downto 0);             SubAdd  <= SubAddr(7)(7 downto 0);	         SubAdd2 <= SubAddr2(7)(7 downto 0);	         Data    <= CfgData(7)(7 downto 0);		  when 9 =>	         addwr   <= AddSlave(8)(7 downto 0);             SubAdd  <= SubAddr(8)(7 downto 0);	         SubAdd2 <= SubAddr2(8)(7 downto 0);	         Data    <= CfgData(8)(7 downto 0);		  when 10 =>	         addwr   <= AddSlave(9)(7 downto 0);             SubAdd  <= SubAddr(9)(7 downto 0);	         SubAdd2 <= SubAddr2(9)(7 downto 0);	         Data    <= CfgData(9)(7 downto 0);		  when 11 =>	         addwr   <= AddSlave(10)(7 downto 0);             SubAdd  <= SubAddr(10)(7 downto 0);	         SubAdd2 <= SubAddr2(10)(7 downto 0);	         Data    <= CfgData(10)(7 downto 0);	      when 12 =>	         addwr   <= AddSlave(11)(7 downto 0);             SubAdd  <= SubAddr(11)(7 downto 0);	         SubAdd2 <= SubAddr2(11)(7 downto 0);	         Data    <= CfgData(11)(7 downto 0);		  when 13 =>	         addwr   <= AddSlave(12)(7 downto 0);             SubAdd  <= SubAddr(12)( 7 downto 0);	         SubAdd2 <= SubAddr2(12)( 7 downto 0);	         Data    <= CfgData(12)(7 downto 0);	      when 14 =>	         addwr   <= AddSlave(13)(7 downto 0);             SubAdd  <= SubAddr(13)(7 downto 0);	         SubAdd2 <= SubAddr2(13)(7 downto 0);	         Data    <= CfgData(13)(7 downto 0);		  when 15 =>	         addwr   <= AddSlave(14)(7 downto 0);             SubAdd  <= SubAddr(14)(7 downto 0);	         SubAdd2 <= SubAddr2(14)(7 downto 0);	         Data    <= CfgData(14)(7 downto 0);		  when 16 =>	         addwr   <= AddSlave(15)(7 downto 0);             SubAdd  <= SubAddr(15)(7 downto 0);	         SubAdd2 <= SubAddr2(15)(7 downto 0);	         Data    <= CfgData(15)(7 downto 0);		  when 17 =>	         addwr   <= AddSlave(16)(7 downto 0);             SubAdd  <= SubAddr(16)(7 downto 0);	         SubAdd2 <= SubAddr2(16)(7 downto 0);	         Data    <= CfgData(16)(7 downto 0);		  when 18 =>	         addwr   <= AddSlave(17)(7 downto 0);             SubAdd  <= SubAddr(17)(7 downto 0);	         SubAdd2 <= SubAddr2(17)(7 downto 0);	         Data    <= CfgData(17)(7 downto 0);		  when 19 =>	         addwr   <= AddSlave(18)(7 downto 0);             SubAdd  <= SubAddr(18)(7 downto 0);	         SubAdd2 <= SubAddr2(18)(7 downto 0);	         Data    <= CfgData(18)(7 downto 0);		  when 20 =>	         addwr   <= AddSlave(19)(7 downto 0);             SubAdd  <= SubAddr(19)( 7 downto 0);	         SubAdd2 <= SubAddr2(19)( 7 downto 0);	         Data    <= CfgData(19)(7 downto 0);		  when 21 =>	         addwr   <= AddSlave(20)(7 downto 0);             SubAdd  <= SubAddr(20)( 7 downto 0);	         SubAdd2 <= SubAddr2(20)( 7 downto 0);	         Data    <= CfgData(20)(7 downto 0);		  when 22 =>	         addwr   <= AddSlave(21)(7 downto 0);             SubAdd  <= SubAddr(21)( 7 downto 0);	         SubAdd2 <= SubAddr2(21)( 7 downto 0);	         Data    <= CfgData(21)(7 downto 0);		  when 23 =>	         addwr   <= AddSlave(22)(7 downto 0);             SubAdd  <= SubAddr(22)( 7 downto 0);	         SubAdd2 <= SubAddr2(22)( 7 downto 0);	         Data    <= CfgData(22)(7 downto 0);		  when 24 =>	         addwr   <= AddSlave(23)(7 downto 0);             SubAdd  <= SubAddr(23)( 7 downto 0);	         SubAdd2 <= SubAddr2(23)( 7 downto 0);	         Data    <= CfgData(23)(7 downto 0);		  when 25 =>	         addwr   <= AddSlave(24)(7 downto 0);             SubAdd  <= SubAddr(24)( 7 downto 0);	         SubAdd2 <= SubAddr2(24)( 7 downto 0);	         Data    <= CfgData(24)(7 downto 0);		  when 26 =>	         addwr   <= AddSlave(25)(7 downto 0);             SubAdd  <= SubAddr(25)(7 downto 0);	         SubAdd2 <= SubAddr2(25)(7 downto 0);	         Data    <= CfgData(25)(7 downto 0);		  when 27 =>	         addwr   <= AddSlave(26)(7 downto 0);             SubAdd  <= SubAddr(26)(7 downto 0);	         SubAdd2 <= SubAddr2(26)(7 downto 0);	         Data    <= CfgData(26)(7 downto 0);		  when 28 =>	         addwr   <= AddSlave(27)(7 downto 0);             SubAdd  <= SubAddr(27)(7 downto 0);	         SubAdd2 <= SubAddr2(27)(7 downto 0);	         Data    <= CfgData(27)(7 downto 0);		  when 29 =>	         addwr   <= AddSlave(28)(7 downto 0);             SubAdd  <= SubAddr(28)( 7 downto 0);	         SubAdd2 <= SubAddr2(28)( 7 downto 0);	         Data    <= CfgData(28)(7 downto 0);		  when 30 =>	         addwr   <= AddSlave(29)(7 downto 0);             SubAdd  <= SubAddr(29)( 7 downto 0);	         SubAdd2 <= SubAddr2(29)( 7 downto 0);	         Data    <= CfgData(29)(7 downto 0);		  when 31 =>	         addwr   <= AddSlave(30)(7 downto 0);             SubAdd  <= SubAddr(30)( 7 downto 0);	         SubAdd2 <= SubAddr2(30)( 7 downto 0);	         Data    <= CfgData(30)(7 downto 0);		  when 32 =>	         addwr   <= AddSlave(31)(7 downto 0);             SubAdd  <= SubAddr(31)( 7 downto 0);	         SubAdd2 <= SubAddr2(31)( 7 downto 0);	         Data    <= CfgData(31)(7 downto 0);		  when 33 =>	         addwr   <= AddSlave(32)(7 downto 0);             SubAdd  <= SubAddr(32)( 7 downto 0);	         SubAdd2 <= SubAddr2(32)( 7 downto 0);	         Data    <= CfgData(32)(7 downto 0);		  when 34 =>	         addwr   <= AddSlave(33)(7 downto 0);             SubAdd  <= SubAddr(33)( 7 downto 0);	         SubAdd2 <= SubAddr2(33)( 7 downto 0);	         Data    <= CfgData(33)(7 downto 0);		  when 35 =>	         addwr   <= AddSlave(34)(7 downto 0);             SubAdd  <= SubAddr(34)( 7 downto 0);	         SubAdd2 <= SubAddr2(34)( 7 downto 0);	         Data    <= CfgData(34)(7 downto 0);		  when 36 =>	         addwr   <= AddSlave(35)(7 downto 0);             SubAdd  <= SubAddr(35)( 7 downto 0);	         SubAdd2 <= SubAddr2(35)( 7 downto 0);	         Data    <= CfgData(35)(7 downto 0);		  when 37 =>	         addwr   <= AddSlave(36)(7 downto 0);             SubAdd  <= SubAddr(36)( 7 downto 0);	         SubAdd2 <= SubAddr2(36)( 7 downto 0);	         Data    <= CfgData(36)(7 downto 0);		  when 38 =>	         addwr   <= AddSlave(37)(7 downto 0);             SubAdd  <= SubAddr(37)( 7 downto 0);	         SubAdd2 <= SubAddr2(37)( 7 downto 0);	         Data    <= CfgData(37)(7 downto 0);		  when 39 =>	         addwr   <= AddSlave(38)(7 downto 0);             SubAdd  <= SubAddr(38)( 7 downto 0);	         SubAdd2 <= SubAddr2(38)( 7 downto 0);	         Data    <= CfgData(38)(7 downto 0);	     when others => null;	   end case;	end process;	--	-- state machine	--   -- generate statemachine	nxt_state_decoder : process (clk, nReset, state,  SDA)		variable nxt_state : cmds;		variable icmd_ack, ibusy, store_sda : std_logic;		variable itxd : std_logic;		--		variable done    : std_logic := '0';            --写完一个字节标志位	    variable vcycle  : integer range 0 to 20000;    --等待周期数	    variable vi      : integer range 0 to 30:=0;    --标记当前正在写第几个字节	begin		case (state) is			-- idle			-- start			when idle =>				nxt_state := start_a;			    done := '0';			when start_a =>				nxt_state := start_b;			when start_b =>				nxt_state := start_c;			when start_c =>				nxt_state := start_d;			when start_d =>				nxt_state := wr1_a;				ibusy := '0'; -- not busy when idle	-------------------------------------------------写从机地址----------------					    when wr1_a =>  --first bit				nxt_state := wr1_b;			when wr1_b =>				nxt_state := wr1_c;			when wr1_c =>				nxt_state := wr1_d;			when wr1_d =>				nxt_state := wr2_a;			--	ibusy := '0'; -- not busy when idle-------------------------------						 when wr2_a =>				nxt_state := wr2_b;			when wr2_b =>				nxt_state := wr2_c;			when wr2_c =>				nxt_state := wr2_d;			when wr2_d =>				nxt_state := wr3_a;--------------------------									when wr3_a =>				nxt_state := wr3_b;			when wr3_b =>				nxt_state := wr3_c;			when wr3_c =>				nxt_state := wr3_d;			when wr3_d =>				nxt_state := wr4_a;			--	ibusy := '0'; -- not busy when idle	-----------------------								when wr4_a =>				nxt_state := wr4_b;			when wr4_b =>				nxt_state := wr4_c;			when wr4_c =>				nxt_state := wr4_d;			when wr4_d =>				nxt_state := wr5_a;-----------------------						    when wr5_a =>				nxt_state := wr5_b;			when wr5_b =>				nxt_state := wr5_c;			when wr5_c =>				nxt_state := wr5_d;			when wr5_d =>				nxt_state := wr6_a;------------------------             when wr6_a =>				nxt_state := wr6_b;			when wr6_b =>				nxt_state := wr6_c;			when wr6_c =>				nxt_state := wr6_d;			when wr6_d =>				nxt_state := wr7_a;		----------------------------									     when wr7_a =>				nxt_state := wr7_b;			when wr7_b =>				nxt_state := wr7_c;			when wr7_c =>				nxt_state := wr7_d;			when wr7_d =>				nxt_state := wr8_a;												    when wr8_a =>				nxt_state := wr8_b;			when wr8_b =>				nxt_state := wr8_c;			when wr8_c =>				nxt_state := wr8_d;			when wr8_d =>				nxt_state := ack1_a;------------------------------							when ack1_a =>				nxt_state := ack1_b;			when ack1_b=>				nxt_state := ack1_c;			when ack1_c =>				nxt_state := ack1_d;			when ack1_d =>				nxt_state := wr9_a;		---------------------------------------写入高位字节地址---------------------						when wr9_a =>				nxt_state := wr9_b;			when wr9_b =>				nxt_state := wr9_c;			when wr9_c =>				nxt_state := wr9_d;			when wr9_d =>				nxt_state := wr10_a;		---------------------------------						when wr10_a =>				nxt_state := wr10_b;			when wr10_b =>				nxt_state := wr10_c;			when wr10_c =>				nxt_state := wr10_d;			when wr10_d =>				nxt_state := wr11_a;	--------------------------		       when wr11_a =>				nxt_state := wr11_b;			when wr11_b =>				nxt_state := wr11_c;			when wr11_c =>				nxt_state := wr11_d;			when wr11_d =>				nxt_state := wr12_a;   --------------------------           when wr12_a =>				nxt_state := wr12_b;			when wr12_b =>				nxt_state := wr12_c;			when wr12_c =>				nxt_state := wr12_d;			when wr12_d =>				nxt_state := wr13_a;				-------------			when wr13_a =>				nxt_state := wr13_b;			when wr13_b =>				nxt_state := wr13_c;			when wr13_c =>				nxt_state := wr13_d;			when wr13_d =>				nxt_state := wr14_a;				---------			when wr14_a =>				nxt_state := wr14_b;			when wr14_b =>				nxt_state := wr14_c;			when wr14_c =>				nxt_state := wr14_d;			when wr14_d =>				nxt_state := wr15_a;					------------			when wr15_a =>				nxt_state := wr15_b;			when wr15_b =>				nxt_state := wr15_c;			when wr15_c =>				nxt_state := wr15_d;			when wr15_d =>				nxt_state := wr16_a;				-----------		    when wr16_a =>				nxt_state := wr16_b;			when wr16_b =>				nxt_state := wr16_c;			when wr16_c =>				nxt_state := wr16_d;			when wr16_d =>				nxt_state := ack2_a;					-------------------------						    when ack2_a =>				nxt_state := ack2_b;			when ack2_b=>				nxt_state := ack2_c;			when ack2_c =>				nxt_state := ack2_d;			when ack2_d =>				nxt_state := wr17_a;   	--写eeprom时进入wr25_a,写9011/ 9034时进入wr17_a--------------------------------------写低位字节地址--------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -