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-2012
  4. //
  5. // address generation module for video data fetching
  6.  
  7. module video_addrgen(
  8.  
  9.         input  wire        clk, // 28 MHz clock
  10.  
  11.  
  12.         output reg  [20:0] video_addr, // DRAM arbiter signals
  13.         input  wire        video_next, //
  14.  
  15.  
  16.         input  wire        line_start, // some video sync signals
  17.         input  wire        int_start,  //
  18.         input  wire        vpix,       //
  19.  
  20.         input  wire        scr_page, // which screen to use
  21.  
  22.  
  23.         input  wire        mode_atm_n_pent, // decoded modes
  24.         input  wire        mode_zx,         //
  25.         input  wire        mode_p_16c,      //
  26.         input  wire        mode_p_hmclr,    //
  27.                                             //
  28.         input  wire        mode_a_hmclr,    //
  29.         input  wire        mode_a_16c,      //
  30.         input  wire        mode_a_text,     //
  31.         input  wire        mode_a_txt_1page,//
  32.  
  33.         output wire [ 2:0] typos // Y position in text mode symbols
  34. );
  35.  
  36.         wire mode_ag;
  37.  
  38.         assign mode_ag = mode_a_16c | mode_a_hmclr;
  39.  
  40.  
  41.  
  42.         wire line_init, frame_init;
  43.  
  44.         wire gnext,tnext,ldaddr;
  45.  
  46.         reg line_start_r;
  47.         reg frame_init_r;
  48.         reg line_init_r;
  49.  
  50.         always @(posedge clk)
  51.                 line_start_r <= line_start;
  52.  
  53.         assign line_init  = line_start_r & vpix;
  54.         assign frame_init = int_start;
  55.  
  56.         reg [13:0] gctr;
  57.  
  58.         reg [7:0] tyctr; // text Y counter
  59.         reg [6:0] txctr; // text X counter
  60.  
  61.         reg not_used;
  62.  
  63.  
  64.  
  65.  
  66.         always @(posedge clk)
  67.                 frame_init_r <= frame_init;
  68.  
  69.         always @(posedge clk)
  70.                 line_init_r <= line_init;
  71.  
  72.  
  73.         assign gnext = video_next | frame_init_r;
  74.         assign tnext = video_next | line_init_r;
  75.         assign ldaddr = mode_a_text ? tnext : gnext;
  76.  
  77.         // gfx counter
  78.         //
  79.         initial gctr <= 0;
  80.         //
  81.         always @(posedge clk)
  82.         if( frame_init )
  83.                 gctr <= 0;
  84.         else if( gnext )
  85.                 gctr <= gctr + 1;
  86.  
  87.  
  88.         // text counters
  89.         always @(posedge clk)
  90.         if( frame_init )
  91.                 tyctr <= 8'b0011_0111;
  92.         else if( line_init )
  93.                 tyctr <= tyctr + 1;
  94.  
  95.         always @(posedge clk)
  96.         if( line_init )
  97.                 txctr <= 7'b000_0000;
  98.         else if( tnext )
  99.                 txctr <= txctr + 1;
  100.  
  101.  
  102.         assign typos = tyctr[2:0];
  103.  
  104.  
  105. // zx mode:
  106. // [0] - attr or pix
  107. // [4:1] - horiz pos 0..15 (words)
  108. // [12:5] - vert pos
  109.  
  110.         wire [20:0] addr_zx;   // standard zx mode
  111.         wire [20:0] addr_phm;  // pentagon hardware multicolor
  112.         wire [20:0] addr_p16c; // pentagon 16c
  113.  
  114.         wire [20:0] addr_ag; // atm gfx: 16c (x320) or hard multicolor (x640) - same sequence!
  115.  
  116.         wire [20:0] addr_at; // atm text
  117.  
  118.         wire [11:0] addr_zx_pix;
  119.         wire [11:0] addr_zx_attr;
  120.         wire [11:0] addr_zx_p16c;
  121.  
  122.  
  123.         assign addr_zx_pix  = { gctr[12:11], gctr[7:5], gctr[10:8], gctr[4:1] };
  124.  
  125.         assign addr_zx_attr = { 3'b110, gctr[12:8], gctr[4:1] };
  126.  
  127.         assign addr_zx_p16c = { gctr[13:12], gctr[8:6], gctr[11:9], gctr[5:2] };
  128.  
  129.  
  130.         assign addr_zx =   { 6'b000001, scr_page, 2'b10, ( gctr[0] ? addr_zx_attr : addr_zx_pix ) };
  131.  
  132.         assign addr_phm =  { 6'b000001, scr_page, 1'b1, gctr[0], addr_zx_pix };
  133.  
  134.         assign addr_p16c = { 6'b000001, scr_page, ~gctr[0], gctr[1], addr_zx_p16c };
  135.  
  136.  
  137.         assign addr_ag = { 5'b00000, ~gctr[0], scr_page, 1'b1, gctr[1], gctr[13:2] };
  138.  
  139.         //                           5 or 1     +0 or +2  ~4,0  +0k or +2k
  140. //      assign addr_at = { 5'b00000, ~txctr[0], scr_page, 1'b1, txctr[1], 2'b00, tyctr[7:3], txctr[6:2] };
  141. //      assign addt_et = { 5'b00001,  1'b0    , scr_page, 1'b0, txctr[0], txctr[1], 0, --//00           };
  142.  
  143.         assign addr_at = { 4'b0000,
  144.                            mode_a_txt_1page, // if 1page, 8 and 10 pages instead of 5,1 and 7,3
  145.                            mode_a_txt_1page ? 1'b0 : ~txctr[0], // 5 or 1 pages for usual mode
  146.                            scr_page,         // actually not used
  147.                            ~mode_a_txt_1page, // 5,1 (not 4,0) pages for usual mode
  148.                            mode_a_txt_1page ? txctr[0] : txctr[1], // 0,+2 interleave for even-odd or 0,+1 for 1page
  149.                            mode_a_txt_1page ? txctr[1] : 1'b0, // sym/attr interleave 0,+1 for 1page
  150.                            1'b0,
  151.                            tyctr[7:3],
  152.                            txctr[6:2]
  153.                            };
  154.  
  155.  
  156.  
  157.  
  158.  
  159.  
  160.  
  161.  
  162.  
  163.  
  164.  
  165.         initial video_addr <= 0;
  166.         //
  167.         always @(posedge clk) if( ldaddr )
  168.         begin
  169.                 { video_addr[20:15], not_used, video_addr[13:0] } <=
  170.                         ( {21{mode_zx     }} & addr_zx  )  |
  171.                         ( {21{mode_p_16c  }} & addr_p16c)  |
  172.                         ( {21{mode_p_hmclr}} & addr_phm )  |
  173.                         ( {21{mode_ag     }} & addr_ag  )  |
  174.                         ( {21{mode_a_text }} & addr_at  )  ;
  175.         end
  176.  
  177.         always @(posedge clk)
  178.                 video_addr[14] <= scr_page;
  179.  
  180.  
  181.  
  182. endmodule
  183.  
  184.