Rev 668 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
668 | lvd | 1 | // ZX-Evo Base Configuration (c) NedoPC 2008,2009,2010,2011,2012,2013,2014 |
2 | // |
||
3 | // generates vertical blank, sync and window. |
||
134 | ddp | 4 | |
668 | lvd | 5 | /* |
6 | This file is part of ZX-Evo Base Configuration firmware. |
||
7 | |||
8 | ZX-Evo Base Configuration firmware is free software: |
||
9 | you can redistribute it and/or modify it under the terms of |
||
10 | the GNU General Public License as published by |
||
11 | the Free Software Foundation, either version 3 of the License, or |
||
12 | (at your option) any later version. |
||
13 | |||
14 | ZX-Evo Base Configuration firmware is distributed in the hope that |
||
15 | it will be useful, but WITHOUT ANY WARRANTY; without even |
||
16 | the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
||
17 | See the GNU General Public License for more details. |
||
18 | |||
19 | You should have received a copy of the GNU General Public License |
||
20 | along with ZX-Evo Base Configuration firmware. |
||
21 | If not, see <http://www.gnu.org/licenses/>. |
||
22 | */ |
||
23 | |||
24 | |||
25 | // H is period of horizontal sync; |
||
134 | ddp | 26 | // from the last non-blanked line: |
27 | // 3H is pre-blank, |
||
28 | // 2.xxH is vertical sync (slightly more than 2H, all hsync edges preserved) |
||
29 | // vblank is total of 25H |
||
30 | |||
668 | lvd | 31 | `include "../include/tune.v" |
32 | |||
317 | lvd | 33 | module video_sync_v( |
134 | ddp | 34 | |
282 | lvd | 35 | input wire clk, |
134 | ddp | 36 | |
282 | lvd | 37 | input wire hsync_start, // synchronizing signal |
38 | input wire line_start, // to end vsync some time after hsync has ended |
||
134 | ddp | 39 | |
282 | lvd | 40 | input wire hint_start, |
134 | ddp | 41 | |
42 | |||
43 | |||
282 | lvd | 44 | // atm video mode input |
45 | input wire mode_atm_n_pent, |
||
134 | ddp | 46 | |
684 | lvd | 47 | input wire [ 1:0] modes_raster, |
282 | lvd | 48 | |
49 | |||
50 | output reg vblank, |
||
51 | output reg vsync, |
||
52 | |||
53 | output reg int_start, // one-shot positive pulse marking beginning of INT for Z80 |
||
54 | |||
55 | output reg vpix // vertical picture marker: active when there is line with pixels in it, not just a border. changes with hsync edge |
||
134 | ddp | 56 | ); |
57 | |||
58 | |||
59 | |||
60 | |||
61 | |||
62 | localparam VBLNK_BEG = 9'd00; |
||
63 | |||
684 | lvd | 64 | localparam VSYNC_BEG_50HZ = 9'd08; |
65 | localparam VSYNC_END_50HZ = 9'd11; |
||
66 | localparam VBLNK_END_50HZ = 9'd32; |
||
67 | |||
68 | localparam VSYNC_BEG_60HZ = 9'd04; |
||
69 | localparam VSYNC_END_60HZ = 9'd07; |
||
70 | localparam VBLNK_END_60HZ = 9'd22; |
||
134 | ddp | 71 | |
684 | lvd | 72 | |
73 | /* // pentagon (x192) |
||
608 | ddp | 74 | localparam VPIX_BEG_PENT = 9'd080; |
75 | localparam VPIX_END_PENT = 9'd272; |
||
134 | ddp | 76 | |
282 | lvd | 77 | // ATM (x200) |
608 | ddp | 78 | localparam VPIX_BEG_ATM = 9'd076; |
79 | localparam VPIX_END_ATM = 9'd276; |
||
684 | lvd | 80 | */ |
282 | lvd | 81 | |
684 | lvd | 82 | localparam VPIX_BEG_PENTAGON = 9'd076; // for pentagon raster: actual begin is for x200 s, add 4 for x192 modes |
83 | localparam VPIX_END_PENTAGON = 9'd272; // actual end is for x192 modes, add 4 for x200 modes. |
||
134 | ddp | 84 | |
684 | lvd | 85 | localparam VPIX_BEG_60HZ = 9'd042; |
86 | localparam VPIX_END_60HZ = 9'd238; |
||
87 | |||
88 | localparam VPIX_BEG_48K = 9'd060; |
||
89 | localparam VPIX_END_48K = 9'd256; |
||
90 | |||
91 | localparam VPIX_BEG_128K = 9'd059; |
||
92 | localparam VPIX_END_128K = 9'd255; |
||
93 | |||
94 | /* // ntsc |
||
608 | ddp | 95 | // pentagon (x192) |
96 | localparam VPIX60_BEG_PENT = 9'd046; |
||
97 | localparam VPIX60_END_PENT = 9'd238; |
||
98 | // ATM (x200) |
||
99 | localparam VPIX60_BEG_ATM = 9'd042; |
||
100 | localparam VPIX60_END_ATM = 9'd242; |
||
684 | lvd | 101 | */ // |
134 | ddp | 102 | |
684 | lvd | 103 | localparam VPERIOD_PENTAGON = 9'd320; |
104 | localparam VPERIOD_60HZ = 9'd262; |
||
105 | localparam VPERIOD_48K = 9'd312; |
||
106 | localparam VPERIOD_128K = 9'd311; |
||
107 | |||
108 | |||
109 | localparam INT_BEG = 9'd0; |
||
110 | localparam INT_BEG_48K = 9'd1; |
||
111 | localparam INT_BEG_128K = 9'd1; |
||
112 | |||
113 | |||
114 | |||
134 | ddp | 115 | reg [8:0] vcount; |
116 | |||
684 | lvd | 117 | reg [8:0] vperiod; |
118 | reg [8:0] vpix_beg; |
||
119 | reg [8:0] vpix_end; |
||
134 | ddp | 120 | |
121 | |||
122 | |||
684 | lvd | 123 | initial // for simulation only |
134 | ddp | 124 | begin |
125 | vcount = 9'd0; |
||
126 | vsync = 1'b0; |
||
127 | vblank = 1'b0; |
||
128 | vpix = 1'b0; |
||
129 | int_start = 1'b0; |
||
684 | lvd | 130 | vperiod = 'd0; |
131 | vpix_beg = 'd0; |
||
132 | vpix_end = 'd0; |
||
134 | ddp | 133 | end |
134 | |||
684 | lvd | 135 | always @(posedge clk) |
136 | case( modes_raster ) |
||
137 | default: vperiod <= VPERIOD_PENTAGON - 9'd1; |
||
138 | 2'b01: vperiod <= VPERIOD_60HZ - 9'd1; |
||
139 | 2'b10: vperiod <= VPERIOD_48K - 9'd1; |
||
140 | 2'b11: vperiod <= VPERIOD_128K - 9'd1; |
||
141 | endcase |
||
142 | |||
143 | always @(posedge clk) |
||
144 | case( modes_raster ) |
||
145 | default: vpix_beg <= VPIX_BEG_PENTAGON; |
||
146 | 2'b01: vpix_beg <= VPIX_BEG_60HZ ; |
||
147 | 2'b10: vpix_beg <= VPIX_BEG_48K ; |
||
148 | 2'b11: vpix_beg <= VPIX_BEG_128K ; |
||
149 | endcase |
||
150 | |||
151 | always @(posedge clk) |
||
152 | case( modes_raster ) |
||
153 | default: vpix_end <= VPIX_END_PENTAGON; |
||
154 | 2'b01: vpix_end <= VPIX_END_60HZ ; |
||
155 | 2'b10: vpix_end <= VPIX_END_48K ; |
||
156 | 2'b11: vpix_end <= VPIX_END_128K ; |
||
157 | endcase |
||
158 | |||
159 | |||
134 | ddp | 160 | always @(posedge clk) if( hsync_start ) |
161 | begin |
||
684 | lvd | 162 | if( vcount==vperiod ) |
608 | ddp | 163 | begin |
134 | ddp | 164 | vcount <= 9'd0; |
608 | ddp | 165 | end |
134 | ddp | 166 | else |
167 | vcount <= vcount + 9'd1; |
||
168 | end |
||
169 | |||
170 | |||
171 | |||
172 | always @(posedge clk) if( hsync_start ) |
||
173 | begin |
||
174 | if( vcount==VBLNK_BEG ) |
||
175 | vblank <= 1'b1; |
||
684 | lvd | 176 | else if( vcount==( (modes_raster==2'b01) ? VBLNK_END_60HZ : VBLNK_END_50HZ ) ) |
134 | ddp | 177 | vblank <= 1'b0; |
178 | end |
||
179 | |||
180 | |||
181 | always @(posedge clk) |
||
182 | begin |
||
684 | lvd | 183 | if( vcount==( modes_raster==2'b01 ? VSYNC_BEG_60HZ : VSYNC_BEG_50HZ ) && hsync_start ) |
134 | ddp | 184 | vsync <= 1'b1; |
684 | lvd | 185 | else if( vcount==( modes_raster==2'b01 ? VSYNC_END_60HZ : VSYNC_END_50HZ ) && line_start ) |
134 | ddp | 186 | vsync <= 1'b0; |
187 | end |
||
188 | |||
189 | |||
190 | always @(posedge clk) |
||
191 | begin |
||
684 | lvd | 192 | //if( hint_start && vcount==( modes_raster[1] ? (modes_raster[0] ? INT_BEG_128K : INT_BEG_48K) : INT_BEG ) ) |
193 | if( hint_start && vcount==( modes_raster[1] ? (modes_raster[0] ? INT_BEG_128K : INT_BEG_48K) : INT_BEG ) ) |
||
134 | ddp | 194 | int_start <= 1'b1; |
195 | else |
||
196 | int_start <= 1'b0; |
||
197 | end |
||
198 | |||
199 | |||
200 | |||
201 | always @(posedge clk) if( hsync_start ) |
||
202 | begin |
||
684 | lvd | 203 | if( vcount==(vpix_beg + (9'd4 & {9{~mode_atm_n_pent}})) ) |
134 | ddp | 204 | vpix <= 1'b1; |
684 | lvd | 205 | else if( vcount==(vpix_end + (9'd4 & {9{mode_atm_n_pent}})) ) |
134 | ddp | 206 | vpix <= 1'b0; |
207 | end |
||
208 | |||
209 | |||
210 | endmodule |
||
211 |