1 | ------------------------------------------------------------------------------------
|
2 | --Design : Altera DE0 Board
|
3 | ------------------------------------------------------------------------------------
|
4 |
|
5 | library ieee;
|
6 | use ieee.std_logic_1164.ALL;
|
7 | use ieee.std_logic_arith.ALL;
|
8 | use ieee.std_logic_unsigned.ALL;
|
9 |
|
10 | use work.de0_const_pkg.ALL;
|
11 |
|
12 | entity vga is
|
13 | port (
|
14 | RESET_n : in std_logic;
|
15 | CLK : in std_logic;
|
16 | Hsync : out std_logic;
|
17 | Vsync : out std_logic
|
18 | );
|
19 | end vga;
|
20 |
|
21 | architecture rtl of vga is
|
22 | type state_type is (ST_E, ST_B, ST_C, ST_D, ST_P, ST_Q, ST_R, ST_S);
|
23 | signal state : state_type;
|
24 |
|
25 | signal var_b : integer range 0 to 188;
|
26 | signal var_c : integer range 0 to 94;
|
27 | signal var_d : integer range 0 to 1528;
|
28 | signal var_e : integer range 0 to 49;
|
29 |
|
30 | signal var_p : integer range 0 to 3;
|
31 | signal var_q : integer range 0 to 51;
|
32 | signal var_r : integer range 0 to 762;
|
33 | signal var_s : integer range 0 to 17;
|
34 |
|
35 |
|
36 | begin
|
37 |
|
38 | H_Counter: process(RESET_n,CLK)
|
39 | -- ______________________ ________
|
40 | -- ________| VIDEO |________| VIDEO (next line)
|
41 | -- |-C-|----------D-----------|-E-|
|
42 |
|
43 | -- __ ______________________________ ___________
|
44 | -- |_| |_|
|
45 | -- |B|
|
46 | -- |---------------A----------------|
|
47 |
|
48 | -- B.. Hsync (Sync pulse lenght)
|
49 | -- C.. Back porch
|
50 | -- D.. Active video time
|
51 | -- E.. Front porch
|
52 |
|
53 | begin
|
54 |
|
55 | if(RESET_n = '0') then
|
56 |
|
57 | elsif(CLK'event and CLK = '1') then
|
58 |
|
59 |
|
60 | case state is
|
61 |
|
62 | when ST_B =>
|
63 | Hsync <= '1';
|
64 | if (var_b < 188) then
|
65 | var_b <= (var_b +1);
|
66 | end if;
|
67 | state <= ST_C;
|
68 |
|
69 | when ST_C =>
|
70 | Hsync <= '0';
|
71 | if (var_c < 94) then
|
72 | var_c <= (var_c +1);
|
73 | end if;
|
74 | state <= ST_D;
|
75 |
|
76 | when ST_D =>
|
77 | Hsync <= '0';
|
78 | if (var_d < 1528) then
|
79 | var_d <= (var_d +1);
|
80 | end if;
|
81 | state <= ST_E;
|
82 |
|
83 | when ST_E =>
|
84 | Hsync <= '0';
|
85 | if (var_e < 49) then
|
86 | var_e <= (var_e +1);
|
87 | end if;
|
88 | state <= ST_B;
|
89 |
|
90 | when others => null;
|
91 |
|
92 | end case;
|
93 | end if;
|
94 | end process H_Counter;
|
95 |
|
96 | V_Counter: process(RESET_n,CLK)
|
97 | -- ______________________ ________
|
98 | -- ________| VIDEO |________| VIDEO (next frame)
|
99 | -- |-Q-|----------R-----------|-S-|
|
100 |
|
101 | -- __ ______________________________ ___________
|
102 | -- |_| |_|
|
103 | -- |P|
|
104 | -- |---------------O----------------|
|
105 |
|
106 | -- P.. Vsync (Sync length)
|
107 | -- Q.. Back porch
|
108 | -- R.. Active video time
|
109 | -- S.. Front porch
|
110 |
|
111 | begin
|
112 | if(RESET_n = '0') then
|
113 |
|
114 | elsif(CLK'event and CLK = '1') then
|
115 |
|
116 | case state is
|
117 |
|
118 | when ST_P =>
|
119 | Vsync <= '1';
|
120 | if (var_p < 3) then
|
121 | var_p <= (var_p +1);
|
122 | end if;
|
123 | state <= ST_Q;
|
124 |
|
125 | when ST_Q =>
|
126 | Vsync <= '0';
|
127 | if (var_q < 51) then
|
128 | var_q <= (var_q +1);
|
129 | end if;
|
130 | state <= ST_R;
|
131 |
|
132 | when ST_R =>
|
133 | Vsync <= '0';
|
134 | if (var_r < 762) then
|
135 | var_r <= (var_r +1);
|
136 | end if;
|
137 | state <= ST_S;
|
138 |
|
139 | when ST_S =>
|
140 | Vsync <= '0';
|
141 | if (var_s < 17) then
|
142 | var_s <= (var_s +1);
|
143 | end if;
|
144 | state <= ST_P;
|
145 |
|
146 | when others => null;
|
147 |
|
148 | end case;
|
149 | end if;
|
150 | end process V_Counter;
|
151 | end rtl;
|