Subversion Repositories pentevo

Rev

Rev 340 | 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. // VGA scandoubler
  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. module video_vga_double(
  25.  
  26. `include "../include/tune.v"
  27.  
  28.         input  wire        clk,
  29.  
  30.         input  wire        hsync_start,
  31.  
  32.         input  wire        scanin_start,
  33.         input  wire [ 5:0] pix_in,
  34.  
  35.         input  wire        scanout_start,
  36.         output reg  [ 5:0] pix_out
  37. );
  38. /*
  39. addressing of non-overlapping pages:
  40.  
  41. pg0 pg1
  42. 0xx 1xx
  43. 2xx 3xx
  44. 4xx 5xx
  45. */
  46.  
  47.         reg [9:0] ptr_in;  // count up to 720
  48.         reg [9:0] ptr_out; //
  49.  
  50.         reg pages; // swapping of pages
  51.  
  52.         reg wr_stb;
  53.  
  54.         wire [ 7:0] data_out;
  55.  
  56.  
  57.         always @(posedge clk) if( hsync_start )
  58.                 pages <= ~pages;
  59.  
  60.  
  61.         // write ptr and strobe
  62.         always @(posedge clk)
  63.         begin
  64.                 if( scanin_start )
  65.                 begin
  66.                         ptr_in[9:8] <= 2'b00;
  67.                         ptr_in[5:4] <= 2'b11;
  68.                 end
  69.                 else
  70.                 begin
  71.                         if( ptr_in[9:8]!=2'b11 ) //  768-720=48
  72.                         begin
  73.                                 wr_stb <= ~wr_stb;
  74.                                 if( wr_stb )
  75.                                 begin
  76.                                         ptr_in <= ptr_in + 10'd1;
  77.                                 end
  78.                         end
  79.                 end
  80.         end
  81.  
  82.  
  83.         // read ptr
  84.         always @(posedge clk)
  85.         begin
  86.                 if( scanout_start )
  87.                 begin
  88.                         ptr_out[9:8] <= 2'b00;
  89.                         ptr_out[5:4] <= 2'b11;
  90.                 end
  91.                 else
  92.                 begin
  93.                         if( ptr_out[9:8]!=2'b11 )
  94.                         begin
  95.                                 ptr_out <= ptr_out + 10'd1;
  96.                         end
  97.                 end
  98.         end
  99.  
  100.         //read data
  101.         always @(posedge clk)
  102.         begin
  103.                 if( ptr_out[9:8]!=2'b11 )
  104.                         pix_out <= data_out[5:0];
  105.                 else
  106.                         pix_out <= 6'd0;
  107.         end
  108.  
  109.  
  110.  
  111.  
  112.  
  113.         mem1536 line_buf( .clk(clk),
  114.  
  115.                           .wraddr({ptr_in[9:8], pages, ptr_in[7:0]}),
  116.                           .wrdata({2'b00,pix_in}),
  117.                           .wr_stb(wr_stb),
  118.  
  119.                           .rdaddr({ptr_out[9:8], (~pages), ptr_out[7:0]}),
  120.                           .rddata(data_out)
  121.                         );
  122.  
  123.  
  124. endmodule
  125.  
  126.  
  127.  
  128.  
  129. // 3x512b memory
  130. module mem1536(
  131.  
  132.         input  wire        clk,
  133.  
  134.         input  wire [10:0] wraddr,
  135.         input  wire [ 7:0] wrdata,
  136.         input  wire        wr_stb,
  137.  
  138.         input  wire [10:0] rdaddr,
  139.         output reg  [ 7:0] rddata
  140. );
  141.  
  142.         reg [7:0] mem [0:1535];
  143.  
  144.         always @(posedge clk)
  145.         begin
  146.                 if( wr_stb )
  147.                 begin
  148.                         mem[wraddr] <= wrdata;
  149.                 end
  150.  
  151.                 rddata <= mem[rdaddr];
  152.         end
  153.  
  154. endmodule
  155.  
  156.  
  157.