Subversion Repositories pentevo

Rev

Rev 134 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
134 ddp 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