Subversion Repositories pentevo

Rev

Rev 973 | 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. // top module for video output.
  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.  
  26. // note: the only bandwidths currently in use are 1/8 and 1/4.
  27.  
  28. `include "../include/tune.v"
  29.  
  30. module video_top(
  31.  
  32.         input  wire        clk, // 28 MHz clock
  33.  
  34.  
  35.         // external video outputs
  36.         output wire [ 1:0] vred,
  37.         output wire [ 1:0] vgrn,
  38.         output wire [ 1:0] vblu,
  39.         output wire        vhsync,
  40.         output wire        vvsync,
  41.         output wire        vcsync,
  42.  
  43.  
  44.         // aux video inputs
  45.         input  wire [ 3:0] zxborder, // border zxcolor
  46.  
  47.  
  48.         // config inputs
  49.         input  wire [ 1:0] pent_vmode, // 2'b00 - standard ZX
  50.                                        // 2'b01 - hardware multicolor
  51.                                        // 2'b10 - pentagon 16 colors
  52.                                        // 2'b11 - not defined yet
  53.  
  54.         input  wire [ 2:0] atm_vmode,  // 3'b011 - zx modes (pent_vmode is active)
  55.                                        // 3'b010 - 640x200 hardware multicolor
  56.                                        // 3'b000 - 320x200 16 colors
  57.                                        // 3'b110 - 80x25 text mode
  58.                                        // 3'b??? (others) - not defined yet
  59.        
  60.  
  61.         input  wire        scr_page,   // screen page (bit 3 of 7FFD)
  62.  
  63.         input  wire        vga_on,     // vga mode ON - scandoubler activated
  64.  
  65.         input  wire [ 1:0] modes_raster, // 2'b00 - pentagon raster (71680 clocks)
  66.                                          // 2'b01 - 60Hz raster
  67.                                          // 2'b10 - 48k raster (69888 clocks)
  68.                                          // 2'b11 - 128k raster (70908 clocks)
  69.        
  70.         input  wire        mode_contend_type, // 2'b0 - 48k/128k/+2 contend type (6 5 4 3 2 1 0 0)
  71.                                               // 2'b1 - +2a/+3 contend type (1 0 7 6 5 4 3 2)
  72.  
  73.         // memory synchronization inputs
  74.         input  wire        cbeg,
  75.         input  wire        post_cbeg,
  76.         input  wire        pre_cend,
  77.         input  wire        cend,
  78.  
  79.  
  80.         // memory arbiter video port connection
  81.         input  wire        video_strobe,
  82.         input  wire        video_next,
  83.         output wire [20:0] video_addr,
  84.         input  wire [15:0] video_data,
  85.         output wire [ 1:0] video_bw,
  86.         output wire        video_go,
  87.  
  88.  
  89.         // atm palette write strobe adn data
  90.         input  wire        atm_palwr,
  91.         input  wire [ 5:0] atm_paldata,
  92.         input  wire [ 5:0] atm_paldatalow,
  93.         input  wire        pal444_ena,
  94.  
  95.  
  96.         input  wire        up_ena,
  97.         input  wire        up_palwr,
  98.         input  wire [ 5:0] up_paladdr,
  99.         input  wire [ 7:0] up_paldata,
  100.  
  101.  
  102.  
  103.         output wire        int_start,
  104.  
  105.  
  106.  
  107.         input  wire [10:0] fnt_a,
  108.         input  wire [ 7:0] fnt_d,
  109.         input  wire        fnt_wr,
  110.  
  111.         output wire [ 5:0] palcolor, // for palette readback
  112.  
  113.         output wire [ 7:0] fontrom_readback,
  114.  
  115.         output wire        contend // for 48k/128k contended memory emulation
  116. );
  117.  
  118.         // these decoded in video_modedecode.v
  119.         wire mode_atm_n_pent;
  120.         wire mode_zx;
  121.         wire mode_p_16c;
  122.         wire mode_p_hmclr;
  123.         wire mode_a_hmclr;
  124.         wire mode_a_16c;
  125.         wire mode_a_text;
  126.         wire mode_a_txt_1page;
  127.         wire mode_pixf_14;
  128.  
  129.  
  130.  
  131.         // synchronization
  132.         wire hsync_start;
  133.         wire line_start;
  134.         wire hint_start;
  135.  
  136.  
  137.         wire vblank;
  138.         wire hblank;
  139.  
  140.         wire vpix;
  141.         wire hpix;
  142.  
  143.         wire vsync;
  144.         wire hsync;
  145.  
  146.         wire vga_hsync;
  147.  
  148.         wire scanin_start;
  149.         wire scanout_start;
  150.  
  151.  
  152.  
  153.         wire fetch_start;
  154.         wire fetch_end;
  155.         wire fetch_sync;
  156.  
  157.  
  158.         wire [63:0] pic_bits;
  159.  
  160.  
  161.         wire [3:0] pixels;
  162.  
  163.  
  164.         wire [5:0] color;
  165.         wire [5:0] vga_color;
  166.  
  167.  
  168.         wire [2:0] typos;
  169.  
  170.        
  171.         // ulaplus related
  172.         wire [ 1:0] up_palsel;
  173.         wire [ 2:0] up_paper;
  174.         wire [ 2:0] up_ink;
  175.         wire        up_pixel;
  176.  
  177.  
  178.         // border sync for 48k/128k emulation
  179.         wire border_sync;
  180.  
  181.  
  182.  
  183.         // decode video modes
  184.         video_modedecode video_modedecode(
  185.  
  186.                 .clk(clk),
  187.  
  188.                 .pent_vmode(pent_vmode),
  189.                 .atm_vmode (atm_vmode),
  190.  
  191.                 .mode_atm_n_pent (mode_atm_n_pent ),
  192.                 .mode_zx         (mode_zx         ),
  193.                 .mode_p_16c      (mode_p_16c      ),
  194.                 .mode_p_hmclr    (mode_p_hmclr    ),
  195.                 .mode_a_hmclr    (mode_a_hmclr    ),
  196.                 .mode_a_16c      (mode_a_16c      ),
  197.                 .mode_a_text     (mode_a_text     ),
  198.                 .mode_a_txt_1page(mode_a_txt_1page),
  199.  
  200.                 .mode_pixf_14(mode_pixf_14),
  201.  
  202.                 .mode_bw(video_bw)
  203.         );
  204.  
  205.  
  206.  
  207.  
  208.  
  209.  
  210.         // vertical sync generator
  211.         video_sync_v video_sync_v(
  212.  
  213.                 .clk(clk),
  214.  
  215.                 .mode_atm_n_pent(mode_atm_n_pent),
  216.                 .modes_raster(modes_raster),
  217.  
  218.                 .hsync_start(hsync_start),
  219.                 .line_start(line_start),
  220.                 .hint_start(hint_start),
  221.  
  222.                 .vblank(vblank),
  223.                 .vsync(vsync),
  224.                 .vpix(vpix),
  225.  
  226.                 .int_start(int_start)
  227.         );
  228.  
  229.  
  230.         // horizontal sync generator
  231.         video_sync_h video_sync_h(
  232.  
  233.                 .clk(clk),
  234.  
  235.                 .mode_atm_n_pent(mode_atm_n_pent),
  236.                 .mode_a_text    (mode_a_text),
  237.  
  238.                 .modes_raster     (modes_raster     ),
  239.                 .mode_contend_type(mode_contend_type),
  240.  
  241.                 .init(1'b0),
  242.  
  243.                 .pre_cend(pre_cend),
  244.                 .cend    (cend    ),
  245.  
  246.  
  247.                 .hblank(hblank),
  248.                 .hsync(hsync),
  249.                 .vpix(vpix),
  250.                 .hpix(hpix),
  251.  
  252.                 .line_start(line_start),
  253.                 .hsync_start(hsync_start),
  254.  
  255.                 .hint_start(hint_start),
  256.  
  257.                 .scanin_start(scanin_start),
  258.  
  259.                 .fetch_start(fetch_start),
  260.                 .fetch_end  (fetch_end  ),
  261.  
  262.                 .contend(contend),
  263.  
  264.                 .border_sync(border_sync)
  265.         );
  266.  
  267.  
  268.         // address generation
  269.         video_addrgen video_addrgen(
  270.  
  271.                 .clk(clk),
  272.  
  273.                 .video_addr(video_addr),
  274.                 .video_next(video_next),
  275.  
  276.                 .line_start(hsync_start),
  277.                 .int_start (int_start ),
  278.                 .vpix      (vpix      ),
  279.  
  280.                 .scr_page(scr_page),
  281.  
  282.                 .typos(typos),
  283.  
  284.                 .mode_atm_n_pent (mode_atm_n_pent ),
  285.                 .mode_zx         (mode_zx         ),
  286.                 .mode_p_16c      (mode_p_16c      ),
  287.                 .mode_p_hmclr    (mode_p_hmclr    ),
  288.                 .mode_a_hmclr    (mode_a_hmclr    ),
  289.                 .mode_a_16c      (mode_a_16c      ),
  290.                 .mode_a_text     (mode_a_text     ),
  291.                 .mode_a_txt_1page(mode_a_txt_1page)
  292.         );
  293.  
  294.  
  295.         // data fetch
  296.         video_fetch video_fetch(
  297.  
  298.                 .clk(clk),
  299.  
  300.                 .pre_cend (pre_cend),
  301.                 .cend     (cend    ),
  302.  
  303.                 .vpix(vpix),
  304.  
  305.                 .fetch_start(fetch_start),
  306.                 .fetch_end  (fetch_end  ),
  307.  
  308.                 .fetch_sync (fetch_sync ),
  309.  
  310.                 .video_data  (video_data  ),
  311.                 .video_strobe(video_strobe),
  312.                 .video_go    (video_go    ),
  313.  
  314.                 .pic_bits(pic_bits)
  315.         );
  316.  
  317.  
  318.         // render fetched data to pixels
  319.         video_render video_render(
  320.  
  321.                 .clk(clk),
  322.  
  323.                 .pic_bits(pic_bits),
  324.  
  325.                 .fetch_sync(fetch_sync),
  326.  
  327.                 .cbeg     (cbeg     ),
  328.                 .post_cbeg(post_cbeg),
  329.                 .pre_cend (pre_cend ),
  330.                 .cend     (cend     ),
  331.  
  332.                 .int_start(int_start),
  333.  
  334.                 .mode_atm_n_pent(mode_atm_n_pent),
  335.                 .mode_zx        (mode_zx        ),
  336.                 .mode_p_16c     (mode_p_16c     ),
  337.                 .mode_p_hmclr   (mode_p_hmclr   ),
  338.                 .mode_a_hmclr   (mode_a_hmclr   ),
  339.                 .mode_a_16c     (mode_a_16c     ),
  340.                 .mode_a_text    (mode_a_text    ),
  341.                 .mode_pixf_14   (mode_pixf_14   ),
  342.  
  343.                 .typos(typos),
  344.  
  345.                 .pixels(pixels),
  346.  
  347.                 .up_palsel(up_palsel),
  348.                 .up_paper (up_paper ),
  349.                 .up_ink   (up_ink   ),
  350.                 .up_pixel (up_pixel ),
  351.  
  352.  
  353.                 .fnt_a (fnt_a ),
  354.                 .fnt_d (fnt_d ),
  355.                 .fnt_wr(fnt_wr),
  356.  
  357.                 .fontrom_readback(fontrom_readback)
  358.         );
  359.  
  360.  
  361.         // combine border and pixels, apply palette
  362.         video_palframe video_palframe(
  363.  
  364.                 .clk(clk),
  365.  
  366.                 .hblank(hblank),
  367.                 .vblank(vblank),
  368.  
  369.                 .hsync_start(hsync_start),
  370.                 .vsync      (vsync      ),
  371.  
  372.                 .hpix(hpix),
  373.                 .vpix(vpix),
  374.  
  375.                 .pixels(pixels),
  376.                 .border(zxborder),
  377.  
  378.                 .border_sync    (border_sync    ),
  379.                 .border_sync_ena(modes_raster[1]),
  380.  
  381.                 .atm_palwr  (atm_palwr  ),
  382.                 .atm_paldata(atm_paldata),
  383.                 .atm_paldatalow(atm_paldatalow), //GgRrBb
  384.                 .pal444_ena(pal444_ena),
  385.  
  386.                 .up_palsel(up_palsel),
  387.                 .up_paper (up_paper ),
  388.                 .up_ink   (up_ink   ),
  389.                 .up_pixel (up_pixel ),
  390.                
  391.                 .up_ena    (up_ena    ),
  392.                 .up_paladdr(up_paladdr),
  393.                 .up_paldata(up_paldata),
  394.                 .up_palwr  (up_palwr  ),
  395.  
  396.                 .modes_raster     (modes_raster     ),
  397.  
  398.                 .color(color),
  399.  
  400.                 .palcolor(palcolor) // palette readback
  401.         );
  402.  
  403.  
  404.         // VGA hsync doubling
  405.         video_vga_sync_h video_vga_sync_h(
  406.  
  407.                 .clk(clk),
  408.  
  409.                 .hsync_start(hsync_start),
  410.                
  411.                 .modes_raster(modes_raster),
  412.  
  413.                 .scanout_start(scanout_start),
  414.  
  415.                 .vga_hsync(vga_hsync)
  416.         );
  417.  
  418.  
  419.         // VGA scandoubling
  420.         video_vga_double video_vga_double(
  421.  
  422.                 .clk(clk),
  423.  
  424.                 .hsync_start  (hsync_start  ),
  425.                 .scanout_start(scanout_start),
  426.                 .scanin_start (scanin_start ),
  427.  
  428.                 .pix_in(color),
  429.  
  430.                 .pix_out(vga_color)
  431.         );
  432.  
  433.  
  434.         // final MUXing of VGA and TV signals
  435.         video_outmux video_outmux(
  436.  
  437.                 .clk(clk),
  438.  
  439.                 .vga_on(vga_on),
  440.  
  441.  
  442.                 .tvcolor(color),
  443.                 .vgacolor(vga_color),
  444.  
  445.                 .vga_hsync(vga_hsync),
  446.                 .hsync    (hsync    ),
  447.                 .vsync    (vsync    ),
  448.  
  449.                 .vred(vred),
  450.                 .vgrn(vgrn),
  451.                 .vblu(vblu),
  452.  
  453.                 .vhsync(vhsync),
  454.                 .vvsync(vvsync),
  455.                 .vcsync(vcsync)
  456.         );
  457.  
  458.  
  459.  
  460.  
  461.  
  462.  
  463. endmodule
  464.  
  465.