Subversion Repositories pentevo

Rev

Blame | Last modification | View Log | Download | RSS feed | ?url?

  1. // (c) NedoPC 2010
  2. //
  3. // doubles video line by replicating it in 3x512b RAM buffer
  4.  
  5. module vga_double(
  6.  
  7.         input  wire        clk,
  8.  
  9.         input  wire        hsync_start,
  10.  
  11.         input  wire        scanin_start,
  12.         input  wire [ 5:0] pix_in,
  13.  
  14.         input  wire        scanout_start,
  15.         output reg  [ 5:0] pix_out
  16. );
  17.  
  18. /*
  19. addressing of non-overlapping pages:
  20.  
  21. pg0 pg1
  22. 0xx 1xx
  23. 2xx 3xx
  24. 4xx 5xx
  25. */
  26.  
  27.         reg [9:0] ptr_in;  // count up to 720
  28.         reg [9:0] ptr_out; //
  29.  
  30.         reg pages; // swapping of pages
  31.  
  32.         reg wr_stb;
  33.  
  34.         wire [ 7:0] data_out;
  35.  
  36.  
  37.         always @(posedge clk) if( hsync_start )
  38.                 pages <= ~pages;
  39.  
  40.  
  41.         // write ptr and strobe
  42.         always @(posedge clk)
  43.         begin
  44.                 if( scanin_start )
  45.                 begin
  46.                         ptr_in[9:8] <= 2'b00;
  47.                         ptr_in[5:4] <= 2'b11;
  48.                 end
  49.                 else
  50.                 begin
  51.                         if( ptr_in[9:8]!=2'b11 ) //  768-720=48
  52.                         begin
  53.                                 wr_stb <= ~wr_stb;
  54.                                 if( wr_stb )
  55.                                 begin
  56.                                         ptr_in <= ptr_in + 10'd1;
  57.                                 end
  58.                         end
  59.                 end
  60.         end
  61.  
  62.  
  63.         // read ptr
  64.         always @(posedge clk)
  65.         begin
  66.                 if( scanout_start )
  67.                 begin
  68.                         ptr_out[9:8] <= 2'b00;
  69.                         ptr_out[5:4] <= 2'b11;
  70.                 end
  71.                 else
  72.                 begin
  73.                         if( ptr_out[9:8]!=2'b11 )
  74.                         begin
  75.                                 ptr_out <= ptr_out + 10'd1;
  76.                         end
  77.                 end
  78.         end
  79.  
  80.         //read data
  81.         always @(posedge clk)
  82.         begin
  83.                 if( ptr_out[9:8]!=2'b11 )
  84.                         pix_out <= data_out[5:0];
  85.                 else
  86.                         pix_out <= 6'd0;
  87.         end
  88.  
  89.  
  90.  
  91.  
  92.  
  93.         mem1536 line_buf( .clk(clk),
  94.  
  95.                           .wraddr({ptr_in[9:8], pages, ptr_in[7:0]}),
  96.                           .wrdata({2'b00,pix_in}),
  97.                           .wr_stb(wr_stb),
  98.  
  99.                           .rdaddr({ptr_out[9:8], (~pages), ptr_out[7:0]}),
  100.                           .rddata(data_out)
  101.                         );
  102.  
  103.  
  104. endmodule
  105.  
  106.  
  107.  
  108.  
  109. // 3x512b memory
  110. module mem1536(
  111.  
  112.         input  wire        clk,
  113.  
  114.         input  wire [10:0] wraddr,
  115.         input  wire [ 7:0] wrdata,
  116.         input  wire        wr_stb,
  117.  
  118.         input  wire [10:0] rdaddr,
  119.         output reg  [ 7:0] rddata
  120. );
  121.  
  122.         reg [7:0] mem [0:1535];
  123.  
  124.         always @(posedge clk)
  125.         begin
  126.                 if( wr_stb )
  127.                 begin
  128.                         mem[wraddr] <= wrdata;
  129.                 end
  130.  
  131.                 rddata <= mem[rdaddr];
  132.         end
  133.  
  134.  
  135. endmodule
  136.  
  137.