1 -------------------------------------------------------------------------------
\r
2 -- Title : vga architecture
\r
3 -- Project : LU Digital Design
\r
4 -------------------------------------------------------------------------------
\r
6 -- Author : Thomas Handl
\r
8 -- Created : 2004-04-07
\r
9 -- Last update: 2006-02-24
\r
10 -------------------------------------------------------------------------------
\r
11 -- Description: arch of top level module, the sub-modules are connected here
\r
12 -------------------------------------------------------------------------------
\r
13 -- Copyright (c) 2004 TU Wien
\r
14 -------------------------------------------------------------------------------
\r
16 -- Date Version Author Description
\r
17 -- 2004-04-07 1.0 handl Created
\r
18 -- 2006-02-24 2.0 ST revised
\r
19 -------------------------------------------------------------------------------
\r
21 -------------------------------------------------------------------------------
\r
23 -------------------------------------------------------------------------------
\r
26 use IEEE.std_logic_1164.all;
\r
27 use IEEE.std_logic_unsigned.all;
\r
28 use IEEE.std_logic_arith.all;
\r
30 use work.vga_pak.all; -- include package
\r
32 -------------------------------------------------------------------------------
\r
34 -------------------------------------------------------------------------------
\r
36 architecture behav of vga is
\r
38 attribute syn_preserve : boolean;
\r
39 attribute syn_preserve of behav : architecture is true;
\r
42 -------------------------------------------------------------------------------
\r
43 -- component declarations for the modules
\r
44 -------------------------------------------------------------------------------
\r
46 component vga_driver
\r
49 reset : in std_logic;
\r
50 column_counter : out std_logic_vector(COL_CNT_WIDTH-1 downto 0);
\r
51 line_counter : out std_logic_vector(LINE_CNT_WIDTH-1 downto 0);
\r
52 h_enable : out std_logic;
\r
53 v_enable : out std_logic;
\r
54 hsync : out std_logic;
\r
55 vsync : out std_logic;
\r
56 d_hsync_state : out hsync_state_type;
\r
57 d_vsync_state : out vsync_state_type;
\r
58 d_hsync_counter : out std_logic_vector(HSYN_CNT_WIDTH-1 downto 0);
\r
59 d_vsync_counter : out std_logic_vector(VSYN_CNT_WIDTH-1 downto 0);
\r
60 d_set_hsync_counter : out std_logic;
\r
61 d_set_vsync_counter : out std_logic;
\r
62 d_set_column_counter : out std_logic;
\r
63 d_set_line_counter : out std_logic);
\r
67 component vga_control
\r
70 reset : in std_logic;
\r
71 column_counter : in std_logic_vector(COL_CNT_WIDTH-1 downto 0);
\r
72 line_counter : in std_logic_vector(LINE_CNT_WIDTH-1 downto 0);
\r
73 h_enable : in std_logic;
\r
74 v_enable : in std_logic;
\r
75 toggle_counter : out std_logic_vector(TOG_CNT_WIDTH-1 downto 0);
\r
76 toggle : out std_logic;
\r
77 r, g, b : out std_logic
\r
82 component board_driver
\r
84 reset : in std_logic;
\r
85 seven_seg : out std_logic_vector(2*SEG_WIDTH-1 downto 0));
\r
89 -- declare signals needed for internal wiring of these components later
\r
90 signal column_counter_sig : std_logic_vector(COL_CNT_WIDTH-1 downto 0);
\r
91 signal line_counter_sig : std_logic_vector(LINE_CNT_WIDTH-1 downto 0);
\r
92 signal h_enable_sig : std_logic;
\r
93 signal v_enable_sig : std_logic;
\r
94 signal r_sig, g_sig, b_sig : std_logic;
\r
95 signal hsync_sig, vsync_sig : std_logic;
\r
97 -- declare signals needed for prolongation of reset
\r
98 signal dly_counter : std_logic_vector(1 downto 0);
\r
99 signal dly_counter_next : std_logic_vector(1 downto 0);
\r
100 constant MAX_DLY : std_logic_vector(1 downto 0) := "11";
\r
101 signal reset_dly : std_logic; --
\r
102 signal safe_reset : std_logic;
\r
105 -------------------------------------------------------------------------------
\r
106 -- prolong duration of reset to prevent glitches at power-up
\r
107 -------------------------------------------------------------------------------
\r
111 DELAY_RESET_syn : process(clk_pin) -- synchronous capture
\r
113 if clk_pin'event and clk_pin = '1' then -- upon rising clock
\r
114 dly_counter <= dly_counter_next; -- ... capture new counter value
\r
118 DELAY_RESET_next : process(dly_counter, reset_pin) -- next state logic
\r
120 if reset_pin = RES_ACT then -- upon reset
\r
121 dly_counter_next <= (others => '0'); -- ...clear dly counter
\r
122 elsif dly_counter < MAX_DLY then -- if no oflo
\r
123 dly_counter_next <= dly_counter + '1'; -- ...increment dly counter
\r
125 dly_counter_next <= dly_counter; -- freeze dly counter when oflo
\r
129 DELAY_RESET_out: process(dly_counter)
\r
131 if dly_counter < MAX_DLY then -- until dly counter reaches maximum
\r
132 reset_dly <= RES_ACT; -- ...activate delayed reset signal
\r
133 else -- upon counter oflo
\r
134 reset_dly <= not(RES_ACT); -- ...finally deactivate delayed reset
\r
140 COMBINE_RESET: process(reset_pin, reset_dly) -- generate "safe" reset signal
\r
142 if reset_pin = RES_ACT or reset_dly = RES_ACT then -- ...by combining delayed reset with non-delayed reset input
\r
143 safe_reset <= RES_ACT;
\r
145 safe_reset <= not(RES_ACT);
\r
150 -------------------------------------------------------------------------------
\r
151 -- instantiate the components and connect to internal and external signals
\r
152 -------------------------------------------------------------------------------
\r
155 board_driver_unit : board_driver
\r
157 reset => safe_reset,
\r
158 seven_seg => seven_seg_pin);
\r
161 vga_driver_unit : vga_driver
\r
164 reset => safe_reset,
\r
165 column_counter => column_counter_sig,
\r
166 line_counter => line_counter_sig,
\r
167 h_enable => h_enable_sig,
\r
168 v_enable => v_enable_sig,
\r
169 hsync => hsync_sig,
\r
170 vsync => vsync_sig,
\r
171 d_hsync_state => d_hsync_state,
\r
172 d_vsync_state => d_vsync_state,
\r
173 d_hsync_counter => d_hsync_counter,
\r
174 d_vsync_counter => d_vsync_counter,
\r
175 d_set_hsync_counter => d_set_hsync_counter,
\r
176 d_set_vsync_counter => d_set_vsync_counter,
\r
177 d_set_column_counter => d_set_column_counter,
\r
178 d_set_line_counter => d_set_line_counter);
\r
180 -- make the wiring for hsync and vsync pins
\r
181 -- (pin is output only => internal _sig version required to allow readback of signal)
\r
182 vsync_pin <= vsync_sig;
\r
183 hsync_pin <= hsync_sig;
\r
186 vga_control_unit : vga_control
\r
189 reset => safe_reset,
\r
190 column_counter => column_counter_sig,
\r
191 line_counter => line_counter_sig,
\r
192 h_enable => h_enable_sig,
\r
193 v_enable => v_enable_sig,
\r
194 toggle_counter => d_toggle_counter,
\r
195 toggle => d_toggle,
\r
200 -- make the wiring for RGB pins: drive all pins for same color from one source ("8 color mode")
\r
201 r0_pin <= r_sig; r1_pin <= r_sig; r2_pin <= r_sig;
\r
202 g0_pin <= g_sig; g1_pin <= g_sig; g2_pin <= g_sig;
\r
203 b0_pin <= b_sig; b1_pin <= b_sig;
\r
206 -- make extra pin connections for debug signals
\r
207 d_hsync <= hsync_sig; -- make duplicate of signal for debug connector
\r
208 d_vsync <= vsync_sig; -- make duplicate of signal for debug connector
\r
209 d_column_counter <= column_counter_sig;
\r
210 d_line_counter <= line_counter_sig;
\r
211 d_h_enable <= h_enable_sig;
\r
212 d_v_enable <= v_enable_sig;
\r
216 d_state_clk <= clk_pin; -- make duplicate of signal for debug connector
\r
221 -------------------------------------------------------------------------------
\r
222 -- END ARCHITECTURE
\r
223 -------------------------------------------------------------------------------
\r