summaryrefslogtreecommitdiffstats
path: root/smh-ac415-fpga/lcd_driver/a_input.vhdl
blob: 434d820265287c329266ecac67429095f1ff6983 (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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
LIBRARY ieee;
USE ieee.std_logic_1164.all;
use IEEE.NUMERIC_STD.all;

LIBRARY altera_mf;
USE altera_mf.altera_mf_components.all;

ENTITY a_input IS
    generic (debounce_stages : natural := 2;
             sync_stages     : natural := 2;
	     hres	     : natural := 594;
             front_porch     : natural := 100;
	     p_clk_multiple  : natural := 4;
	     vres            : natural := 384);

	PORT
	(
	  p_clk : in std_logic;
	  sys_rst_n : in std_logic;
	  video_in:in std_logic;
	  bright_in:in std_logic;
	  hsync_in:in std_logic;
	  vsync_in: in std_logic;
	  video_out: out std_logic_vector(1 downto 0);
	  addr_out : out std_logic_vector(17 downto 0);
	  wren_out : out std_logic;
	  p_clk_out : out std_logic
	  );
	  
END a_input;


ARCHITECTURE beh OF a_input IS

   signal p_clk_div : natural;
   signal row_addr : std_logic_vector(17 downto 0)	;
   signal addr : std_logic_vector(17 downto 0)	;
   signal wren: std_logic;


 signal s_hsync: std_logic;
 signal d_hsync: std_logic;
 signal pe_hsync: std_logic;
 signal ne_hsync: std_logic;


 signal s_vsync: std_logic;
 signal d_vsync: std_logic;

 signal s_video: std_logic;
 signal s_bright: std_logic;

 signal fp_counter:natural;
 signal active_counter:natural;

		
begin

	

    video_sync: entity work.synchronizer
		generic map(stages => sync_stages +debounce_stages)
		port map (
			clk=>p_clk,
			i => video_in,
			o =>s_video
			);



    bright_sync: entity work.synchronizer
		generic map(stages => sync_stages +debounce_stages)
		port map (
			clk=>p_clk,
			i => bright_in,
			o =>s_bright
			);


    hsync_sync: entity work.synchronizer
		generic map(stages => sync_stages)
		port map (
			clk=>p_clk,
			i => hsync_in,
			o =>s_hsync
			);



    vsync_sync: entity work.synchronizer
		generic map(stages => sync_stages  )
		port map (
			clk=>p_clk,
			i => vsync_in,
			o =>s_vsync
			);

    hsync_debounce : entity work.debounce
        generic map(stages => debounce_stages)
        port map(
            clk => p_clk,
            i   => s_hsync,
            o   => d_hsync);


    hsync_ed : entity work.edge_det
        port map(
            clk => p_clk,
            sig => d_hsync,
            pe  => pe_hsync,
            ne  => ne_hsync);




    vsync_debounce : entity work.debounce
        generic map(stages => debounce_stages)
        port map(
            clk => p_clk,
            i   => s_vsync,
            o   => d_vsync);



-- horizontal state machine

	process (sys_rst_n,p_clk,d_hsync,d_vsync)  begin
	if sys_rst_n = '0' then
		row_addr<=(others =>'0');
		addr<=(others =>'0');
		p_clk_div<=p_clk_multiple;
		active_counter <=0;
		fp_counter <=0;
	elsif rising_edge(p_clk) then
		if d_vsync='1' then
			row_addr<=(others => '0');
			addr<=(others => '0');
			fp_counter <= front_porch;
			active_counter <=hres;
			p_clk_div <=p_clk_multiple;
            	elsif pe_gsync ='1' then
			row_addr <= std_logic_vector(unsigned(row_addr)+1);
		elsif ne_hsync='1' then
			fp_counter <= front_porch;
			active_counter <=hres;
			p_clk_div <=p_clk_multiple;
			addr<=row_addr;
		elsif fp_counter /= 0 then
			fp_counter <= fp_counter -1;
		elsif active_counter /= 0 then	
			if p_clk_div = 0 then
				p_clk_div <=p_clk_multiple;
				active_counter <= active_counter  -1;
		   		addr <= std_logic_vector(unsigned(addr)+vres);
			else 
				p_clk_div <= p_clk_div - 1;
			end if;
		else 
			p_clk_div <=p_clk_multiple;
		end if;
	end if;
	end process;
			

        wren <= '1' when p_clk_div=2 else '0';

	addr_out <= addr;
        video_out <= (s_video, s_bright);
        wren_out <= wren;

        p_clk_out <= p_clk;


end beh;