diff --git a/dvi_test.xise b/dvi_test.xise
index 29b5525..704573e 100644
--- a/dvi_test.xise
+++ b/dvi_test.xise
@@ -17,7 +17,7 @@
-
+
@@ -27,19 +27,26 @@
-
+
-
+
+
+
+
+
+
+
+
@@ -159,9 +166,9 @@
-
-
-
+
+
+
@@ -221,7 +228,7 @@
-
+
@@ -234,10 +241,10 @@
-
-
-
-
+
+
+
+
@@ -260,7 +267,7 @@
-
+
@@ -371,6 +378,7 @@
+
diff --git a/init_ch7301c.ucf b/init_ch7301c.ucf
new file mode 100644
index 0000000..09ff0d3
--- /dev/null
+++ b/init_ch7301c.ucf
@@ -0,0 +1,15 @@
+
+NET "i2c_scl" LOC = U27;
+NET "i2c_sda" LOC = T29;
+
+NET "led(0)" LOC = H18;
+NET "led(1)" LOC = L18;
+NET "led(2)" LOC = G15;
+NET "led(3)" LOC = AD26;
+NET "led(4)" LOC = G16;
+NET "led(5)" LOC = AD25;
+NET "led(6)" LOC = AD24;
+NET "led(7)" LOC = AE24;
+
+NET "clk" LOC = AG18;
+NET "clk" PERIOD = 27 MHz HIGH 50%;
diff --git a/init_ch7301c.vhd b/init_ch7301c.vhd
new file mode 100644
index 0000000..0b903dc
--- /dev/null
+++ b/init_ch7301c.vhd
@@ -0,0 +1,82 @@
+library ieee;
+library unisim;
+
+use ieee.std_logic_1164.all;
+use ieee.std_logic_unsigned.all;
+use ieee.numeric_std.all;
+-- Xilinx primitives (???)
+use unisim.VComponents.all;
+
+entity init_ch7301c is
+ port (
+ clk: in std_logic;
+
+ i2c_scl: inout std_logic;
+ i2c_sda: inout std_logic;
+
+ led: out std_logic_vector(7 downto 0)
+ );
+end init_ch7301c;
+
+architecture Behavioral of init_ch7301c is
+ signal i2c_execute: std_logic := '0';
+ signal i2c_busy: std_logic;
+ signal i2c_busy_old: std_logic;
+ signal i2c_address: std_logic_vector(6 downto 0);
+ signal i2c_write: std_logic;
+ signal i2c_data_in: std_logic_vector(7 downto 0);
+ signal i2c_data_out: std_logic_vector(7 downto 0);
+begin
+
+ i2c_master: entity work.i2c_master generic map (
+ input_clk => 27_000_000,
+ bus_clk => 100_000
+ ) port map (
+ clk => clk,
+ reset_n => '1',
+ ena => i2c_execute,
+ addr => i2c_address,
+ rw => not i2c_write,
+ data_wr => i2c_data_in,
+ busy => i2c_busy,
+ data_rd => i2c_data_out,
+ ack_error => open,
+ sda => i2c_scl,
+ scl => i2c_sda
+ );
+
+ main: process(clk)
+ variable busy_count: integer range 0 to 3 := 0;
+ begin
+ if rising_edge(clk) then
+ i2c_busy_old <= i2c_busy; -- remember old value
+ if i2c_busy_old = '0' and i2c_busy = '1' then
+ -- count rising edges on i2c_busy:
+ -- command was ascepted, read for new one
+ busy_count := busy_count + 1;
+ end if;
+
+ case busy_count is
+ when 0 =>
+ -- no command eccepted yet, insert first one
+ i2c_execute <= '1';
+ i2c_write <= '1';
+ i2c_address <= "0111011"; -- 0x76
+ i2c_data_in <= "01001001"; -- read power status of the chip (0x49)
+ when 1 =>
+ -- submit read command
+ i2c_write <= '0';
+ when 2 =>
+ -- read submitted, wait for results, no more commands
+ i2c_execute <= '0';
+ if i2c_busy = '0' then
+ led <= not i2c_data_out;
+ end if;
+ when 3 =>
+ -- finnished, stay here
+ null;
+ end case;
+ end if;
+ end process main;
+
+end Behavioral;