Rev 411 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
255 | ddp | 1 | module main( |
2 | |||
380 | ddp | 3 | // clocks |
4 | input fclk, |
||
5 | output clkz_out, |
||
6 | input clkz_in, |
||
255 | ddp | 7 | |
380 | ddp | 8 | // z80 |
9 | input iorq_n, |
||
10 | input mreq_n, |
||
11 | input rd_n, |
||
12 | input wr_n, |
||
13 | input m1_n, |
||
14 | input rfsh_n, |
||
15 | input int_n, |
||
16 | input nmi_n, |
||
17 | input wait_n, |
||
18 | output res, |
||
255 | ddp | 19 | |
380 | ddp | 20 | inout [7:0] d, |
21 | output [15:0] a, |
||
255 | ddp | 22 | |
380 | ddp | 23 | // zxbus and related |
24 | output csrom, |
||
25 | output romoe_n, |
||
26 | output romwe_n, |
||
255 | ddp | 27 | |
380 | ddp | 28 | output rompg0_n, |
29 | output dos_n, // aka rompg1 |
||
30 | output rompg2, |
||
31 | output rompg3, |
||
32 | output rompg4, |
||
255 | ddp | 33 | |
380 | ddp | 34 | input iorqge1, |
35 | input iorqge2, |
||
36 | output iorq1_n, |
||
37 | output iorq2_n, |
||
255 | ddp | 38 | |
380 | ddp | 39 | // DRAM |
40 | inout [15:0] rd, |
||
41 | output [9:0] ra, |
||
42 | output rwe_n, |
||
43 | output rucas_n, |
||
44 | output rlcas_n, |
||
45 | output rras0_n, |
||
46 | output rras1_n, |
||
255 | ddp | 47 | |
380 | ddp | 48 | // video |
49 | output [1:0] vred, |
||
50 | output [1:0] vgrn, |
||
51 | output [1:0] vblu, |
||
255 | ddp | 52 | |
380 | ddp | 53 | output vhsync, |
54 | output vvsync, |
||
55 | output vcsync, |
||
255 | ddp | 56 | |
380 | ddp | 57 | // AY control and audio/tape |
58 | input ay_clk, |
||
59 | output ay_bdir, |
||
60 | output ay_bc1, |
||
255 | ddp | 61 | |
380 | ddp | 62 | output reg beep, |
255 | ddp | 63 | |
380 | ddp | 64 | // IDE |
65 | input [2:0] ide_a, |
||
66 | input [15:0] ide_d, |
||
255 | ddp | 67 | |
380 | ddp | 68 | output ide_dir, |
255 | ddp | 69 | |
380 | ddp | 70 | input ide_rdy, |
255 | ddp | 71 | |
380 | ddp | 72 | output ide_cs0_n, |
73 | output ide_cs1_n, |
||
74 | output ide_rs_n, |
||
75 | output ide_rd_n, |
||
76 | output ide_wr_n, |
||
255 | ddp | 77 | |
380 | ddp | 78 | // VG93 and diskdrive |
79 | output reg vg_clk, |
||
255 | ddp | 80 | |
380 | ddp | 81 | output vg_cs_n, |
82 | output vg_res_n, |
||
255 | ddp | 83 | |
380 | ddp | 84 | input vg_hrdy, |
85 | input vg_rclk, |
||
86 | input vg_rawr, |
||
87 | input [1:0] vg_a, // disk drive selection |
||
88 | input vg_wrd, |
||
89 | input vg_side, |
||
255 | ddp | 90 | |
380 | ddp | 91 | input step, |
92 | input vg_sl, |
||
93 | input vg_sr, |
||
94 | input vg_tr43, |
||
95 | input rdat_b_n, |
||
96 | input vg_wf_de, |
||
97 | input vg_drq, |
||
98 | input vg_irq, |
||
99 | input vg_wd, |
||
255 | ddp | 100 | |
380 | ddp | 101 | // serial links (atmega-fpga, sdcard) |
102 | output sdcs_n, |
||
103 | output sddo, |
||
104 | output sdclk, |
||
105 | input sddi, |
||
255 | ddp | 106 | |
380 | ddp | 107 | input spics_n, |
108 | input spick, |
||
109 | input spido, |
||
110 | output spidi, |
||
111 | output reg spiint_n |
||
112 | |||
255 | ddp | 113 | ); |
114 | |||
115 | //--Dummy---------------------------------------------------------------------- |
||
116 | |||
380 | ddp | 117 | assign iorq1_n = 1'b1; |
118 | assign iorq2_n = 1'b1; |
||
255 | ddp | 119 | |
380 | ddp | 120 | assign res = 1'b1; |
255 | ddp | 121 | |
380 | ddp | 122 | assign ay_bdir = 1'b0; |
123 | assign ay_bc1 = 1'b0; |
||
255 | ddp | 124 | |
380 | ddp | 125 | assign vg_cs_n = 1'b1; |
126 | assign vg_res_n = 1'b0; |
||
255 | ddp | 127 | |
380 | ddp | 128 | assign ide_dir = 1'b1; |
129 | assign ide_rs_n = 1'b0; |
||
130 | assign ide_cs0_n = 1'b1; |
||
131 | assign ide_cs1_n = 1'b1; |
||
132 | assign ide_rd_n = 1'b1; |
||
133 | assign ide_wr_n = 1'b1; |
||
255 | ddp | 134 | |
380 | ddp | 135 | assign a[15:14] = 2'b00; |
255 | ddp | 136 | |
137 | //--INT--------------------------------------------------------------------------- |
||
138 | |||
139 | reg enable_covox_int; initial enable_covox_int = 1'b0; |
||
140 | reg enable_frame_int; initial enable_frame_int = 1'b0; |
||
141 | |||
142 | always @(posedge fclk) |
||
143 | begin |
||
144 | if ( enable_covox_int ) |
||
380 | ddp | 145 | spiint_n <= cvx_ptr_diff[3]|main_osc[7]; |
255 | ddp | 146 | else if ( enable_frame_int ) |
380 | ddp | 147 | spiint_n <= vtxtscr; |
255 | ddp | 148 | else |
149 | spiint_n <= 1'b1; |
||
150 | end |
||
151 | |||
152 | //--clocks--Z80_clk--VG_clk--COVOX--------------------------------------------- |
||
153 | |||
154 | reg [9:0] main_osc; |
||
155 | reg [2:0] vgclk_div7; |
||
380 | ddp | 156 | reg [7:0] covox [15:0]; initial covox[0] = 8'h7f; |
157 | reg [8:0] qe; initial qe = 9'h0ff; |
||
158 | reg [3:0] cvx_ptr_out; initial cvx_ptr_out = 4'd0; |
||
159 | reg [3:0] cvx_ptr_in; initial cvx_ptr_in = 4'd0; |
||
160 | wire [3:0] cvx_ptr_iinc; |
||
161 | wire [3:0] cvx_ptr_diff; |
||
162 | assign cvx_ptr_iinc = cvx_ptr_in + 4'd1; |
||
163 | assign cvx_ptr_diff = cvx_ptr_in - cvx_ptr_out; |
||
255 | ddp | 164 | |
165 | always @(posedge fclk) |
||
166 | begin |
||
167 | // |
||
380 | ddp | 168 | if ( { 1'b1, covox[cvx_ptr_out] } >= qe ) |
169 | begin |
||
170 | beep <= 1'b1; |
||
171 | qe <= 9'h1ff - { 1'b1, covox[cvx_ptr_out] } + qe; |
||
172 | end |
||
255 | ddp | 173 | else |
380 | ddp | 174 | begin |
175 | beep <= 1'b0; |
||
176 | qe <= 9'h000 - { 1'b1, covox[cvx_ptr_out] } + qe; |
||
177 | end |
||
255 | ddp | 178 | // |
380 | ddp | 179 | if ( main_osc[7:0] == 8'hff ) |
180 | begin |
||
181 | if ( cvx_ptr_in !== cvx_ptr_out ) |
||
182 | cvx_ptr_out <= cvx_ptr_out + 4'd1; |
||
183 | end |
||
255 | ddp | 184 | // |
185 | if ( main_osc[1:0]==2'b00 ) |
||
186 | begin |
||
187 | if ( vgclk_div7[2:1] == 2'b11 ) |
||
188 | begin |
||
189 | vgclk_div7 <= 3'd0; |
||
190 | vg_clk <= ~vg_clk; |
||
191 | end |
||
192 | else |
||
193 | vgclk_div7 <= vgclk_div7 + 3'd1; |
||
194 | end |
||
195 | // |
||
380 | ddp | 196 | main_osc <= main_osc + 10'd1; |
197 | // |
||
255 | ddp | 198 | end |
199 | |||
200 | assign clkz_out = main_osc[2]; // 3.5 MHz |
||
201 | |||
202 | //--Video---------------------------------------------------------------------- |
||
203 | // character image - 6x8 |
||
204 | // character size - 6x10 |
||
205 | // col x row - 53x25 (318x250) |
||
380 | ddp | 206 | // fullscreen test - 360x288 |
255 | ddp | 207 | |
380 | ddp | 208 | localparam HTXTS_END = 9'd416; |
209 | localparam CSYNC_CUT = 9'd415; |
||
498 | ddp | 210 | localparam CSYNC_CUT2 = 9'd394; // 9'd395; // 9'd382; |
380 | ddp | 211 | localparam HSYNC_BEG = 9'd0; |
498 | ddp | 212 | localparam HSYNC_BEG2 = 9'd447; |
380 | ddp | 213 | localparam HSYNC_END = 9'd33; |
498 | ddp | 214 | localparam HSYNC_END2 = 9'd52; // 9'd53; |
380 | ddp | 215 | localparam HTXTS_BEG = 9'd98; |
216 | localparam HMAX = 9'd447; |
||
255 | ddp | 217 | |
380 | ddp | 218 | localparam VTXTS_END = 9'd293; |
219 | localparam VSYNC_BEG = 9'd0; |
||
220 | localparam VSYNC_END = 9'd2; |
||
221 | localparam VTXTS_BEG = 9'd43; |
||
222 | localparam VMAX = 9'd319; |
||
255 | ddp | 223 | |
380 | ddp | 224 | localparam HBORD_BEG = 9'd77; |
225 | localparam HBORD_END = 9'd437; |
||
226 | localparam VBORD_BEG = 9'd24; |
||
227 | localparam VBORD_END = 9'd312; |
||
255 | ddp | 228 | |
380 | ddp | 229 | // GgRrBb |
230 | localparam BLACK = 6'b000000; |
||
231 | localparam GRAY_1 = 6'b010101; |
||
232 | localparam GRAY_2 = 6'b101010; |
||
233 | localparam WHITE = 6'b111111; |
||
234 | |||
235 | localparam BLUE_3 = 6'b000011; |
||
236 | localparam RED_3 = 6'b001100; |
||
237 | localparam MAGENTA_3 = 6'b001111; |
||
238 | localparam GREEN_3 = 6'b110000; |
||
239 | localparam CYAN_3 = 6'b110011; |
||
240 | localparam YELLOW_3 = 6'b111100; |
||
241 | |||
242 | localparam BLUE_2 = 6'b000010; |
||
243 | localparam RED_2 = 6'b001000; |
||
244 | localparam MAGENTA_2 = 6'b001010; |
||
245 | localparam GREEN_2 = 6'b100000; |
||
246 | localparam CYAN_2 = 6'b100010; |
||
247 | localparam YELLOW_2 = 6'b101000; |
||
248 | |||
249 | localparam BLUE_H = 6'b010110; |
||
250 | localparam RED_H = 6'b011001; |
||
251 | localparam MAGENTA_H = 6'b011010; |
||
252 | localparam GREEN_H = 6'b100101; |
||
253 | localparam CYAN_H = 6'b100110; |
||
254 | localparam YELLOW_H = 6'b101001; |
||
255 | |||
255 | ddp | 256 | reg [8:0] hcount; initial hcount = 9'd0; |
257 | reg [2:0] pixptr; |
||
258 | reg [8:0] vcount; initial vcount = 9'd0; |
||
259 | reg [5:0] hcharcount; |
||
260 | wire [2:0] vcharline; |
||
261 | reg [10:0] voffset; |
||
262 | reg [3:0] vcharlinecount; |
||
263 | reg hsync; initial hsync = 1'b1; |
||
380 | ddp | 264 | reg htxtscr; initial htxtscr = 1'b0; |
255 | ddp | 265 | reg vsync; initial vsync = 1'b1; |
380 | ddp | 266 | reg vtxtscr; initial vtxtscr = 1'b0; |
255 | ddp | 267 | reg csync; initial csync = 1'b1; |
268 | wire [10:0] video_addr; |
||
269 | wire [7:0] charcode0, charcode1, charcode2; |
||
270 | wire [7:0] charcode; |
||
271 | wire [7:0] attrcode0, attrcode1, attrcode2; |
||
272 | wire [7:0] attrcode; |
||
273 | wire [5:0] charpix; |
||
274 | wire pixel; |
||
380 | ddp | 275 | wire [5:0] fcolor, bcolor, image_color; |
276 | reg [5:0] color; |
||
255 | ddp | 277 | wire fontenable; |
278 | reg [8:0] hmouse, vmouse; |
||
279 | wire mouse_here, mouse_i, mouse_image, mouse_m, mouse_mask; |
||
280 | reg vgaff, nextline; |
||
380 | ddp | 281 | reg hbord; initial hbord = 1'b0; |
282 | reg vbord; initial vbord = 1'b0; |
||
283 | reg circle; initial circle = 1'b0; |
||
284 | reg uhole; initial uhole = 1'b0; |
||
285 | reg hhole; initial hhole = 1'b0; |
||
286 | reg vhole; initial vhole = 1'b0; |
||
287 | reg [1:0] bcdir; initial bcdir = 2'b00; |
||
288 | reg [1:0] scdir; initial scdir = 2'b00; |
||
289 | reg [3:0] hsetka, vsetka; |
||
290 | reg [4:0] hchess, vchess; |
||
291 | reg [1:0] hchss3; |
||
292 | reg [2:0] cband; |
||
293 | reg [6:0] bccount; |
||
294 | reg [4:0] sccount; |
||
295 | reg [6:0] schcnt; |
||
296 | wire [6:0] cb_val; |
||
297 | wire [4:0] cs_val; |
||
298 | reg [2:0] clr3; |
||
255 | ddp | 299 | |
380 | ddp | 300 | |
255 | ddp | 301 | always @(posedge fclk) |
302 | begin |
||
303 | // |
||
304 | if ( {(main_osc[1]&scr_tv_mode),main_osc[0]}==2'h0 ) |
||
305 | begin |
||
306 | |||
380 | ddp | 307 | if ( scr_mode==2'h0 ) |
308 | color <= (htxtscr & vtxtscr) ? ( (mouse_image) ? ~image_color : image_color ) : BLACK; |
||
309 | else if ( hbord & vbord ) |
||
310 | case ( scr_mode ) |
||
311 | 3'h2: |
||
312 | color <= (hchess[0]^vchess[0]) ? WHITE : BLACK; |
||
313 | 3'h3: |
||
314 | case (vchess) |
||
315 | 5'd0, 5'd19: |
||
316 | if (vsetka==5'd14) |
||
317 | color <= GRAY_2; |
||
318 | else if (hchess[0]) |
||
319 | color <= WHITE; |
||
320 | else |
||
321 | color <= BLACK; |
||
322 | 5'd5, 5'd6: |
||
323 | case (cband) |
||
324 | 3'd0: color <= GRAY_2; |
||
325 | 3'd1: color <= YELLOW_H; |
||
326 | 3'd2: color <= CYAN_H; |
||
327 | 3'd3: color <= GREEN_H; |
||
328 | 3'd4: color <= MAGENTA_H; |
||
329 | 3'd5: color <= RED_H; |
||
330 | 3'd6: color <= BLUE_H; |
||
331 | 3'd7: color <= GRAY_1; |
||
332 | endcase |
||
333 | 5'd13, 5'd14: |
||
334 | case (cband) |
||
335 | 3'd0: color <= GRAY_2; |
||
336 | 3'd1: color <= YELLOW_2; |
||
337 | 3'd2: color <= CYAN_2; |
||
338 | 3'd3: color <= GREEN_2; |
||
339 | 3'd4: color <= MAGENTA_2; |
||
340 | 3'd5: color <= RED_2; |
||
341 | 3'd6: color <= BLUE_2; |
||
342 | 3'd7: color <= BLACK; |
||
343 | endcase |
||
344 | default |
||
345 | begin |
||
346 | if (uhole) |
||
347 | begin |
||
348 | if (pixel) |
||
349 | color <= GRAY_2; |
||
350 | else |
||
351 | color <= GRAY_1; |
||
352 | end |
||
353 | else if ( (circle) && !(hhole&vhole) ) |
||
354 | case (vchess) |
||
355 | 5'd2, 5'd17: |
||
356 | if ( (hchess==5'd2) || (hchess==5'd3) || (hchess==5'd20) || (hchess==5'd21) ) |
||
357 | begin |
||
358 | if (hcount[0]) |
||
359 | color <= GRAY_2; |
||
360 | else |
||
361 | color <= GRAY_1; |
||
362 | end |
||
363 | else |
||
364 | color <= GRAY_2; |
||
365 | 5'd3: |
||
366 | if ( (hchess==5'd2) || ((hchess==5'd3) && (hsetka!=5'd14)) |
||
367 | || (hchess==5'd20) || ((hchess==5'd21) && (hsetka!=5'd14)) ) |
||
368 | begin |
||
369 | if (hcount[0]^vcount[0]) |
||
370 | color <= GRAY_1; |
||
371 | else |
||
372 | color <= GRAY_2; |
||
373 | end |
||
374 | else |
||
375 | color <= GRAY_2; |
||
376 | 5'd7: |
||
377 | case (cband) |
||
378 | //3'd0: color <= WHITE; |
||
379 | 3'd1: color <= WHITE; |
||
380 | 3'd2: color <= BLACK; |
||
381 | 3'd3: color <= GRAY_1; |
||
382 | 3'd4: color <= GRAY_2; |
||
383 | 3'd5: color <= WHITE; |
||
384 | 3'd6: color <= BLACK; |
||
385 | //3'd7: color <= BLACK; |
||
386 | endcase |
||
387 | 5'd8: |
||
388 | if (hcount[3]) |
||
389 | color <= MAGENTA_H; |
||
390 | else |
||
391 | color <= GREEN_H; |
||
392 | 5'd9, 5'd10: |
||
393 | if ( (hcount[8]) ^ (vchess[0]) ^ ( (hchess==5'd4) && (hsetka==4'd14) ) ) |
||
394 | color <= GRAY_2; |
||
395 | else |
||
396 | color <= BLACK; |
||
397 | 5'd11: |
||
398 | if (hcount[3]) |
||
399 | color <= RED_H; |
||
400 | else |
||
401 | color <= CYAN_H; |
||
402 | 5'd12: |
||
403 | if (hcount[0]) |
||
498 | ddp | 404 | color <= GRAY_2; |
405 | else |
||
380 | ddp | 406 | color <= GRAY_1; |
407 | 5'd15: |
||
408 | if ( (hchess[0]) && (schcnt==6'd63) ) |
||
409 | color <= BLACK; |
||
410 | else |
||
411 | color <= GRAY_2; |
||
412 | 5'd16: |
||
413 | if ( (hchess==5'd2) || ((hchess==5'd3) &&(hsetka!=4'd14)) |
||
414 | || (hchess==5'd20) || ((hchess==5'd21)&&(hsetka!=4'd14)) ) |
||
415 | begin |
||
416 | if (hcount[0]^vcount[0]) |
||
417 | color <= GRAY_2; |
||
418 | else |
||
419 | color <= GRAY_1; |
||
420 | end |
||
421 | else |
||
422 | color <= GRAY_2; |
||
423 | default: |
||
424 | color <= GRAY_2; |
||
425 | endcase |
||
426 | else |
||
427 | color <= ( (hsetka==4'd14) || (vsetka==4'd14) ) ? GRAY_2 : GRAY_1; |
||
428 | end |
||
429 | endcase |
||
430 | 3'h4: case (cband) |
||
431 | 3'd0: color <= GRAY_2; |
||
432 | 3'd1: color <= YELLOW_2; |
||
433 | 3'd2: color <= CYAN_2; |
||
434 | 3'd3: color <= GREEN_2; |
||
435 | 3'd4: color <= MAGENTA_2; |
||
436 | 3'd5: color <= RED_2; |
||
437 | 3'd6: color <= BLUE_2; |
||
438 | 3'd7: color <= BLACK; |
||
439 | endcase |
||
440 | 3'h5: if (vchess[4]==1'b0) |
||
441 | begin |
||
442 | if (vchess!=5'd15) |
||
443 | case (cband) |
||
444 | 3'd0: color <= GRAY_2; |
||
445 | 3'd1: color <= YELLOW_2; |
||
446 | 3'd2: color <= CYAN_2; |
||
447 | 3'd3: color <= GREEN_2; |
||
448 | 3'd4: color <= MAGENTA_2; |
||
449 | 3'd5: color <= RED_2; |
||
450 | 3'd6: color <= BLUE_2; |
||
451 | 3'd7: color <= BLACK; |
||
452 | endcase |
||
453 | else |
||
454 | case (cband) |
||
455 | 3'd0: color <= BLUE_2; |
||
456 | 3'd1: color <= BLACK; |
||
457 | 3'd2: color <= MAGENTA_2; |
||
458 | 3'd3: color <= BLACK; |
||
459 | 3'd4: color <= CYAN_2; |
||
460 | 3'd5: color <= BLACK; |
||
461 | 3'd6: color <= GRAY_2; |
||
462 | 3'd7: color <= BLACK; |
||
463 | endcase |
||
464 | end |
||
465 | else |
||
466 | case (cband) |
||
467 | 3'd0: color <= WHITE; |
||
468 | 3'd1: color <= YELLOW_2; |
||
469 | 3'd2: color <= CYAN_2; |
||
470 | 3'd3: color <= GREEN_2; |
||
471 | 3'd4: color <= MAGENTA_2; |
||
472 | 3'd5: color <= RED_2; |
||
473 | 3'd6: color <= BLUE_2; |
||
474 | 3'd7: color <= BLACK; |
||
475 | endcase |
||
476 | 3'h6: begin |
||
477 | if ( (vcount[2:0]==3'd4) || (hcount[2:0]==3'd1) ) |
||
478 | begin |
||
479 | color[0] <= clr3[0]; |
||
480 | color[1] <= clr3[0]; |
||
481 | color[2] <= clr3[1]; |
||
482 | color[3] <= clr3[1]; |
||
483 | color[4] <= clr3[2]; |
||
484 | color[5] <= clr3[2]; |
||
485 | end |
||
486 | else |
||
487 | color <= BLACK; |
||
488 | end |
||
489 | default: color <= (hcount[0]^vcount[0]) ? WHITE : BLACK; |
||
490 | endcase |
||
491 | else |
||
492 | color <= BLACK; |
||
493 | |||
494 | hmouse <= hcount - scr_mouse_x; |
||
495 | |||
496 | if ( ~htxtscr ) |
||
255 | ddp | 497 | begin |
498 | hcharcount <= 6'h00; |
||
499 | pixptr <= 3'd0; |
||
500 | end |
||
501 | else |
||
502 | begin |
||
503 | if ( pixptr==3'd5 ) |
||
504 | begin |
||
505 | pixptr <= 3'd0; |
||
506 | hcharcount <= hcharcount + 6'h01; |
||
507 | end |
||
508 | else |
||
509 | pixptr <= pixptr + 3'd1; |
||
510 | end |
||
511 | |||
512 | if ( hcount==HMAX ) |
||
513 | hcount <= 9'd0; |
||
514 | else |
||
515 | hcount <= hcount + 9'd1; |
||
516 | |||
380 | ddp | 517 | if ( hcount==HTXTS_END ) |
518 | htxtscr <= 1'b0; |
||
519 | else if ( hcount==HTXTS_BEG ) |
||
520 | htxtscr <= 1'b1; |
||
255 | ddp | 521 | |
522 | if ( hcount==HSYNC_BEG ) |
||
523 | begin |
||
498 | ddp | 524 | if ( scr_tv_mode ) hsync <= 1'b1; |
255 | ddp | 525 | vgaff <= scr_tv_mode | ~vgaff; |
526 | if ( vgaff ) |
||
527 | begin |
||
498 | ddp | 528 | if ( scr_tv_mode ) csync <= 1'b1; |
255 | ddp | 529 | nextline <= 1'b1; |
530 | end |
||
531 | end |
||
532 | |||
498 | ddp | 533 | if ( (~scr_tv_mode) && (hcount==HSYNC_BEG2) ) |
534 | begin |
||
535 | hsync <= 1'b1; |
||
536 | if ( vgaff ) csync <= 1'b1; |
||
537 | end |
||
538 | |||
255 | ddp | 539 | if ( (~scr_tv_mode) && (hcount==HSYNC_END2) ) |
540 | begin |
||
541 | hsync <= 1'b0; |
||
542 | if ( !vsync ) |
||
543 | csync <= 1'b0; |
||
544 | end |
||
545 | |||
546 | if ( scr_tv_mode && (hcount==HSYNC_END) ) |
||
547 | begin |
||
548 | hsync <= 1'b0; |
||
549 | if ( !vsync ) |
||
550 | csync <= 1'b0; |
||
551 | end |
||
552 | |||
380 | ddp | 553 | if (scr_tv_mode) |
554 | begin |
||
555 | if (hcount==CSYNC_CUT) |
||
556 | csync <= 1'b0; |
||
557 | end |
||
558 | else if ( (vgaff) && (hcount==CSYNC_CUT2) ) |
||
255 | ddp | 559 | csync <= 1'b0; |
560 | |||
380 | ddp | 561 | if ( ((hchess==5'd0) || (hchess==5'd18)) && (hsetka==4'd13) ) |
562 | schcnt <= 6'd0; |
||
563 | else if (schcnt!=6'd63) |
||
564 | schcnt <= schcnt+6'd1; |
||
255 | ddp | 565 | |
380 | ddp | 566 | if ( hcount==HBORD_BEG ) |
567 | begin |
||
568 | hbord <= 1'b1; |
||
569 | hsetka <= 4'd0; |
||
570 | hchess <= 5'd0; |
||
571 | hchss3 <= 2'd0; |
||
572 | cband <= 3'd0; |
||
573 | end |
||
574 | else |
||
575 | begin |
||
576 | if ( hsetka==4'd14 ) |
||
577 | begin |
||
578 | hsetka <= 4'd0; |
||
579 | hchess <= hchess+5'd1; |
||
580 | if ( hchss3==2'd2 ) |
||
581 | begin |
||
582 | hchss3 <= 2'd0; |
||
583 | cband <= cband+3'd1; |
||
584 | end |
||
585 | else |
||
586 | hchss3 <= hchss3+2'd1; |
||
587 | end |
||
588 | else |
||
589 | hsetka <= hsetka+4'd1; |
||
590 | if ( hcount==HBORD_END ) hbord <= 1'b0; |
||
591 | end |
||
255 | ddp | 592 | |
380 | ddp | 593 | if ( !((vcount[2:0]==3'd0)&&vgaff) && (hcount==9'd0) ) |
594 | clr3 <= { clr3[1:0], clr3[2] }; |
||
595 | else if (hcount[2:0]==3'd5) |
||
596 | clr3 <= { clr3[1:0], clr3[2] }; |
||
255 | ddp | 597 | |
598 | end |
||
599 | // |
||
600 | if ( nextline ) |
||
601 | begin |
||
602 | |||
603 | nextline <= 1'b0; |
||
604 | |||
380 | ddp | 605 | if ( ~vtxtscr ) |
255 | ddp | 606 | begin |
607 | voffset <= 11'd0; |
||
608 | vcharlinecount <= 4'd15; |
||
609 | end |
||
610 | else |
||
611 | begin |
||
612 | if ( vcharlinecount==4'd8 ) |
||
613 | begin |
||
614 | voffset <= voffset + 11'd53; |
||
615 | vcharlinecount <= 4'd15; |
||
616 | end |
||
617 | else |
||
618 | vcharlinecount <= vcharlinecount + 4'd1; |
||
619 | end |
||
620 | |||
621 | if ( vcount==VMAX ) |
||
622 | begin |
||
623 | vcount <= 9'd0; |
||
380 | ddp | 624 | clr3 <= 3'b001; |
255 | ddp | 625 | end |
626 | else |
||
627 | vcount <= vcount + 9'd1; |
||
628 | |||
380 | ddp | 629 | if ( vcount==VTXTS_END ) |
630 | vtxtscr <= 1'b0; |
||
631 | else if ( vcount==VTXTS_BEG ) |
||
632 | vtxtscr <= 1'b1; |
||
255 | ddp | 633 | |
634 | if ( vcount==VSYNC_BEG ) |
||
635 | vsync <= 1'b1; |
||
636 | else if ( vcount==VSYNC_END ) |
||
637 | vsync <= 1'b0; |
||
638 | |||
380 | ddp | 639 | if ( vcount==VBORD_BEG ) |
640 | begin |
||
641 | vbord <= 1'b1; |
||
642 | vsetka <= 4'd5; |
||
643 | vchess <= 5'd0; |
||
644 | circle <= 1'b0; |
||
645 | bccount <= 7'd0; |
||
646 | sccount <= 5'd0; |
||
647 | bcdir <= 2'b00; |
||
648 | scdir <= 2'b00; |
||
649 | end |
||
650 | else |
||
651 | begin |
||
255 | ddp | 652 | |
380 | ddp | 653 | if (bcdir[0]) |
654 | bccount <= bccount+7'd1; |
||
655 | else if (bcdir[1]) |
||
656 | bccount <= bccount-7'd1; |
||
657 | |||
658 | if (scdir[0]) |
||
659 | sccount <= sccount+5'd1; |
||
660 | else if (scdir[1]) |
||
661 | sccount <= sccount-5'd1; |
||
662 | |||
663 | if ( vsetka==4'd14 ) |
||
664 | begin |
||
665 | vsetka <= 4'd0; |
||
666 | vchess <= vchess+5'd1; |
||
667 | end |
||
668 | else |
||
669 | begin |
||
670 | vsetka <= vsetka+4'd1; |
||
671 | if ( vsetka==4'd13 ) |
||
672 | begin |
||
673 | if (vchess==5'd1) |
||
674 | bcdir <= 2'b01; |
||
675 | else if (vchess==5'd9) |
||
676 | bcdir <= 2'b10; |
||
677 | else if (vchess==5'd17) |
||
678 | bcdir <= 2'b00; |
||
679 | if ( (vchess==5'd0) || (vchess==5'd14) ) |
||
680 | scdir <= 2'b01; |
||
681 | else if ( (vchess==5'd2) || (vchess==5'd16) ) |
||
682 | scdir <= 2'b10; |
||
683 | else if ( (vchess==5'd4) || (vchess==5'd18) ) |
||
684 | scdir <= 2'b00; |
||
685 | end |
||
686 | end |
||
687 | |||
688 | if ( vcount==VBORD_END ) vbord <= 1'b0; |
||
689 | |||
690 | end |
||
691 | |||
255 | ddp | 692 | vmouse <= vcount - scr_mouse_y; |
693 | |||
694 | end |
||
695 | // |
||
380 | ddp | 696 | if ( (hchess==5'd2) || (hchess==5'd10) || (hchess==5'd20) ) |
697 | hhole <= 1'b1; |
||
698 | else if ( (hchess==5'd4) || (hchess==5'd14) || (hchess==5'd22) ) |
||
699 | hhole <= 1'b0; |
||
700 | // |
||
701 | if ( (vchess==5'd4) && (schcnt==6'd63) ) |
||
702 | begin |
||
703 | if (hchess==5'd7) |
||
704 | uhole <= 1'b1; |
||
705 | else if (hchess==5'd17) |
||
706 | uhole <= 1'b0; |
||
707 | end |
||
708 | // |
||
709 | if (hcount==(9'd258+cb_val)) |
||
710 | circle <= 1'b0; |
||
711 | else if ( (schcnt==(5'd31+cs_val)) && (sccount!=5'd0) ) |
||
712 | circle <= 1'b0; |
||
713 | else if (hcount==(9'd257-cb_val)) |
||
714 | circle <= 1'b1; |
||
715 | else if ( (schcnt==(5'd30-cs_val)) && (sccount!=5'd0) ) |
||
716 | circle <= 1'b1; |
||
717 | // |
||
718 | if ( (((vchess==5'd2) || (vchess==5'd16)) && (vsetka==4'd7)) || (vchess==5'd9) ) |
||
719 | vhole <= 1'b1; |
||
720 | else if ( (((vchess==5'd3) || (vchess==5'd17)) && (vsetka==4'd7)) || (vchess==5'd11) ) |
||
721 | vhole <= 1'b0; |
||
722 | // |
||
255 | ddp | 723 | end |
724 | |||
380 | ddp | 725 | circl_b ccb ( .in_addr(bccount), .out_word(cb_val) ); |
726 | circl_s ccs ( .in_addr(sccount), .out_word(cs_val) ); |
||
727 | |||
255 | ddp | 728 | lpm_rom_7x2 mouse_cursor ( .address({ vmouse[3:0], hmouse[2:0] }), .q({ mouse_i, mouse_m }) ); |
729 | assign mouse_here = (hmouse[8:3] == 6'd0) && (vmouse[8:4] == 5'd0); |
||
730 | assign mouse_mask = mouse_here & mouse_m; |
||
731 | assign mouse_image = mouse_here & mouse_i; |
||
732 | |||
733 | assign video_addr = voffset + { 4'h0, hcharcount[5:0] }; |
||
734 | lpm_ram_dp_9x8 scrmem0 ( .data(indata), .wraddress(scr_addr[8:0]), .wren((scr_wren_c)&&(scr_addr[10:9]==2'h0)), |
||
735 | .rdaddress(video_addr[8:0]), .q(charcode0) ); |
||
736 | lpm_ram_dp_9x8 scrmem1 ( .data(indata), .wraddress(scr_addr[8:0]), .wren((scr_wren_c)&&(scr_addr[10:9]==2'h1)), |
||
737 | .rdaddress(video_addr[8:0]), .q(charcode1) ); |
||
738 | lpm_ram_dp_9x8 scrmem2 ( .data(indata), .wraddress(scr_addr[8:0]), .wren((scr_wren_c)&&(scr_addr[10:9]==2'h2)), |
||
739 | .rdaddress(video_addr[8:0]), .q(charcode2) ); |
||
740 | assign charcode = (video_addr[10:9]==2'h0) ? charcode0 : |
||
741 | (video_addr[10:9]==2'h1) ? charcode1 : charcode2 ; |
||
742 | lpm_ram_dp_9x8 attrmem0 ( .data(scr_attr), .wraddress(scr_addr[8:0]), .wren((scr_wren_a)&&(scr_addr[10:9]==2'h0)), |
||
743 | .rdaddress(video_addr[8:0]), .q(attrcode0) ); |
||
744 | lpm_ram_dp_9x8 attrmem1 ( .data(scr_attr), .wraddress(scr_addr[8:0]), .wren((scr_wren_a)&&(scr_addr[10:9]==2'h1)), |
||
745 | .rdaddress(video_addr[8:0]), .q(attrcode1) ); |
||
746 | lpm_ram_dp_9x8 attrmem2 ( .data(scr_attr), .wraddress(scr_addr[8:0]), .wren((scr_wren_a)&&(scr_addr[10:9]==2'h2)), |
||
747 | .rdaddress(video_addr[8:0]), .q(attrcode2) ); |
||
748 | assign attrcode = (video_addr[10:9]==2'h0) ? attrcode0 : |
||
749 | (video_addr[10:9]==2'h1) ? attrcode1 : attrcode2 ; |
||
750 | assign vcharline = (vcharlinecount[3]) ? ~vcharlinecount[2:0] : vcharlinecount[2:0]; |
||
751 | lpm_rom_11x6 chargen ( .address({ charcode, vcharline }), .q(charpix) ); |
||
752 | |||
753 | assign fcolor = { attrcode[2], (attrcode[2]&attrcode[3]), |
||
754 | attrcode[1], (attrcode[1]&attrcode[3]), |
||
755 | attrcode[0], (attrcode[0]&attrcode[3]) }; |
||
756 | assign bcolor = { (attrcode[6]&attrcode[7]), (attrcode[6]&(~attrcode[7])), |
||
757 | (attrcode[5]&attrcode[7]), (attrcode[5]&(~attrcode[7])), |
||
758 | (attrcode[4]&attrcode[7]), (attrcode[4]&(~attrcode[7])) }; |
||
759 | assign fontenable = (charcode[7:4]==4'hb)|| |
||
760 | (charcode[7:4]==4'hc)|| |
||
761 | (charcode[7:4]==4'hd)|| |
||
762 | (~vcharlinecount[3]); |
||
763 | assign pixel = ( charcode==8'hb0 ) ? ( (vcount[0]^hcount[1])&~hcount[0] ) : |
||
764 | ( charcode==8'hb1 ) ? ( vcount[0]^hcount[0] ) : |
||
765 | ( charcode==8'hb2 ) ? ( (vcount[0]^hcount[1])| hcount[0] ) : |
||
766 | ( fontenable ) ? charpix[3'd5-pixptr] : 1'b0; |
||
767 | |||
380 | ddp | 768 | assign image_color = (mouse_mask) ? BLACK : ( pixel ? fcolor : bcolor ) ; |
255 | ddp | 769 | |
380 | ddp | 770 | assign { vgrn[1:0], vred[1:0], vblu[1:0] } = color; |
255 | ddp | 771 | assign vhsync = hsync; |
772 | assign vvsync = vsync; |
||
773 | assign vcsync = ~csync; |
||
774 | |||
775 | //--AVRSPI--FlashROM----------------------------------------------------------- |
||
776 | |||
777 | localparam TEMP_REG = 8'ha0; |
||
778 | |||
779 | localparam SD_CS0 = 8'ha1; |
||
780 | localparam SD_CS1 = 8'ha2; |
||
781 | localparam FLASH_LOADDR = 8'ha3; |
||
782 | localparam FLASH_MIDADDR = 8'ha4; |
||
783 | localparam FLASH_HIADDR = 8'ha5; |
||
784 | localparam FLASH_DATA = 8'ha6; |
||
785 | localparam FLASH_CTRL = 8'ha7; |
||
786 | localparam SCR_LOADDR = 8'ha8; |
||
277 | ddp | 787 | localparam SCR_HIADDR = 8'ha9; |
255 | ddp | 788 | localparam SCR_SET_ATTR = 8'haa; // ATTR |
789 | localparam SCR_FILL = 8'hab; // ATTR |
||
790 | // ( spics_n, ) |
||
791 | localparam SCR_CHAR = 8'hac; // ATTR |
||
792 | // ( spics_n, ) |
||
793 | localparam SCR_MOUSE_X = 8'had; |
||
794 | localparam SCR_MOUSE_Y = 8'hae; |
||
380 | ddp | 795 | localparam SCR_MODE = 8'haf; // [7] - 0=VGAmode, 1=TVmode; [2:0] - 0=TXT, ScrTESTs |
255 | ddp | 796 | |
380 | ddp | 797 | localparam MTST_CONTROL = 8'h50; // [0] - (0=, 1=) |
255 | ddp | 798 | localparam MTST_PASS_CNT0= 8'h51; |
799 | localparam MTST_PASS_CNT1= TEMP_REG; |
||
800 | localparam MTST_FAIL_CNT0= 8'h52; |
||
801 | localparam MTST_FAIL_CNT1= TEMP_REG; |
||
802 | |||
803 | localparam COVOX = 8'h53; |
||
804 | |||
380 | ddp | 805 | localparam INT_CONTROL = 8'h54; // [0] - covox- (27343.75 Hz) |
806 | // [1] - (~49 Hz) |
||
255 | ddp | 807 | |
808 | reg [7:0] number; initial number = 8'hff; |
||
809 | reg [7:0] indata; initial indata = 8'hff; |
||
810 | reg [7:0] outdata; |
||
811 | reg [2:0] bitptr; |
||
812 | reg prev_spics_n; |
||
813 | reg [18:0] flash_addr; |
||
814 | reg flash_cs; initial flash_cs = 1'b0; |
||
815 | reg flash_oe; initial flash_oe = 1'b0; |
||
816 | reg flash_we; initial flash_we = 1'b0; |
||
290 | ddp | 817 | reg flash_postinc; initial flash_postinc = 1'b0; |
255 | ddp | 818 | reg [7:0] flash_data_out; |
819 | reg [10:0] scr_addr; initial scr_addr = 11'h000; |
||
820 | reg [7:0] scr_attr; initial scr_attr = 8'h0f; |
||
821 | reg scr_wren_c; initial scr_wren_c = 1'b0; |
||
822 | reg scr_wren_a; initial scr_wren_a = 1'b0; |
||
823 | reg [8:0] scr_mouse_x; initial scr_mouse_x = 9'd0; |
||
824 | reg [8:0] scr_mouse_y; initial scr_mouse_y = 9'd0; |
||
825 | reg scr_tv_mode; initial scr_tv_mode = 1'b1; |
||
380 | ddp | 826 | reg [2:0] scr_mode; initial scr_mode = 3'b0; |
255 | ddp | 827 | wire spicsn_rising; |
828 | wire spicsn_falling; |
||
829 | wire sd_selected; |
||
830 | reg cs_trg; |
||
831 | reg [7:0] temp_reg; |
||
832 | |||
833 | always @(posedge spick) |
||
834 | begin |
||
835 | if ( spics_n ) |
||
836 | number <= { number[6:0], spido }; |
||
837 | else |
||
838 | indata <= { indata[6:0], spido }; |
||
839 | end |
||
840 | |||
841 | always @(negedge spick or posedge spics_n) |
||
842 | begin |
||
843 | if ( spics_n ) |
||
844 | bitptr <= 3'b111; |
||
845 | else |
||
846 | bitptr <= bitptr - 3'b001; |
||
847 | end |
||
848 | |||
849 | always @(posedge fclk) |
||
850 | begin |
||
851 | // |
||
852 | if ( spicsn_rising ) |
||
853 | begin |
||
854 | // |
||
855 | cs_trg <= 1'b1; |
||
856 | // |
||
857 | case ( number ) |
||
858 | FLASH_LOADDR: flash_addr[7:0] <= indata; |
||
859 | FLASH_MIDADDR: flash_addr[15:8] <= indata; |
||
860 | FLASH_HIADDR: flash_addr[18:16] <= indata[2:0]; |
||
290 | ddp | 861 | FLASH_DATA: begin |
862 | flash_data_out <= indata; |
||
863 | if (flash_postinc) flash_addr[13:0] <= flash_addr[13:0] + 14'd1; |
||
864 | end |
||
255 | ddp | 865 | FLASH_CTRL: begin |
866 | flash_cs <= indata[0]; |
||
867 | flash_oe <= indata[1]; |
||
868 | flash_we <= indata[2]; |
||
290 | ddp | 869 | flash_postinc <= indata[3]; |
255 | ddp | 870 | end |
871 | SCR_LOADDR: scr_addr[7:0] <= indata; |
||
872 | SCR_HIADDR: scr_addr[10:8] <= indata[2:0]; |
||
873 | SCR_SET_ATTR: scr_attr <= indata; |
||
874 | SCR_FILL: begin |
||
875 | scr_attr <= indata; |
||
876 | scr_wren_a <= 1'b1; |
||
877 | end |
||
878 | SCR_CHAR: begin |
||
879 | scr_wren_c <= 1'b1; |
||
880 | scr_wren_a <= 1'b1; |
||
881 | end |
||
882 | TEMP_REG: temp_reg <= indata; |
||
883 | SCR_MOUSE_X: scr_mouse_x <= { temp_reg[0], indata }; |
||
884 | SCR_MOUSE_Y: scr_mouse_y <= { temp_reg[0], indata }; |
||
885 | SCR_MODE: begin |
||
380 | ddp | 886 | scr_tv_mode <= indata[7]; |
887 | scr_mode <= indata[2:0]; |
||
255 | ddp | 888 | end |
889 | MTST_CONTROL: mtst_run <= indata[0]; |
||
380 | ddp | 890 | COVOX: begin |
891 | covox[cvx_ptr_iinc] <= indata; |
||
892 | cvx_ptr_in <= cvx_ptr_iinc; |
||
893 | end |
||
255 | ddp | 894 | INT_CONTROL: begin |
895 | enable_covox_int <= indata[0]; |
||
896 | enable_frame_int <= indata[1]; |
||
897 | end |
||
898 | endcase |
||
899 | // |
||
900 | end |
||
901 | else |
||
902 | begin |
||
903 | // |
||
904 | scr_wren_c <= 1'b0; |
||
905 | scr_wren_a <= 1'b0; |
||
906 | // |
||
907 | if ( spicsn_falling ) |
||
908 | begin |
||
909 | // |
||
910 | cs_trg <= 1'b0; |
||
911 | // |
||
912 | case ( number ) |
||
380 | ddp | 913 | SCR_SET_ATTR: outdata <= ~scr_attr; // for SPI testing |
255 | ddp | 914 | SCR_FILL: begin |
915 | outdata <= 8'hff; |
||
916 | scr_addr <= scr_addr + 11'd1; |
||
917 | end |
||
918 | SCR_CHAR: begin |
||
919 | outdata <= 8'hff; |
||
920 | scr_addr <= scr_addr + 11'd1; |
||
921 | end |
||
922 | FLASH_DATA: outdata <= d; |
||
923 | MTST_PASS_CNT0:begin |
||
924 | outdata <= mtst_pass_counter[7:0]; |
||
925 | temp_reg <= mtst_pass_counter[15:8]; |
||
926 | end |
||
927 | MTST_FAIL_CNT0:begin |
||
928 | outdata <= mtst_fail_counter[7:0]; |
||
929 | temp_reg <= mtst_fail_counter[15:8]; |
||
930 | end |
||
380 | ddp | 931 | COVOX: outdata <= { 4'd0, cvx_ptr_diff }; |
255 | ddp | 932 | TEMP_REG: outdata <= temp_reg; // read after MTST_PASS_CNT0, MTST_FAIL_CNT0 |
933 | default: outdata <= 8'hff; |
||
934 | endcase |
||
935 | // |
||
936 | end |
||
937 | // |
||
938 | end |
||
939 | // |
||
940 | prev_spics_n <= spics_n; |
||
941 | // |
||
942 | end |
||
943 | |||
944 | assign spicsn_rising = ( { cs_trg, prev_spics_n, spics_n } == 3'b011 ); |
||
945 | assign spicsn_falling = ( { cs_trg, prev_spics_n, spics_n } == 3'b100 ); |
||
946 | |||
947 | assign sd_selected = ( ( (number==SD_CS0) || (number==SD_CS1) ) && (~spics_n) ); |
||
948 | assign spidi = sd_selected ? sddi : outdata[bitptr]; |
||
949 | assign sddo = sd_selected ? spido : 1'b1; |
||
950 | assign sdclk = sd_selected ? spick : 1'b0; |
||
951 | assign sdcs_n = !( (number==SD_CS0) && (~spics_n) ); |
||
952 | |||
953 | assign a[13:0] = flash_addr[13:0]; |
||
954 | assign rompg0_n = ~flash_addr[14]; |
||
955 | assign { rompg4, rompg3, rompg2, dos_n } = flash_addr[18:15]; |
||
956 | assign csrom = flash_cs; |
||
957 | assign romoe_n = ~flash_oe; |
||
958 | assign romwe_n = ~flash_we; |
||
959 | assign d = flash_oe ? 8'bZZZZZZZZ : flash_data_out; |
||
960 | |||
961 | //----------------------------------------------------------------------------- |
||
962 | |||
963 | reg mtst_run; initial mtst_run = 1'b0; |
||
964 | wire [15:0] mtst_pass_counter; |
||
965 | wire [15:0] mtst_fail_counter; |
||
966 | |||
967 | mem_tester mtst( .clk(fclk), .rst_n(mtst_run), |
||
968 | .pass_counter(mtst_pass_counter), |
||
969 | .fail_counter(mtst_fail_counter), |
||
970 | .DRAM_DQ(rd), .DRAM_MA(ra), .DRAM_RAS0_N(rras0_n), .DRAM_RAS1_N(rras1_n), |
||
971 | .DRAM_LCAS_N(rlcas_n), .DRAM_UCAS_N(rucas_n), .DRAM_WE_N(rwe_n) ); |
||
972 | |||
973 | //----------------------------------------------------------------------------- |
||
974 | |||
975 | endmodule |