init aus gzip
[dide_16.git] / bsp3 / Angabe / vga_arc.vhd
1  -------------------------------------------------------------------------------\r
2 -- Title      : vga architecture\r
3 -- Project    : LU Digital Design\r
4 -------------------------------------------------------------------------------\r
5 -- File       : vga.vhd\r
6 -- Author     : Thomas Handl\r
7 -- Company    : TU Wien\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
15 -- Revisions  :\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
20 \r
21 -------------------------------------------------------------------------------\r
22 -- LIBRARIES\r
23 -------------------------------------------------------------------------------\r
24 \r
25 library IEEE;\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
29 \r
30 use work.vga_pak.all;      -- include package\r
31 \r
32 -------------------------------------------------------------------------------\r
33 -- ARCHITECTURE\r
34 -------------------------------------------------------------------------------\r
35 \r
36 architecture behav of vga is\r
37 \r
38   attribute syn_preserve          : boolean;\r
39   attribute syn_preserve of behav : architecture is true;\r
40 \r
41 \r
42 -------------------------------------------------------------------------------\r
43 -- component declarations for the modules\r
44 -------------------------------------------------------------------------------\r
45 \r
46   component vga_driver\r
47     port (\r
48       clk                  : in  std_logic;\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
64   end component;\r
65 \r
66 \r
67   component vga_control\r
68     port (\r
69       clk            : in  std_logic;\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       r, g, b        : out std_logic\r
76       );\r
77   end component;\r
78 \r
79 \r
80   component board_driver\r
81     port (\r
82        reset : in  std_logic;\r
83       seven_seg  : out std_logic_vector(2*SEG_WIDTH-1 downto 0));\r
84   end component;\r
85 \r
86 \r
87 -- declare signals needed for internal wiring of these components later\r
88   signal column_counter_sig   : std_logic_vector(COL_CNT_WIDTH-1 downto 0);\r
89   signal line_counter_sig     : std_logic_vector(LINE_CNT_WIDTH-1 downto 0);\r
90   signal h_enable_sig         : std_logic;\r
91   signal v_enable_sig         : std_logic;\r
92   signal r_sig, g_sig, b_sig  : std_logic;\r
93   signal hsync_sig, vsync_sig : std_logic;\r
94   \r
95 -- declare signals needed for prolongation of reset\r
96   signal   dly_counter       : std_logic_vector(1 downto 0);\r
97   signal   dly_counter_next  : std_logic_vector(1 downto 0);\r
98   constant MAX_DLY           : std_logic_vector(1 downto 0) := "11";\r
99   signal   reset_dly         : std_logic;      --\r
100   signal   safe_reset        : std_logic;     \r
101 \r
102 \r
103 -------------------------------------------------------------------------------\r
104 -- prolong duration of reset to prevent glitches  at power-up\r
105 -------------------------------------------------------------------------------\r
106 \r
107 begin\r
108 \r
109   DELAY_RESET_syn : process(clk_pin)            -- synchronous capture\r
110   begin\r
111     if clk_pin'event and clk_pin = '1' then     -- upon rising clock\r
112       dly_counter <= dly_counter_next;          -- ... capture new counter value\r
113     end if;\r
114   end process;\r
115 \r
116   DELAY_RESET_next : process(dly_counter, reset_pin)    -- next state logic\r
117   begin\r
118     if reset_pin = RES_ACT then              -- upon reset\r
119       dly_counter_next <= (others => '0');   -- ...clear dly counter\r
120     elsif dly_counter < MAX_DLY then         -- if no oflo\r
121       dly_counter_next <= dly_counter + '1'; -- ...increment dly counter\r
122     else \r
123       dly_counter_next <= dly_counter;       -- freeze dly counter when oflo\r
124     end if;\r
125   end process;\r
126   \r
127   DELAY_RESET_out: process(dly_counter)\r
128   begin\r
129     if dly_counter < MAX_DLY then      -- until dly counter reaches maximum\r
130       reset_dly   <= RES_ACT;          -- ...activate delayed reset signal\r
131     else                               -- upon counter oflo \r
132       reset_dly <= not(RES_ACT);       -- ...finally deactivate delayed reset\r
133     end if;\r
134   end process;\r
135 \r
136 \r
137 \r
138   COMBINE_RESET: process(reset_pin, reset_dly)         -- generate "safe" reset signal\r
139   begin\r
140     if reset_pin = RES_ACT or reset_dly = RES_ACT then -- ...by combining delayed reset with non-delayed reset input \r
141       safe_reset <= RES_ACT;\r
142     else\r
143       safe_reset <= not(RES_ACT);\r
144     end if;\r
145   end process;\r
146 \r
147 \r
148 -------------------------------------------------------------------------------\r
149 -- instantiate the components and connect to internal and external signals\r
150 -------------------------------------------------------------------------------\r
151 \r
152 \r
153 board_driver_unit : board_driver\r
154     port map (\r
155       reset       => safe_reset,\r
156       seven_seg   => seven_seg_pin);\r
157 \r
158 \r
159 vga_driver_unit : vga_driver\r
160     port map (\r
161       clk                => clk_pin,\r
162       reset              => safe_reset,\r
163       column_counter     => column_counter_sig,\r
164       line_counter       => line_counter_sig,\r
165       h_enable           => h_enable_sig,\r
166       v_enable           => v_enable_sig,\r
167       hsync              => hsync_sig,\r
168       vsync              => vsync_sig,\r
169       d_hsync_state        => d_hsync_state,\r
170       d_vsync_state        => d_vsync_state,\r
171       d_hsync_counter      => d_hsync_counter,\r
172       d_vsync_counter      => d_vsync_counter,\r
173       d_set_hsync_counter  => d_set_hsync_counter,\r
174       d_set_vsync_counter  => d_set_vsync_counter,\r
175       d_set_column_counter => d_set_column_counter,\r
176       d_set_line_counter   => d_set_line_counter);\r
177 \r
178 -- make the wiring for hsync and vsync pins \r
179 -- (pin is output only => internal _sig version required to allow readback of signal)\r
180   vsync_pin <= vsync_sig;\r
181   hsync_pin <= hsync_sig;\r
182 \r
183 \r
184   vga_control_unit : vga_control\r
185     port map (\r
186       clk            => clk_pin,\r
187       reset          => safe_reset,\r
188       column_counter => column_counter_sig,\r
189       line_counter   => line_counter_sig,\r
190       h_enable       => h_enable_sig,\r
191       v_enable       => v_enable_sig,\r
192       r              => r_sig,\r
193       g              => g_sig,\r
194       b              => b_sig);\r
195 \r
196 -- make the wiring for RGB pins: drive all pins for same color from one source ("8 color mode")\r
197   r0_pin <= r_sig; r1_pin <= r_sig; r2_pin <= r_sig;\r
198   g0_pin <= g_sig; g1_pin <= g_sig; g2_pin <= g_sig;\r
199   b0_pin <= b_sig; b1_pin <= b_sig;\r
200 \r
201 \r
202 -- make extra pin connections for debug signals\r
203   d_hsync          <= hsync_sig;       -- make duplicate of signal for debug connector\r
204   d_vsync          <= vsync_sig;       -- make duplicate of signal for debug connector\r
205   d_column_counter <= column_counter_sig;\r
206   d_line_counter   <= line_counter_sig;\r
207   d_h_enable       <= h_enable_sig;\r
208   d_v_enable       <= v_enable_sig;\r
209   d_r              <= r_sig;\r
210   d_g              <= g_sig;\r
211   d_b              <= b_sig;\r
212   d_state_clk      <= clk_pin;        -- make duplicate of signal for debug connector\r
213 \r
214   \r
215 end behav;\r
216 \r
217 -------------------------------------------------------------------------------\r
218 -- END ARCHITECTURE\r
219 -------------------------------------------------------------------------------\r