Subversion Repositories pentevo

Rev

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

  1. `include "../include/tune.v"
  2.  
  3. // Pentevo project (c) NedoPC 2011
  4. //
  5. // renders fetched video data to the pixels
  6.  
  7. module video_render(
  8.  
  9.         input  wire        clk, // 28 MHz clock
  10.  
  11.  
  12.         input  wire [63:0] pic_bits, // video data from fetcher
  13.  
  14.         input  wire        fetch_sync, // synchronizes pixel rendering -
  15.                                        // coincides with cbeg!!!
  16.  
  17.         input  wire        cbeg,
  18.         input  wire        post_cbeg, // pixel strobed and
  19.         input  wire        pre_cend,
  20.         input  wire        cend,      // general sync
  21.  
  22.         input  wire        int_start, // for flash gen
  23.  
  24.         input  wire [ 2:0] typos, // Y pos in text symbols
  25.  
  26.         output wire [ 3:0] pixels, // output pixels
  27.  
  28.  
  29.  
  30.         input  wire [10:0] fnt_a,
  31.         input  wire [ 7:0] fnt_d,
  32.         input  wire        fnt_wr,
  33.  
  34.  
  35.  
  36.  
  37.         input  wire        mode_atm_n_pent, // decoded modes
  38.  
  39.         input  wire        mode_zx,         //
  40.         input  wire        mode_p_16c,      //
  41.         input  wire        mode_p_hmclr,    //
  42.                                             //
  43.         input  wire        mode_a_hmclr,    //
  44.         input  wire        mode_a_16c,      //
  45.         input  wire        mode_a_text,     //
  46.  
  47.         input  wire        mode_pixf_14,    //
  48.  
  49.  
  50.         output wire [ 7:0] fontrom_readback
  51. );
  52.  
  53.  
  54.         reg [4:0] flash_ctr;
  55.         wire flash;
  56.  
  57.         initial
  58.         begin
  59.                 flash_ctr = 0;
  60.         end
  61.  
  62.         always @(posedge clk) if( int_start )
  63.         begin
  64.                 flash_ctr <= flash_ctr + 1;
  65.         end
  66.         assign flash = flash_ctr[4];
  67.  
  68.  
  69.  
  70.  
  71.  
  72.         // fetched data divided in bytes
  73.         wire [7:0] bits [0:7];
  74.  
  75.         assign bits[0] = pic_bits[ 7:0 ];
  76.         assign bits[1] = pic_bits[15:8 ];
  77.         assign bits[2] = pic_bits[23:16];
  78.         assign bits[3] = pic_bits[31:24];
  79.         assign bits[4] = pic_bits[39:32];
  80.         assign bits[5] = pic_bits[47:40];
  81.         assign bits[6] = pic_bits[55:48];
  82.         assign bits[7] = pic_bits[63:56];
  83.  
  84.  
  85.  
  86.         reg [1:0] gnum; // pixel group number
  87.         reg [2:0] pnum; // pixel number
  88.         wire [1:0] gadd;
  89.         wire [2:0] padd;
  90.         wire ginc;
  91.  
  92.         wire modes_16c;
  93.  
  94.         wire modes_zxattr;
  95.  
  96.  
  97.         wire   ena_pix;
  98.         assign ena_pix = cend | (mode_pixf_14 & post_cbeg);
  99.  
  100.  
  101.         assign modes_16c = mode_p_16c | mode_a_16c;
  102.  
  103.         assign modes_zxattr = mode_zx | mode_p_hmclr;
  104.  
  105.         assign {ginc, padd} = {1'b0, pnum} + {2'b00, modes_16c, ~modes_16c};
  106.  
  107.         always @(posedge clk) if( ena_pix )
  108.         if( fetch_sync )
  109.                 pnum <= 3'b000;
  110.         else
  111.                 pnum <= padd;
  112.  
  113.  
  114.         assign gadd = gnum + ( {modes_zxattr,~modes_zxattr} & {2{ginc}} );
  115.  
  116.         always @(posedge clk) if( ena_pix )
  117.         if( fetch_sync )
  118.                 gnum <= 2'b00;
  119.         else
  120.                 gnum <= gadd;
  121.  
  122.  
  123.  
  124.  
  125.         wire [15:0] pgroup; // pixel group
  126.         wire [7:0] pixbyte, symbyte, attrbyte;
  127.         wire [7:0] pix16_2 [0:1];
  128.         wire [3:0] pix16   [0:3];
  129.  
  130.         wire pixbit; // pixel bit, for attr modes
  131.         wire [3:0] pix0, pix1; // colors for bit=0 and bit=1, for attr modes
  132.  
  133.         wire [3:0] apix, c16pix;
  134.  
  135.  
  136.         assign pgroup = { bits[ {gnum[0], 1'b0, gnum[1]} ] ,
  137.                           bits[ {gnum[0], 1'b1, gnum[1]} ] };
  138.  
  139.         assign pixbyte  = pgroup[15:8];
  140.         assign attrbyte = pgroup[ 7:0];
  141.  
  142.  
  143.         assign pix16_2[0] = pgroup[ 7:0];
  144.         assign pix16_2[1] = pgroup[15:8];
  145.  
  146.         assign pix16[0] = { pix16_2[0][6], pix16_2[0][2:0] };
  147.         assign pix16[1] = { pix16_2[0][7], pix16_2[0][5:3] };
  148.         assign pix16[2] = { pix16_2[1][6], pix16_2[1][2:0] };
  149.         assign pix16[3] = { pix16_2[1][7], pix16_2[1][5:3] };
  150.  
  151.  
  152.         assign pixbit = mode_a_text ? symbyte[~pnum] : pixbyte[~pnum];
  153.  
  154.         assign pix0 = { (modes_zxattr ? attrbyte[6] : attrbyte[7]), attrbyte[5:3] }; // paper
  155.         assign pix1 = { attrbyte[6], attrbyte[2:0] }; // ink
  156.  
  157.  
  158.         assign apix = ( pixbit^(modes_zxattr & flash & attrbyte[7]) ) ? pix1 : pix0;
  159.  
  160.         assign c16pix = pix16[ pnum[2:1] ];
  161.  
  162.  
  163.  
  164.         assign pixels = modes_16c ? c16pix : apix;
  165.  
  166.  
  167.  
  168.  
  169.         wire rom_ena;
  170.         assign rom_ena = ena_pix & ginc;
  171.  
  172.         video_fontrom video_fontrom(
  173.  
  174.                 .clock (clk ),
  175.                 /*.enable(1'b1),*/
  176.  
  177.                 .data     (fnt_d ),
  178.                 .wraddress(fnt_a ),
  179.                 .wren     (fnt_wr),
  180.  
  181.                 .rdaddress( {pixbyte, typos} ),
  182.                 .rden     ( rom_ena          ),
  183.                 .q        ( symbyte          )
  184.         );
  185.  
  186.  
  187.         assign fontrom_readback = symbyte;
  188.  
  189.  
  190. endmodule
  191.  
  192.