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";
50 constant HALFPERIOD : std_logic_vector(TOG_CNT_WIDTH-1 downto 0) := "0000101101110001101100000";
\r
51 -- define half period of toggle frequency in clock ticks
\r
54 -----------------------------------------------------------------------------
\r
55 -- draw rectangle on screen
\r
56 -----------------------------------------------------------------------------
\r
58 DRAW_SQUARE_syn: process(clk, reset)
\r
60 if (reset = RES_ACT) then -- draw black screen upon reset
\r
64 elsif (clk'event and clk = '1') then -- synchronous capture
\r
72 DRAW_SQUARE_next: process (column_counter, line_counter, v_enable, h_enable, toggle_sig)
\r
74 if v_enable = ENABLE and h_enable = ENABLE then
\r
75 if (column_counter >= X_MIN and column_counter <= X_MAX and -- if pixel within the rectangle borders
\r
76 line_counter >= Y_MIN and line_counter <= Y_MAX) then
\r
77 r_next <= toggle_sig; -- ...red
\r
78 g_next <= COLR_OFF; -- ...green
\r
79 b_next <= not toggle_sig; -- ...blue
\r
80 else -- if somewhere else on screen...
\r
82 g_next <= COLR_OFF; -- ... draw background color
\r
85 else -- if out of screen...
\r
87 g_next <= COLR_OFF; -- ... do not activate any color
\r
88 b_next <= COLR_OFF; -- (black screen)
\r
93 -----------------------------------------------------------------------------
\r
94 -- control blinking of rectangle
\r
95 -----------------------------------------------------------------------------
\r
97 BLINKER_syn: process(clk, reset)
\r
99 if (reset = RES_ACT) then -- asyn reset
\r
100 toggle_counter_sig <= (others => '0');
\r
101 toggle_sig <= COLR_OFF;
\r
102 elsif(clk'event and clk = '1') then -- synchronous capture
\r
103 toggle_counter_sig <= toggle_counter_next;
\r
104 toggle_sig <= toggle_next;
\r
109 BLINKER_next : process(toggle_counter_sig, toggle_sig)
\r
111 if toggle_counter_sig >= HALFPERIOD then -- after half period ...
\r
112 toggle_counter_next <= (others => '0'); -- ... clear counter
\r
113 toggle_next <= not(toggle_sig); -- ... and toggle colour.
\r
114 else -- before half period ...
\r
115 toggle_counter_next <= toggle_counter_sig + '1'; -- ... increment counter
\r
116 toggle_next <= toggle_sig; -- ... and hold colour
\r
121 -- assign auxiliary signals to module outputs
\r
122 toggle <= toggle_sig;
\r
123 toggle_counter <= toggle_counter_sig;
\r
127 -------------------------------------------------------------------------------
\r
128 -- END ARCHITECTURE
\r
129 -------------------------------------------------------------------------------
\r