summaryrefslogtreecommitdiffstats
path: root/smh-ac415-fpga/lcd_driver/lcd_driver.vhdl
blob: aeb8c0b0206516fb2ecfe4a730390be89a4d7a83 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.NUMERIC_STD.all;

entity lcd_driver is
     port (
        clk_50m : in std_logic;
        sys_rst_n : in  std_logic;
		
		a_video : in std_logic;
		a_bright : in std_logic;
		a_hsync : in std_logic;
		a_vsync : in std_logic;
		
		hdmi_ddc_scl : inout std_logic;
		hdmi_ddc_sda : inout std_logic;

		hdmi_clk : out std_logic;
		hdmi_red : out std_logic;
		hdmi_green : out std_logic;
		hdmi_blue : out std_logic


--		hdmi_clk_p : out std_logic;
--		hdmi_clk_n : out std_logic;
--		hdmi_red_p : out std_logic;
--		hdmi_red_n : out std_logic;
--		hdmi_green_p : out std_logic;
--		hdmi_green_n : out std_logic;
--		hdmi_blue_p : out std_logic;
--		hdmi_blue_n : out std_logic
 );
end entity lcd_driver;

architecture behavioural of lcd_driver is

	
		signal wren :std_logic;
      signal w_addr :std_logic_vector(17 downto 0);
		signal r_addr :std_logic_vector(17 downto 0);
		
		signal a_clk : std_logic;
		signal h_clk : std_logic;
		signal h_data : std_logic_vector(1 downto 0);
		signal a_data : std_logic_vector(1 downto 0);
	
begin


-- gtf at 30Hz   xrandr --newmode "$M" 127.98  1536 1632 1792 2048  2048 2049 2052 2083  -HSync +Vsync
-- works at 60Hz xrandr --newmode "$M" 213.06  1536 1544 1552 1728  2048 2049 2051 2055  -HSync +Vsync
-- works at 60Hz xrandr --newmode "$M"  18.24   384  400  440  600   592  593  596  613  -HSync +Vsync


   h_clk <= clk_50m;
   
	a_inpuut0: work.a_input
	port map (
	  sys_rst_n => sys_rst_n,
	  clk_50m => clk_50m,
	  
	  video_in => a_video,
	  bright_in => a_bright,
	  hsync_in => a_hsync,
	  vsync_in => a_vsync,
	  
	  p_clk_out => a_clk,
	  video_out =>  a_data,
	  addr_out  => w_addr,
	  wren_out => wren
	  );

	
   process (sys_rst_n,r_addr,h_clk)  begin 
		if sys_rst_n = '0' then 
			r_addr <=(others =>'0');
		elsif rising_edge(h_clk) then
		   r_addr <= std_logic_vector(unsigned(w_addr)+1);
		end if;
	end process;
	
   vram: work.video_ram
   PORT MAP (
		data		=>a_data,
		wraddress	=>w_addr,
		wrclock		=>a_clk,
		wren		=> wren,
		
		rdaddress => r_addr,
		rdclock	 => h_clk,
		q		=> h_data
	);

	

	red_driver : work.hdmi_driver
	PORT MAP (
		in_h => h_data(0),
		in_l => h_data(1),
		clk => h_clk,
		output => hdmi_red
	);
 	
	
	
end behavioural;