init aus gzip
[dide_16.git] / bsp2 / 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       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
78       );\r
79   end component;\r
80 \r
81 \r
82   component board_driver\r
83     port (\r
84        reset : in  std_logic;\r
85       seven_seg  : out std_logic_vector(2*SEG_WIDTH-1 downto 0));\r
86   end component;\r
87 \r
88 \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
96   \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
103 \r
104 \r
105 -------------------------------------------------------------------------------\r
106 -- prolong duration of reset to prevent glitches  at power-up\r
107 -------------------------------------------------------------------------------\r
108 \r
109 begin\r
110 \r
111   DELAY_RESET_syn : process(clk_pin)            -- synchronous capture\r
112   begin\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
115     end if;\r
116   end process;\r
117 \r
118   DELAY_RESET_next : process(dly_counter, reset_pin)    -- next state logic\r
119   begin\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
124     else \r
125       dly_counter_next <= dly_counter;       -- freeze dly counter when oflo\r
126     end if;\r
127   end process;\r
128   \r
129   DELAY_RESET_out: process(dly_counter)\r
130   begin\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
135     end if;\r
136   end process;\r
137 \r
138 \r
139 \r
140   COMBINE_RESET: process(reset_pin, reset_dly)         -- generate "safe" reset signal\r
141   begin\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
144     else\r
145       safe_reset <= not(RES_ACT);\r
146     end if;\r
147   end process;\r
148 \r
149 \r
150 -------------------------------------------------------------------------------\r
151 -- instantiate the components and connect to internal and external signals\r
152 -------------------------------------------------------------------------------\r
153 \r
154 \r
155 board_driver_unit : board_driver\r
156     port map (\r
157       reset       => safe_reset,\r
158       seven_seg   => seven_seg_pin);\r
159 \r
160 \r
161 vga_driver_unit : vga_driver\r
162     port map (\r
163       clk                => clk_pin,\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
179 \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
184 \r
185 \r
186   vga_control_unit : vga_control\r
187     port map (\r
188       clk            => clk_pin,\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
196       r              => r_sig,\r
197       g              => g_sig,\r
198       b              => b_sig);\r
199 \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
204 \r
205 \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
213   d_r              <= r_sig;\r
214   d_g              <= g_sig;\r
215   d_b              <= b_sig;\r
216   d_state_clk      <= clk_pin;        -- make duplicate of signal for debug connector\r
217 \r
218   \r
219 end behav;\r
220 \r
221 -------------------------------------------------------------------------------\r
222 -- END ARCHITECTURE\r
223 -------------------------------------------------------------------------------\r