OpenCores
URL https://opencores.org/ocsvn/wb_vga/wb_vga/trunk

Subversion Repositories wb_vga

[/] [wb_vga/] [tags/] [a01/] [video_engine.vhd] - Blame information for rev 8

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 tantos
--
2
--  File: video_engine.vhd
3
--
4
--  (c) Copyright Andras Tantos <andras_tantos@yahoo.com> 2001/03/31
5
--  This code is distributed under the terms and conditions of the GNU General Public Lince.
6
--
7
 
8
library IEEE;
9
use IEEE.std_logic_1164.all;
10
 
11
library work;
12
use work.technology.all;
13
 
14
entity video_engine is
15
        generic (
16
                v_mem_width: positive := 16;
17
                v_addr_width: positive:= 20;
18
                fifo_size: positive := 256;
19
                dual_scan_fifo_size: positive := 256
20
        );
21
        port (
22
                clk: in std_logic;
23
                clk_en: in std_logic := '1';
24
                reset: in std_logic := '0';
25
 
26
                total: in std_logic_vector(v_addr_width-1 downto 0);   -- total video memory size in bytes 7..0
27
                fifo_treshold: in std_logic_vector(7 downto 0);        -- priority change threshold
28
                bpp: in std_logic_vector(1 downto 0);                  -- number of bits makes up a pixel valid values: 1,2,4,8
29
                multi_scan: in std_logic_vector(1 downto 0);           -- number of repeated scans
30
 
31
                hbs: in std_logic_vector(7 downto 0);
32
                hss: in std_logic_vector(7 downto 0);
33
                hse: in std_logic_vector(7 downto 0);
34
                htotal: in std_logic_vector(7 downto 0);
35
                vbs: in std_logic_vector(7 downto 0);
36
                vss: in std_logic_vector(7 downto 0);
37
                vse: in std_logic_vector(7 downto 0);
38
                vtotal: in std_logic_vector(7 downto 0);
39
 
40
                pps: in std_logic_vector(7 downto 0);
41
 
42
                high_prior: out std_logic;                      -- signals to the memory arbitrer to give high 
43
                                                                -- priority to the video engine
44
                v_mem_rd: out std_logic;                        -- video memory read request
45
                v_mem_rdy: in std_logic;                        -- video memory data ready
46
                v_mem_addr: out std_logic_vector (v_addr_width-1 downto 0); -- video memory address
47
                v_mem_data: in std_logic_vector (v_mem_width-1 downto 0);   -- video memory data
48
 
49
                h_sync: out std_logic;
50
                h_blank: out std_logic;
51
                v_sync: out std_logic;
52
                v_blank: out std_logic;
53
                h_tc: out std_logic;
54
                v_tc: out std_logic;
55
                blank: out std_logic;
56
                video_out: out std_logic_vector (7 downto 0)    -- video output binary signal (unused bits are forced to 0)
57
        );
58
end video_engine;
59
 
60
architecture video_engine of video_engine is
61
        component hv_sync
62
                port (
63
                        clk: in std_logic;
64
                        pix_clk_en: in std_logic := '1';
65
                        reset: in std_logic := '0';
66
 
67
                        hbs: in std_logic_vector(7 downto 0);
68
                        hss: in std_logic_vector(7 downto 0);
69
                        hse: in std_logic_vector(7 downto 0);
70
                        htotal: in std_logic_vector(7 downto 0);
71
                        vbs: in std_logic_vector(7 downto 0);
72
                        vss: in std_logic_vector(7 downto 0);
73
                        vse: in std_logic_vector(7 downto 0);
74
                        vtotal: in std_logic_vector(7 downto 0);
75
 
76
                        h_sync: out std_logic;
77
                        h_blank: out std_logic;
78
                        v_sync: out std_logic;
79
                        v_blank: out std_logic;
80
                        h_tc: out std_logic;
81
                        v_tc: out std_logic;
82
                        blank: out std_logic
83
                );
84
        end component;
85
 
86
        component mem_reader
87
                generic (
88
                        v_mem_width: positive := 16;
89
                        v_addr_width: positive:= 20;
90
                        fifo_size: positive := 256;
91
                        dual_scan_fifo_size: positive := 256
92
                );
