Subversion Repositories pentevo

Rev

Rev 668 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

  1. // ZX-Evo Base Configuration (c) NedoPC 2008,2009,2010,2011,2012,2013,2014
  2. //
  3. // generates vertical blank, sync and window.
  4.  
  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;
  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.  
  31. `include "../include/tune.v"
  32.  
  33. module video_sync_v(
  34.  
  35.         input  wire        clk,
  36.  
  37.         input  wire        hsync_start, // synchronizing signal
  38.         input  wire        line_start,  // to end vsync some time after hsync has ended
  39.  
  40.         input  wire        hint_start,
  41.  
  42.  
  43.  
  44.         // atm video mode input
  45.         input  wire        mode_atm_n_pent,
  46.  
  47.         input  wire [ 1:0] modes_raster,
  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
  56. );
  57.  
  58.  
  59.  
  60.  
  61.  
  62.         localparam VBLNK_BEG = 9'd00;
  63.  
  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;
  71.  
  72.  
  73. /*      // pentagon (x192)
  74.         localparam VPIX_BEG_PENT = 9'd080;
  75.         localparam VPIX_END_PENT = 9'd272;
  76.  
  77.         // ATM (x200)
  78.         localparam VPIX_BEG_ATM = 9'd076;
  79.         localparam VPIX_END_ATM = 9'd276;
  80. */
  81.  
  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.
  84.  
  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
  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;
  101. */      //
  102.  
  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.        
  115.         reg [8:0] vcount;
  116.  
  117.         reg [8:0] vperiod;
  118.         reg [8:0] vpix_beg;
  119.         reg [8:0] vpix_end;
  120.  
  121.  
  122.  
  123.         initial // for simulation only
  124.         begin
  125.                 vcount = 9'd0;
  126.                 vsync = 1'b0;
  127.                 vblank = 1'b0;
  128.                 vpix = 1'b0;
  129.                 int_start = 1'b0;
  130.                 vperiod = 'd0;
  131.                 vpix_beg = 'd0;
  132.                 vpix_end = 'd0;
  133.         end
  134.  
  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.  
  160.         always @(posedge clk) if( hsync_start )
  161.         begin
  162.                 if( vcount==vperiod )
  163.                 begin
  164.                         vcount <= 9'd0;
  165.                 end
  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;
  176.                 else if( vcount==( (modes_raster==2'b01) ? VBLNK_END_60HZ : VBLNK_END_50HZ ) )
  177.                         vblank <= 1'b0;
  178.         end
  179.  
  180.  
  181.         always @(posedge clk)
  182.         begin
  183.                 if( vcount==( modes_raster==2'b01 ? VSYNC_BEG_60HZ : VSYNC_BEG_50HZ ) && hsync_start )
  184.                         vsync <= 1'b1;
  185.                 else if( vcount==( modes_raster==2'b01 ? VSYNC_END_60HZ : VSYNC_END_50HZ ) && line_start  )
  186.                         vsync <= 1'b0;
  187.         end
  188.  
  189.  
  190.         always @(posedge clk)
  191.         begin
  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 ) )
  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
  203.                 if( vcount==(vpix_beg + (9'd4 & {9{~mode_atm_n_pent}})) )
  204.                         vpix <= 1'b1;
  205.                 else if( vcount==(vpix_end + (9'd4 & {9{mode_atm_n_pent}})) )
  206.                         vpix <= 1'b0;
  207.         end
  208.  
  209.  
  210. endmodule
  211.  
  212.