@@ -101,6 +101,9 @@ logic [3:0] display_ram_write_data;
101101logic display_ram_write_enable_a;
102102logic display_ram_write_enable_b;
103103
104+ logic clear_flag;
105+ logic [18 : 0 ] clear_address_counter;
106+
104107display_buffer buffer_a (
105108 .clock (clock_in),
106109 .reset_n (reset_n_in),
@@ -121,7 +124,7 @@ display_buffer buffer_b (
121124 .write_enable (display_ram_write_enable_b)
122125);
123126
124- // Buffer switching logic
127+ // Buffer switching & clearing logic
125128enum logic { BUFFER_A , BUFFER_B } displayed_buffer;
126129logic [1 : 0 ] switch_write_buffer_edge_monitor;
127130logic buffer_switch_pending;
@@ -132,6 +135,8 @@ always_ff @(posedge clock_in) begin
132135 displayed_buffer <= BUFFER_A ;
133136 switch_write_buffer_edge_monitor <= 'b00 ;
134137 buffer_switch_pending <= 0 ;
138+ clear_flag <= 0 ;
139+ clear_address_counter <= 0 ;
135140 end
136141
137142 else begin
@@ -155,6 +160,17 @@ always_ff @(posedge clock_in) begin
155160 end
156161
157162 buffer_switch_pending <= 0 ;
163+
164+ clear_flag <= 1 ;
165+ clear_address_counter <= 0 ;
166+ end
167+
168+ if (clear_flag == 1 ) begin
169+ clear_address_counter <= clear_address_counter + 1 ;
170+
171+ if (clear_address_counter == 'd512000 ) begin
172+ clear_flag <= 0 ;
173+ end
158174 end
159175
160176 end
@@ -171,12 +187,22 @@ always_ff @(posedge clock_in) begin
171187
172188 else begin
173189 if (displayed_buffer == BUFFER_A ) begin
174- display_ram_address_a <= pixel_read_address_in;
175- display_ram_address_b <= pixel_write_address_in;
190+ if (clear_flag == 1 ) begin
191+ display_ram_address_b <= clear_address_counter >> 1 ;
192+ end else begin
193+ display_ram_address_b <= pixel_write_address_in;
194+ end
195+
196+ display_ram_address_a <= pixel_read_address_in;
176197 end
177198
178199 else begin
179- display_ram_address_a <= pixel_write_address_in;
200+ if (clear_flag == 1 ) begin
201+ display_ram_address_a <= clear_address_counter >> 1 ;
202+ end else begin
203+ display_ram_address_a <= pixel_write_address_in;
204+ end
205+
180206 display_ram_address_b <= pixel_read_address_in;
181207 end
182208 end
@@ -197,24 +223,31 @@ always_ff @(posedge clock_in) begin
197223
198224 else begin
199225 pixel_read_data_out <= display_ram_read_data_b;
200-
201226 end
202227
203228end
204229
205230// RAM writing logic
206231always_ff @ (posedge clock_in) begin
207232
208- display_ram_write_data <= pixel_write_data_in;
209-
210- // Select one of the four enables based on write address and selected buffer
211- display_ram_write_enable_a <= displayed_buffer == BUFFER_B &&
212- pixel_write_enable_in == 1
213- ? 1 : 0 ;
233+ if (clear_flag == 1 ) begin
234+ display_ram_write_data <= 0 ;
235+ end else begin
236+ display_ram_write_data <= pixel_write_data_in;
237+ end
214238
215- display_ram_write_enable_b <= displayed_buffer == BUFFER_A &&
216- pixel_write_enable_in == 1
217- ? 1 : 0 ;
239+ if (pixel_write_enable_in == 1 || clear_flag == 1 ) begin
240+ if (displayed_buffer == BUFFER_A ) begin
241+ display_ram_write_enable_a <= 0 ;
242+ display_ram_write_enable_b <= 1 ;
243+ end else begin
244+ display_ram_write_enable_a <= 1 ;
245+ display_ram_write_enable_b <= 0 ;
246+ end
247+ end else begin
248+ display_ram_write_enable_a <= 0 ;
249+ display_ram_write_enable_b <= 0 ;
250+ end
218251
219252end
220253
0 commit comments