Skip to content

Commit 5e95f71

Browse files
committed
Fix Sobel module bug with indexing data and add the testing of proccessing all the image
1 parent 7e81c6a commit 5e95f71

File tree

4 files changed

+213
-24
lines changed

4 files changed

+213
-24
lines changed

modules/VirtualPrototype/FreeRTOS/freertos_test.c

Lines changed: 205 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -57,30 +57,219 @@ static void task_3(void *pParameter) {
5757

5858
}
5959

60+
void transfer_window(int i, int j, unsigned long long source_address, unsigned long long target_address)
61+
{
62+
unsigned char *source_ptr = (unsigned char *) source_address;
63+
unsigned char *target_ptr = (unsigned char *) target_address;
64+
unsigned char local_window[9];
65+
unsigned char read_ptr[3];
66+
67+
if ((i == 0) && (j == 0)) // Upper left corner of the image
68+
{
69+
// First row
70+
*(local_window ) = 0;
71+
*(local_window + 1) = 0;
72+
*(local_window + 2) = 0;
73+
// Second row
74+
memcpy(read_ptr, source_ptr, 2 * sizeof(char));
75+
*(local_window + 3) = 0;
76+
*(local_window + 4) = *(read_ptr );
77+
*(local_window + 5) = *(read_ptr + 1);
78+
// Third row
79+
memcpy(read_ptr, source_ptr + IMAG_COLS, 2 * sizeof(char));
80+
*(local_window + 6) = 0;
81+
*(local_window + 7) = *(read_ptr );
82+
*(local_window + 8) = *(read_ptr + 1);
83+
}
84+
else if ((i == 0) && (j == IMAG_COLS - 1)) // Upper right corner of the image
85+
{
86+
// First row
87+
*(local_window ) = 0;
88+
*(local_window + 1) = 0;
89+
*(local_window + 2) = 0;
90+
// Second row
91+
memcpy(read_ptr, source_ptr + (IMAG_COLS - 2), 2 * sizeof(char));
92+
*(local_window + 3) = *(read_ptr );
93+
*(local_window + 4) = *(read_ptr + 1);
94+
*(local_window + 5) = 0;
95+
// Third row
96+
memcpy(read_ptr, source_ptr + (IMAG_COLS + (IMAG_COLS - 2)), 2 * sizeof(char));
97+
*(local_window + 6) = *(read_ptr );
98+
*(local_window + 7) = *(read_ptr + 1);
99+
*(local_window + 8) = 0;
100+
}
101+
else if (i == 0) // Upper border
102+
{
103+
// First row
104+
*(local_window ) = 0;
105+
*(local_window + 1) = 0;
106+
*(local_window + 2) = 0;
107+
// Second row
108+
memcpy(read_ptr, source_ptr + (j - 1), 3 * sizeof(char));
109+
*(local_window + 3) = *(read_ptr );
110+
*(local_window + 4) = *(read_ptr + 1);
111+
*(local_window + 5) = *(read_ptr + 2);
112+
// Third row
113+
memcpy(read_ptr, source_ptr + (IMAG_COLS + (j - 1)), 3 * sizeof(char));
114+
*(local_window + 6) = *(read_ptr );
115+
*(local_window + 7) = *(read_ptr + 1);
116+
*(local_window + 8) = *(read_ptr + 2);
117+
}
118+
else if ((i == IMAG_ROWS - 1) && (j == 0)) // Lower left corner of the image
119+
{
120+
// First row
121+
memcpy(read_ptr, source_ptr + ((IMAG_ROWS - 2) * IMAG_COLS), 2 * sizeof(char));
122+
*(local_window ) = 0;
123+
*(local_window + 1) = *(read_ptr );
124+
*(local_window + 2) = *(read_ptr + 1);
125+
// Second row
126+
memcpy(read_ptr, source_ptr + ((IMAG_ROWS - 1) * IMAG_COLS), 2 * sizeof(char));
127+
*(local_window + 3) = 0;
128+
*(local_window + 4) = *(read_ptr );
129+
*(local_window + 5) = *(read_ptr + 1);
130+
// Third row
131+
*(local_window + 6) = 0;
132+
*(local_window + 7) = 0;
133+
*(local_window + 8) = 0;
134+
}
135+
else if ((i == IMAG_ROWS - 1) && (j == IMAG_COLS - 1)) // Lower right corner of the image
136+
{
137+
// First row
138+
memcpy(read_ptr, source_ptr + (((IMAG_ROWS - 2) * IMAG_COLS) + (IMAG_COLS - 2)), 2 * sizeof(char));
139+
*(local_window ) = *(read_ptr );
140+
*(local_window + 1) = *(read_ptr + 1);
141+
*(local_window + 2) = 0;
142+
// Second row
143+
memcpy(read_ptr, source_ptr + (((IMAG_ROWS - 1) * IMAG_COLS) + (IMAG_COLS - 2)), 2 * sizeof(char));
144+
*(local_window + 3) = *(read_ptr );
145+
*(local_window + 4) = *(read_ptr + 1);
146+
*(local_window + 5) = 0;
147+
// Third row
148+
*(local_window + 6) = 0;
149+
*(local_window + 7) = 0;
150+
*(local_window + 8) = 0;
151+
}
152+
else if (i == IMAG_ROWS - 1) // Lower border of the image
153+
{
154+
// First row
155+
memcpy(read_ptr, source_ptr + (((IMAG_ROWS - 2) * IMAG_COLS) + (j - 1)), 3 * sizeof(char));
156+
*(local_window ) = *(read_ptr );
157+
*(local_window + 1) = *(read_ptr + 1);
158+
*(local_window + 2) = *(read_ptr + 2);
159+
// Second row
160+
memcpy(read_ptr, source_ptr + (((IMAG_ROWS - 1) * IMAG_COLS) + (j - 1)), 3 * sizeof(char));
161+
*(local_window + 3) = *(read_ptr );
162+
*(local_window + 4) = *(read_ptr + 1);
163+
*(local_window + 5) = *(read_ptr + 2);
164+
// Third row
165+
*(local_window + 6) = 0;
166+
*(local_window + 7) = 0;
167+
*(local_window + 8) = 0;
168+
}
169+
else if (j == 0) // Left border of the image
170+
{
171+
// First row
172+
memcpy(read_ptr, source_ptr + ((i - 1) * IMAG_COLS), 2 * sizeof(char));
173+
*(local_window ) = 0;
174+
*(local_window + 1) = *(read_ptr );
175+
*(local_window + 2) = *(read_ptr + 1);
176+
// Second row
177+
memcpy(read_ptr, source_ptr + (i * IMAG_COLS), 2 * sizeof(char));
178+
*(local_window + 3) = 0;
179+
*(local_window + 4) = *(read_ptr );
180+
*(local_window + 5) = *(read_ptr + 1);
181+
// Third row
182+
memcpy(read_ptr, source_ptr + ((i + 1) * IMAG_COLS), 2 * sizeof(char));
183+
*(local_window + 6) = 0;
184+
*(local_window + 7) = *(read_ptr );
185+
*(local_window + 8) = *(read_ptr + 1);
186+
}
187+
else if (j == IMAG_COLS - 1) // Right border of the image
188+
{
189+
// First row
190+
memcpy(read_ptr, source_ptr + (((i - 1) * IMAG_COLS) + (j - 1)), 2 * sizeof(char));
191+
*(local_window ) = *(read_ptr );
192+
*(local_window + 1) = *(read_ptr + 1);
193+
*(local_window + 2) = 0;
194+
// Second row
195+
memcpy(read_ptr, source_ptr + ((i * IMAG_COLS) + (j - 1)), 2 * sizeof(char));
196+
*(local_window + 3) = *(read_ptr );
197+
*(local_window + 4) = *(read_ptr + 1);
198+
*(local_window + 5) = 0;
199+
// Third row
200+
memcpy(read_ptr, source_ptr + (((i + 1) * IMAG_COLS) + (j - 1)), 2 * sizeof(char));
201+
*(local_window + 6) = *(read_ptr );
202+
*(local_window + 7) = *(read_ptr + 1);
203+
*(local_window + 8) = 0;
204+
}
205+
else // Rest of the image
206+
{
207+
// First row
208+
memcpy(read_ptr, source_ptr + (((i - 1) * IMAG_COLS) + (j - 1)), 3 * sizeof(char));
209+
*(local_window ) = *(read_ptr );
210+
*(local_window + 1) = *(read_ptr + 1);
211+
*(local_window + 2) = *(read_ptr + 2);
212+
// Second row
213+
memcpy(read_ptr, source_ptr + ((i * IMAG_COLS) + (j - 1)), 3 * sizeof(char));
214+
*(local_window + 3) = *(read_ptr );
215+
*(local_window + 4) = *(read_ptr + 1);
216+
*(local_window + 5) = *(read_ptr + 2);
217+
// Third row
218+
memcpy(read_ptr, source_ptr + (((i + 1) * IMAG_COLS) + (j - 1)), 3 * sizeof(char));
219+
*(local_window + 6) = *(read_ptr );
220+
*(local_window + 7) = *(read_ptr + 1);
221+
*(local_window + 8) = *(read_ptr + 2);
222+
}
223+
224+
if (((i == 0 || i == IMAG_ROWS - 1) && (j < 2 || j > IMAG_COLS - 3)) || ((j == 0 || j == IMAG_COLS -1) && (i < 2 || i > IMAG_ROWS - 3)))
225+
{
226+
printf("Window %0d %0d:\n\t%5d %5d %5d\n\t%5d %5d %5d\n\t%5d %5d %5d\n", i, j, local_window[0], local_window[1], local_window[2], local_window[3],local_window[4], local_window[5], local_window[6], local_window[7], local_window[8]);
227+
}
228+
229+
memcpy(target_ptr, local_window, 9 * sizeof(char));
230+
}
231+
60232
static void task_test_sobel(void *pParameter)
61233
{
62234
unsigned char *sobel_input_0_ptr = (unsigned char*) SOBEL_INPUT_0_ADDRESS_LO;
63235
unsigned char *sobel_input_1_ptr = (unsigned char*) SOBEL_INPUT_1_ADDRESS_LO;
64236
short int *sobel_output_ptr = (short int*) SOBEL_OUTPUT_ADDRESS_LO;
237+
short int *output_image_X_ptr = (short int*) IMG_INPROCESS_B_ADDRESS_LO;
238+
short int *output_image_Y_ptr = (short int*) IMG_INPROCESS_C_ADDRESS_LO;
65239
unsigned char local_window[3 * 3];
66240
short int sobel_results[2];
67241

68-
printf("Starting with SOBEL testing on address %p\n", (void*)sobel_input_0_ptr);
69-
*(local_window + 0) = 150;
70-
*(local_window + 1) = 20;
71-
*(local_window + 2) = 38;
72-
*(local_window + 3) = 64;
73-
*(local_window + 4) = 32;
74-
*(local_window + 5) = 8;
75-
*(local_window + 6) = 16;
76-
*(local_window + 7) = 75;
77-
*(local_window + 8) = 99;
78-
printf("Will copy values to SOBEL on address %p\n", (void*)sobel_input_0_ptr);
79-
memcpy(sobel_input_0_ptr, local_window, 8 * sizeof(char));
80-
printf("Will copy values to SOBEL on address %p\n", (void*)sobel_input_1_ptr);
81-
memcpy(sobel_input_1_ptr, (local_window + 8), 1 * sizeof(char));
82-
memcpy(sobel_results, sobel_output_ptr, 2 * sizeof(short int));
83-
printf("Results of SOBEL are %d at address %p and %d at address %p\n", sobel_results[0], (void*)sobel_output_ptr, sobel_results[1], (void*)(sobel_output_ptr + 1));
242+
// printf("Starting with SOBEL testing on address %p\n", (void*)sobel_input_0_ptr);
243+
// *(local_window + 0) = 150;
244+
// *(local_window + 1) = 20;
245+
// *(local_window + 2) = 38;
246+
// *(local_window + 3) = 64;
247+
// *(local_window + 4) = 32;
248+
// *(local_window + 5) = 8;
249+
// *(local_window + 6) = 16;
250+
// *(local_window + 7) = 75;
251+
// *(local_window + 8) = 99;
252+
// printf("Will copy values to SOBEL on address %p\n", (void*)sobel_input_0_ptr);
253+
// memcpy(sobel_input_0_ptr, local_window, 8 * sizeof(char));
254+
// printf("Will copy values to SOBEL on address %p\n", (void*)sobel_input_1_ptr);
255+
// memcpy(sobel_input_1_ptr, (local_window + 8), 1 * sizeof(char));
256+
// memcpy(sobel_results, sobel_output_ptr, 2 * sizeof(short int));
257+
// printf("Results of SOBEL are %d at address %p and %d at address %p\n", sobel_results[0], (void*)sobel_output_ptr, sobel_results[1], (void*)(sobel_output_ptr + 1));
258+
259+
printf("Starting to process of image with Sobel gradient\n");
260+
261+
for (int i = 0; i < IMAG_ROWS; i++)
262+
{
263+
for (int j = 0; j < IMAG_COLS; j++)
264+
{
265+
transfer_window(i, j, IMG_COMPRESSED_ADDRESS_LO, SOBEL_INPUT_0_ADDRESS_LO);
266+
memcpy(sobel_results, sobel_output_ptr, 2 * sizeof(short int));
267+
*(output_image_X_ptr + ((i * IMAG_COLS) + j)) = sobel_results[0];
268+
*(output_image_Y_ptr + ((i * IMAG_COLS) + j)) = sobel_results[1];
269+
}
270+
}
271+
272+
printf("Finished process of image with Sobel gradient\n");
84273
}
85274

