diff --git a/dvi_test.xise b/dvi_test.xise index 50b0201..b51d2e2 100644 --- a/dvi_test.xise +++ b/dvi_test.xise @@ -17,7 +17,7 @@ - + @@ -31,19 +31,23 @@ - + - + - + - + + + + + @@ -163,9 +167,9 @@ - - - + + + @@ -225,7 +229,7 @@ - + @@ -238,10 +242,10 @@ - - - - + + + + @@ -264,7 +268,7 @@ - + @@ -374,7 +378,7 @@ - + diff --git a/init_ch7301c.ucf b/init_ch7301c.ucf index 63aeefa..b2ef5fa 100644 --- a/init_ch7301c.ucf +++ b/init_ch7301c.ucf @@ -5,16 +5,3 @@ NET "reset" LOC = AJ6; # center switch NET "i2c_scl" LOC = U27; NET "i2c_sda" LOC = T29; NET "dvi_reset" LOC = AK6; - -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 "led_n" LOC = AF13; -NET "led_s" LOC = AG12; -NET "led_c" LOC = E8; diff --git a/init_ch7301c.vhd b/init_ch7301c.vhd index dbe9e4e..33831f3 100644 --- a/init_ch7301c.vhd +++ b/init_ch7301c.vhd @@ -7,25 +7,19 @@ use ieee.numeric_std.all; entity init_ch7301c is generic ( - input_clk: integer := 27_000_000; + input_clk: integer; address: std_logic_vector(6 downto 0) := "1110110" -- 0x76 ); port ( clk: in std_logic; reset: in std_logic; - finished: buffer std_logic; - error: buffer std_logic; + finished: out std_logic; + error: out std_logic; i2c_scl: inout std_logic; i2c_sda: inout std_logic; - - -- tmp - dvi_reset: out std_logic; - led: out std_logic_vector(7 downto 0); - led_n: out std_logic; - led_s: out std_logic; - led_c: out std_logic + dvi_reset: out std_logic ); end init_ch7301c; @@ -58,15 +52,11 @@ begin sda => i2c_sda ); - led_n <= error; - led_s <= finished; - led_c <= reset; - main: process(clk, reset) -- ch7301c needs some time (>2µs) to init its i2c port after reset constant max_delay: integer := input_clk / 200_000; -- 5µs variable delay: integer range 0 to max_delay := 0; - variable busy_count: integer range 0 to 10 := 0; + variable busy_count: integer range 0 to 12 := 0; begin if reset = '1' then delay := 0; @@ -139,6 +129,14 @@ begin i2c_data_in <= x"60"; when 10 => + -- select register CM (clock mode) + i2c_data_in <= x"1C"; + when 11 => + -- enable singledual edge clocking mode + -- single: 01, dual: 00 (default) + i2c_data_in <= x"01"; + + when 12 => -- no more commands i2c_execute <= '0'; finished <= '1'; diff --git a/main.ucf b/main.ucf index 13d8b64..415ce09 100644 --- a/main.ucf +++ b/main.ucf @@ -1,4 +1,3 @@ - # DVI-Encoder Interface NET "dvi_d(0)" LOC = AB8; NET "dvi_d(1)" LOC = AC8; @@ -18,6 +17,8 @@ NET "dvi_hsync" LOC = AM12; NET "dvi_vsync" LOC = AM11; NET "dvi_de" LOC = AE8; NET "dvi_reset" LOC = AK6; +NET "i2c_scl" LOC = U27; +NET "i2c_sda" LOC = T29; NET "clk" LOC = AH15; NET "clk" PERIOD = 100 MHz HIGH 50%; @@ -27,4 +28,4 @@ NET "switch_center" LOC = AJ6; NET "led0" LOC = H18; NET "led1" LOC = L18; NET "led2" LOC = G15; -NET "led4" LOC = G16; \ No newline at end of file +NET "led4" LOC = G16; diff --git a/main.vhd b/main.vhd index 97b5197..ab41384 100644 --- a/main.vhd +++ b/main.vhd @@ -18,6 +18,8 @@ entity main is dvi_vsync: out std_logic; dvi_de: out std_logic; dvi_reset: out std_logic; + i2c_scl: inout std_logic; + i2c_sda: inout std_logic; switch_center: in std_logic; led0: out std_logic; @@ -36,6 +38,7 @@ architecture Behavioral of main is signal vsync: std_logic; signal de: std_logic; begin + -- convert the 100MHz to a 48MHz pixel clock clock_source: entity work.clock_source port map ( CLKIN_IN => clk, CLKFX_OUT => clk_vga @@ -48,6 +51,18 @@ begin I => clk_vga ); + ch7301c: entity work.init_ch7301c generic map ( + input_clk => 48_000_000 + ) port map ( + clk => clk_vga, + reset => switch_center, + finished => open, + error => open, + i2c_scl => i2c_scl, + i2c_sda => i2c_sda, + dvi_reset => dvi_reset + ); + vga_sync: entity work.vga port map ( clk => clk_vga, --x, y (static color for now) @@ -67,6 +82,4 @@ begin led1 <= dvi_clk; led2 <= hsync; led4 <= vsync; - - dvi_reset <= not switch_center; end Behavioral; diff --git a/vga.vhd b/vga.vhd index 6917294..62219da 100644 --- a/vga.vhd +++ b/vga.vhd @@ -24,8 +24,8 @@ architecture behavioral of vga is signal vcount: std_logic_vector(9 downto 0) := (others => '0'); signal data_enabled: std_logic; begin - --dvi_clk <= clk; - dvi_clk <= second_batch; + dvi_clk <= clk; + --dvi_clk <= second_batch; dvi_de <= data_enabled; data_enabled <= '1' when hcount < 640 and vcount < 480 else