// ZX-Evo Base Configuration (c) NedoPC 2008,2009,2010,2011,2012,2013,2014
 
//
 
// VGA scandoubler
 
 
 
/*
 
    This file is part of ZX-Evo Base Configuration firmware.
 
 
 
    ZX-Evo Base Configuration firmware is free software:
 
    you can redistribute it and/or modify it under the terms of
 
    the GNU General Public License as published by
 
    the Free Software Foundation, either version 3 of the License, or
 
    (at your option) any later version.
 
 
 
    ZX-Evo Base Configuration firmware is distributed in the hope that
 
    it will be useful, but WITHOUT ANY WARRANTY; without even
 
    the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
    See the GNU General Public License for more details.
 
 
 
    You should have received a copy of the GNU General Public License
 
    along with ZX-Evo Base Configuration firmware.
 
    If not, see <http://www.gnu.org/licenses/>.
 
*/
 
 
 
module video_vga_double(
 
 
 
`include "../include/tune.v"
 
 
 
        input  wire        clk,
 
 
 
        input  wire        hsync_start,
 
 
 
        input  wire        scanin_start,
 
        input  wire [ 5:0] pix_in,
 
 
 
        input  wire        scanout_start,
 
        output reg  [ 5:0] pix_out
 
);
 
/*
 
addressing of non-overlapping pages:
 
 
 
pg0 pg1
 
0xx 1xx
 
2xx 3xx
 
4xx 5xx
 
*/
 
 
 
        reg [9:0] ptr_in;  // count up to 720
 
        reg [9:0] ptr_out; //
 
 
 
        reg pages; // swapping of pages
 
 
 
        reg wr_stb;
 
 
 
        wire [ 7:0] data_out;
 
 
 
 
 
        always @(posedge clk) if( hsync_start )
 
                pages <= ~pages;
 
 
 
 
 
        // write ptr and strobe
 
        always @(posedge clk)
 
        begin
 
                if( scanin_start )
 
                begin
 
                        ptr_in[9:8] <= 2'b00;
 
                        ptr_in[5:4] <= 2'b11;
 
                end
 
                else
 
                begin
 
                        if( ptr_in[9:8]!=2'b11 ) //  768-720=48
 
                        begin
 
                                wr_stb <= ~wr_stb;
 
                                if( wr_stb )
 
                                begin
 
                                        ptr_in <= ptr_in + 10'd1;
 
                                end
 
                        end
 
                end
 
        end
 
 
 
 
 
        // read ptr
 
        always @(posedge clk)
 
        begin
 
                if( scanout_start )
 
                begin
 
                        ptr_out[9:8] <= 2'b00;
 
                        ptr_out[5:4] <= 2'b11;
 
                end
 
                else
 
                begin
 
                        if( ptr_out[9:8]!=2'b11 )
 
                        begin
 
                                ptr_out <= ptr_out + 10'd1;
 
                        end
 
                end
 
        end
 
 
 
        //read data
 
        always @(posedge clk)
 
        begin
 
                if( ptr_out[9:8]!=2'b11 )
 
                        pix_out <= data_out[5:0];
 
                else
 
                        pix_out <= 6'd0;
 
        end
 
 
 
 
 
 
 
 
 
 
 
        mem1536 line_buf( .clk(clk),
 
 
 
                          .wraddr({ptr_in[9:8], pages, ptr_in[7:0]}),
 
                          .wrdata({2'b00,pix_in}),
 
                          .wr_stb(wr_stb),
 
 
 
                          .rdaddr({ptr_out[9:8], (~pages), ptr_out[7:0]}),
 
                          .rddata(data_out)
 
                        );
 
 
 
 
 
endmodule
 
 
 
 
 
 
 
 
 
// 3x512b memory
 
module mem1536(
 
 
 
        input  wire        clk,
 
 
 
        input  wire [10:0] wraddr,
 
        input  wire [ 7:0] wrdata,
 
        input  wire        wr_stb,
 
 
 
        input  wire [10:0] rdaddr,
 
        output reg  [ 7:0] rddata
 
);
 
 
 
        reg [7:0] mem [0:1535];
 
 
 
        always @(posedge clk)
 
        begin
 
                if( wr_stb )
 
                begin
 
                        mem[wraddr] <= wrdata;
 
                end
 
 
 
                rddata <= mem[rdaddr];
 
        end
 
 
 
endmodule