86275
int main( void )

modules/VirtualPrototype/src/Simulator.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -287,11 +287,11 @@ SC_MODULE(Simulator) {
287287
}
288288
else if (*(value_ptr + ((i * IMAG_COLS) + j)) < 0)
289289
{
290-
*(img_ptr + ((i * IMAG_COLS) + j)) = -*(value_ptr + ((i * IMAG_COLS) + j));
290+
*(img_ptr + ((i * IMAG_COLS) + j)) = (unsigned char)(-*(value_ptr + ((i * IMAG_COLS) + j)));
291291
}
292292
else
293293
{
294-
*(img_ptr + ((i * IMAG_COLS) + j)) = *(value_ptr + ((i * IMAG_COLS) + j));
294+
*(img_ptr + ((i * IMAG_COLS) + j)) = (unsigned char)(*(value_ptr + ((i * IMAG_COLS) + j)));
295295
}
296296
}
297297
}
@@ -312,11 +312,11 @@ SC_MODULE(Simulator) {
312312
}
313313
else if (*(value_ptr + ((i * IMAG_COLS) + j)) < 0)
314314
{
315-
*(img_ptr + ((i * IMAG_COLS) + j)) = -*(value_ptr + ((i * IMAG_COLS) + j));
315+
*(img_ptr + ((i * IMAG_COLS) + j)) = (unsigned char)(-*(value_ptr + ((i * IMAG_COLS) + j)));
316316
}
317317
else
318318
{
319-
*(img_ptr + ((i * IMAG_COLS) + j)) = *(value_ptr + ((i * IMAG_COLS) + j));
319+
*(img_ptr + ((i * IMAG_COLS) + j)) = (unsigned char)(*(value_ptr + ((i * IMAG_COLS) + j)));
320320
}
321321
}
322322
}

