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 |