@@ -101,6 +101,9 @@ logic [3:0] display_ram_write_data;
101
101
logic display_ram_write_enable_a;
102
102
logic display_ram_write_enable_b;
103
103
104
+ logic clear_flag;
105
+ logic [18 : 0 ] clear_address_counter;
106
+
104
107
display_buffer buffer_a (
105
108
.clock (clock_in),
106
109
.reset_n (reset_n_in),
@@ -121,7 +124,7 @@ display_buffer buffer_b (
121
124
.write_enable (display_ram_write_enable_b)
122
125
);
123
126
124
- // Buffer switching logic
127
+ // Buffer switching & clearing logic
125
128
enum logic { BUFFER_A , BUFFER_B } displayed_buffer;
126
129
logic [1 : 0 ] switch_write_buffer_edge_monitor;
127
130
logic buffer_switch_pending;
@@ -132,6 +135,8 @@ always_ff @(posedge clock_in) begin
132
135
displayed_buffer <= BUFFER_A ;
133
136
switch_write_buffer_edge_monitor <= 'b00 ;
134
137
buffer_switch_pending <= 0 ;
138
+ clear_flag <= 0 ;
139
+ clear_address_counter <= 0 ;
135
140
end
136
141
137
142
else begin
@@ -155,6 +160,17 @@ always_ff @(posedge clock_in) begin
155
160
end
156
161
157
162
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
158
174
end
159
175
160
176
end
@@ -171,12 +187,22 @@ always_ff @(posedge clock_in) begin
171
187
172
188
else begin
173
189
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;
176
197
end
177
198
178
199
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
+
180
206
display_ram_address_b <= pixel_read_address_in;
181
207
end
182
208
end
@@ -197,24 +223,31 @@ always_ff @(posedge clock_in) begin
197
223
198
224
else begin
199
225
pixel_read_data_out <= display_ram_read_data_b;
200
-
201
226
end
202
227
203
228
end
204
229
205
230
// RAM writing logic
206
231
always_ff @ (posedge clock_in) begin
207
232
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
214
238
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
218
251
219
252
end
220
253
0 commit comments