modules/VirtualPrototype/src/sobel_edge_detector_tlm.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ void sobel_edge_detector_tlm::wr()
109109
}
110110
else if ((Edge_Detector::address >= SOBEL_INPUT_1_ADDRESS_LO) && (Edge_Detector::address < SOBEL_INPUT_1_ADDRESS_HI))
111111
{
112-
localWindow[2][2] = data.range(8, 0);
112+
localWindow[2][2] = data.range(7, 0);
113113
gotLocalWindow.notify(0, SC_NS);
114114
}
115115
}

modules/router/src/tb_edge_detector_tlm.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -892,7 +892,7 @@ int sc_main(int, char*[])
892892
sc_trace(wf, top.edge_detector_DUT->localWindow[1][0], "sobel_localWindow(1)(0)");
893893
sc_trace(wf, top.edge_detector_DUT->localWindow[1][1], "sobel_localWindow(1)(1)");
894894
sc_trace(wf, top.edge_detector_DUT->localWindow[1][2], "sobel_localWindow(1)(2)");
895-
sc_trace(wf, top.edge_detector_DUT->localWindow[2][0], "sobel_localWindow(0)(0)");
895+
sc_trace(wf, top.edge_detector_DUT->localWindow[2][0], "sobel_localWindow(2)(0)");
896896
sc_trace(wf, top.edge_detector_DUT->localWindow[2][1], "sobel_localWindow(2)(1)");
897897
sc_trace(wf, top.edge_detector_DUT->localWindow[2][2], "sobel_localWindow(2)(2)");
898898
sc_trace(wf, top.edge_detector_DUT->localMultX[0][0], "sobel_localMultX(0)(0)");
@@ -901,7 +901,7 @@ int sc_main(int, char*[])
901901
sc_trace(wf, top.edge_detector_DUT->localMultX[1][0], "sobel_localMultX(1)(0)");
902902
sc_trace(wf, top.edge_detector_DUT->localMultX[1][1], "sobel_localMultX(1)(1)");
903903
sc_trace(wf, top.edge_detector_DUT->localMultX[1][2], "sobel_localMultX(1)(2)");
904-
sc_trace(wf, top.edge_detector_DUT->localMultX[2][0], "sobel_localMultX(0)(0)");
904+
sc_trace(wf, top.edge_detector_DUT->localMultX[2][0], "sobel_localMultX(2)(0)");
905905
sc_trace(wf, top.edge_detector_DUT->localMultX[2][1], "sobel_localMultX(2)(1)");
906906
sc_trace(wf, top.edge_detector_DUT->localMultX[2][2], "sobel_localMultX(2)(2)");
907907
sc_trace(wf, top.edge_detector_DUT->localMultY[0][0], "sobel_localMultY(0)(0)");
@@ -910,7 +910,7 @@ int sc_main(int, char*[])
910910
sc_trace(wf, top.edge_detector_DUT->localMultY[1][0], "sobel_localMultY(1)(0)");
911911
sc_trace(wf, top.edge_detector_DUT->localMultY[1][1], "sobel_localMultY(1)(1)");
912912
sc_trace(wf, top.edge_detector_DUT->localMultY[1][2], "sobel_localMultY(1)(2)");
913-
sc_trace(wf, top.edge_detector_DUT->localMultY[2][0], "sobel_localMultY(0)(0)");
913+
sc_trace(wf, top.edge_detector_DUT->localMultY[2][0], "sobel_localMultY(2)(0)");
914914
sc_trace(wf, top.edge_detector_DUT->localMultY[2][1], "sobel_localMultY(2)(1)");
915915
sc_trace(wf, top.edge_detector_DUT->localMultY[2][2], "sobel_localMultY(2)(2)");
916916
sc_trace(wf, top.edge_detector_DUT->resultSobelGradientX, "sobel_resultSobelGradientX");

0 commit comments

Comments
 (0)