93
                port (
94
                        clk: in std_logic;
95
                        clk_en: in std_logic;
96
                        pix_clk_en: in std_logic;
97
                        reset: in std_logic := '0';
98
 
99
                        total: in std_logic_vector(v_addr_width-1 downto 0);   -- total video memory size in bytes 7..0
100
                        fifo_treshold: in std_logic_vector(7 downto 0);        -- priority change threshold
101
                        bpp: in std_logic_vector(1 downto 0);                  -- number of bits makes up a pixel valid values: 1,2,4,8
102
                        multi_scan: in std_logic_vector(1 downto 0);           -- number of repeated scans
103
 
104
                        high_prior: out std_logic;                      -- signals to the memory arbitrer to give high 
105
                                                                        -- priority to the video engine
106
                        v_mem_rd: out std_logic;                        -- video memory read request
107
                        v_mem_rdy: in std_logic;                        -- video memory data ready
108
                        v_mem_addr: out std_logic_vector (v_addr_width-1 downto 0); -- video memory address
109
                        v_mem_data: in std_logic_vector (v_mem_width-1 downto 0);   -- video memory data
110
 
111
                        blank: in std_logic;                            -- video sync generator blank output
112
                        h_tc: in std_logic;                                                     -- horizontal sync pulse. Must be 1 clock wide!
113
                        video_out: out std_logic_vector (7 downto 0)    -- video output binary signal (unused bits are forced to 0)
114
                );
115
        end component;
116
 
117
        signal pix_clk_en: std_logic;
118
 
119
        signal i_h_sync: std_logic;
120
        signal i_h_blank: std_logic;
121
        signal i_v_sync: std_logic;
122
        signal i_v_blank: std_logic;
123
        signal i_h_tc: std_logic;
124
        signal i_v_tc: std_logic;
125
        signal i_blank: std_logic;
126
 
127
begin
128
        pps_gen: process is
129
                variable cnt: std_logic_vector(3 downto 0);
130
        begin
131
                wait until clk'EVENT and clk = '1';
132
                if (reset = '1') then
133
                        cnt := (others => '0');
134
                        pix_clk_en <= '0';
135
                else
136
                        if (clk_en = '0') then
137
                                pix_clk_en <= '0';
138
                        else
139
                                if (cnt = pps(3 downto 0)) then
140
                                        cnt := (others => '0');
141
                                        pix_clk_en <= '1';
142
                                else
143
                                        cnt := add_one(cnt);
144
                                        pix_clk_en <= '0';
145
                                end if;
146
                        end if;
147
                end if;
148
        end process;
149
 
150
        mem_engine : mem_reader
151
                generic map (
152
                        v_mem_width => v_mem_width,
153
                        v_addr_width => v_addr_width,
154
                        fifo_size => fifo_size,
155
                        dual_scan_fifo_size => dual_scan_fifo_size
156
                )
157
                port map (
158
                        clk => clk,
159
                        clk_en => clk_en,
160
                        pix_clk_en => pix_clk_en,
161
                        reset => reset,
162
                        total => total,
163
                        fifo_treshold => fifo_treshold,
164
                        bpp => bpp,
165
                        multi_scan => multi_scan,
166
                        high_prior => high_prior,
167
                        v_mem_rd => v_mem_rd,
168
                        v_mem_rdy => v_mem_rdy,
169
                        v_mem_addr => v_mem_addr,
170
                        v_mem_data => v_mem_data,
171
                        blank => i_blank,
172
                        h_tc => i_h_tc,
173
                        video_out => video_out
174
                );
175
 
176
        sync_engine : hv_sync
177
                port map (
178
                        clk => clk,
179
                        pix_clk_en => pix_clk_en,
180
                        reset => reset,
181
 
182
                        hbs => hbs,
183
                        hss => hss,
184
                        hse => hse,
185
                        htotal => htotal,
186
                        vbs => vbs,
187
                        vss => vss,
188
                        vse => vse,
189
                        vtotal => vtotal,
190
 
191
                        h_sync => i_h_sync,
192
                        h_blank => i_h_blank,
193
                        v_sync => i_v_sync,
194
                        v_blank => i_v_blank,
195
                        h_tc => i_h_tc,
196
                        v_tc => i_v_tc,
197
                        blank => i_blank
198
                );
199
 
200
  -- Delay all sync signals with one pixel. That's becouse of the syncron output of the mem_reader
201
  sync_delay: process is
202
  begin
203
    wait until (clk'EVENT and clk='1');
204
    if (reset = '1') then
205
                h_sync <= '0';
206
                h_blank <= '1';
207
                v_sync <= '0';
208
                v_blank <= '1';
209
        blank <= '1';
210
    elsif (pix_clk_en = '1') then
211
                h_sync <= i_h_sync;
212
                h_blank <= i_h_blank;
213
                v_sync <= i_v_sync;
214
                v_blank <= i_v_blank;
215
        blank <= i_blank;
216
      end if;
217
  end process;
218
 
219
        h_tc <= i_h_tc;
220
        v_tc <= i_v_tc;
221
 
222
end video_engine;
223
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.