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;