1 -------------------------------------------------------------------------------
\r
2 -- Title : vga_control architecture
\r
3 -- Project : LU Digital Design
\r
4 -------------------------------------------------------------------------------
\r
5 -- File : vga_control.vhd
\r
6 -- Author : Thomas Handl
\r
8 -- Created : 2004-12-15
\r
9 -- Last update: 2006-02-24
\r
10 -------------------------------------------------------------------------------
\r
11 -- Description: generation of colors (RGB)
\r
12 -------------------------------------------------------------------------------
\r
13 -- Copyright (c) 2004 TU Wien
\r
14 -------------------------------------------------------------------------------
\r
16 -- Date Version Author Description
\r
17 -- 2004-12-15 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;
\r
32 -------------------------------------------------------------------------------
\r
34 -------------------------------------------------------------------------------
\r
36 architecture behav of vga_control is
\r
39 attribute syn_preserve : boolean;
\r
40 attribute syn_preserve of behav : architecture is true;
\r
43 -- signal and constant declarations
\r
44 signal r_next, g_next, b_next : std_logic; -- auxiliary signals for next state logic
\r
45 signal toggle_sig : std_logic; -- auxiliary signal to allow read back of toggle
\r
46 signal toggle_counter_sig : std_logic_vector(TOG_CNT_WIDTH-1 downto 0); -- auxiliary signal to allow read back of blinker
\r
47 signal toggle_next : std_logic; -- auxiliary signal for next state logic
\r
48 signal toggle_counter_next : std_logic_vector(TOG_CNT_WIDTH-1 downto 0); -- auxiliary signal for next state logic
\r
49 constant HALFPERIOD : std_logic_vector(TOG_CNT_WIDTH-1 downto 0) := "1100000000010001111011000";
\r
50 -- define half period of toggle frequency in clock ticks
\r
53 -----------------------------------------------------------------------------
\r
54 -- draw rectangle on screen
\r
55 -----------------------------------------------------------------------------
\r
57 DRAW_SQUARE_syn: process(clk, reset)
\r
59 if (reset = RES_ACT) then -- draw black screen upon reset
\r
63 elsif (clk'event and clk = '1') then -- synchronous capture
\r
71 DRAW_SQUARE_next: process (column_counter, line_counter, v_enable, h_enable, toggle_sig)
\r
73 if v_enable = ENABLE and h_enable = ENABLE then
\r
74 if (column_counter >= X_MIN and column_counter <= X_MAX and -- if pixel within the rectangle borders
\r
75 line_counter >= Y_MIN and line_counter <= Y_MAX) then
\r
76 r_next <= toggle_sig; -- ...red
\r
77 g_next <= COLR_OFF; -- ...green
\r
78 b_next <= not toggle_sig; -- ...blue
\r
79 else -- if somewhere else on screen...
\r
81 g_next <= COLR_OFF; -- ... draw background color
\r
84 else -- if out of screen...
\r
86 g_next <= COLR_OFF; -- ... do not activate any color
\r
87 b_next <= COLR_OFF; -- (black screen)
\r
92 -----------------------------------------------------------------------------
\r
93 -- control blinking of rectangle
\r
94 -----------------------------------------------------------------------------
\r
96 BLINKER_syn: process(clk, reset)
\r
98 if (reset = RES_ACT) then -- asyn reset
\r
99 toggle_counter_sig <= (others => '0');
\r
100 toggle_sig <= COLR_OFF;
\r
101 elsif(clk'event and clk = '1') then -- synchronous capture
\r
102 toggle_counter_sig <= toggle_counter_next;
\r
103 toggle_sig <= toggle_next;
\r
108 BLINKER_next : process(toggle_counter_sig, toggle_sig)
\r
110 if toggle_counter_sig >= HALFPERIOD then -- after half period ...
\r
111 toggle_counter_next <= (others => '0'); -- ... clear counter
\r
112 toggle_next <= not(toggle_sig); -- ... and toggle colour.
\r
113 else -- before half period ...
\r
114 toggle_counter_next <= toggle_counter_sig + '1'; -- ... increment counter
\r
115 toggle_next <= toggle_sig; -- ... and hold colour
\r
120 -- assign auxiliary signals to module outputs
\r
121 toggle <= toggle_sig;
\r
122 toggle_counter <= toggle_counter_sig;
\r
126 -------------------------------------------------------------------------------
\r
127 -- END ARCHITECTURE
\r
128 -------------------------------------------------------------------------------
\r