Skip to content

Commit 0f48930

Browse files
committed
Add Ethernet decoder to verify the transmision of the image
1 parent a1001fc commit 0f48930

File tree

11 files changed

+202
-21
lines changed

11 files changed

+202
-21
lines changed

modules/VirtualPrototype/FreeRTOS/freertos_test.c

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,8 @@ void obtain_gradients_sobel()
199199

200200
int final_target = IMAG_ROWS * IMAG_COLS;
201201
int current_progress = 0;
202-
int step = final_target / 10;
202+
int step_percent = 2;
203+
int step = final_target / (100 / step_percent);
203204
int next_target = 1;
204205

205206
printf("Starting IMG Sobel Step: \n");
@@ -215,7 +216,7 @@ void obtain_gradients_sobel()
215216

216217
if (current_progress == next_target * step)
217218
{
218-
printf("\tCurrent progress is at %0d%%\n", next_target * 10);
219+
printf("\tCurrent progress is at %0d%%\n", next_target * step_percent);
219220
next_target++;
220221
}
221222
current_progress++;
@@ -239,7 +240,8 @@ void convert_to_grayscale()
239240

240241
int final_target = IMAG_ROWS * IMAG_COLS;
241242
int current_progress = 0;
242-
int step = final_target / 10;
243+
int step_percent = 2;
244+
int step = final_target / (100 / step_percent);
243245
int next_target = 1;
244246

245247
printf("Starting IMG Grayscale Step: \n");
@@ -262,7 +264,7 @@ void convert_to_grayscale()
262264

263265
if (current_progress == next_target * step)
264266
{
265-
printf("\tCurrent progress is at %0d%%\n", next_target * 10);
267+
printf("\tCurrent progress is at %0d%%\n", next_target * step_percent);
266268
next_target++;
267269
}
268270
current_progress++;
@@ -279,7 +281,8 @@ void filter_image()
279281

280282
int final_target = IMAG_ROWS * IMAG_COLS;
281283
int current_progress = 0;
282-
int step = final_target / 10;
284+
int step_percent = 2;
285+
int step = final_target / (100 / step_percent);
283286
int next_target = 1;
284287

285288
printf("Starting IMG Filtering Step: \n");
@@ -293,7 +296,7 @@ void filter_image()
293296

294297
if (current_progress == next_target * step)
295298
{
296-
printf("\tCurrent progress is at %0d%%\n", next_target * 10);
299+
printf("\tCurrent progress is at %0d%%\n", next_target * step_percent);
297300
next_target++;
298301
}
299302
current_progress++;
@@ -332,7 +335,8 @@ void unificate_img()
332335

333336
int final_target = IMAG_ROWS * IMAG_COLS;
334337
int current_progress = 0;
335-
int step = final_target / 10;
338+
int step_percent = 2;
339+
int step = final_target / (100 / step_percent);
336340
int next_target = 1;
337341

338342
printf("Starting IMG Unification Step: \n");
@@ -358,7 +362,7 @@ void unificate_img()
358362

359363
if (current_progress == next_target * step)
360364
{
361-
printf("\tCurrent progress is at %0d%%\n", next_target * 10);
365+
printf("\tCurrent progress is at %0d%%\n", next_target * step_percent);
362366
next_target++;
363367
}
364368
current_progress++;
@@ -412,11 +416,17 @@ void save_image_from_mem(int image_id)
412416
}
413417

414418
static void testbench(void *pParameter) {
415-
// convert_to_grayscale();
419+
convert_to_grayscale();
416420

417-
// filter_image();
421+
save_image_from_mem(1);
418422

419-
// obtain_gradients_sobel();
423+
filter_image();
424+
425+
save_image_from_mem(2);
426+
427+
obtain_gradients_sobel();
428+
429+
save_image_from_mem(3);
420430

421431
unificate_img();
422432

@@ -427,6 +437,8 @@ static void testbench(void *pParameter) {
427437
save_image_from_mem(5);
428438

429439
transmit_data(IMAG_ROWS * IMAG_COLS);
440+
441+
save_image_from_mem(6);
430442
}
431443

432444
int main( void )
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#ifndef ETHERNET_DECODER_TLM_H
2+
#define ETHERNET_DECODER_TLM_H
3+
4+
#include <systemc-ams.h>
5+
6+
#include "important_defines.hpp"
7+
#include "ethernetDecoder.h"
8+
9+
struct ethernetDecoder_tlm : public ethernetDecoder
10+
{
11+
void processing() override;
12+
13+
ethernetDecoder_tlm(sc_module_name name, sca_core::sca_time sample_time) : ethernetDecoder((std::string(name) + "_AMS_HW_block").c_str(), sample_time)
14+
{
15+
data = new unsigned char[IMAG_ROWS * IMAG_COLS];
16+
}
17+
18+
unsigned char *data;
19+
20+
sc_dt::sc_bv<8> decoded_byte;
21+
};
22+
23+
#endif // ETHERNET_DECODER_TLM_H

modules/VirtualPrototype/include/img_saver_tlm.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ struct img_saver_tlm: public img_target
2323
unsigned char *img_inprocess_c_ptr;
2424
unsigned char *img_inprocess_d_ptr;
2525
unsigned char *img_output_ptr;
26+
unsigned char *img_output_dec_ptr;
2627
};
2728

2829
#endif // IMG_SAVER_TLM_HPP

modules/VirtualPrototype/src/Simulator.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
#include "img_receiver_tlm.hpp"
3838
#include "packetGenerator_tlm.hpp"
3939
#include "ethernetEncoder.h"
40+
#include "ethernetDecoder_tlm.hpp"
4041
#include "img_saver_tlm.hpp"
4142

4243
struct Ethernet_AMS_Signals {
@@ -66,6 +67,8 @@ struct Ethernet_AMS_Signals {
6667
sca_tdf::sca_signal<sc_dt::sc_int<4>> sigBitCount;
6768

6869
sca_tdf::sca_signal<sc_dt::sc_int<32>> remaining_bytes_to_send;
70+
71+
sca_tdf::sca_signal<sc_dt::sc_bv<4>> data_out_signal;
6972
};
7073

7174
std::string filename;
@@ -94,6 +97,7 @@ SC_MODULE(Simulator) {
9497
img_receiver_tlm *receiver_DUT;
9598
packetGenerator_tlm *packetGenerator_DUT;
9699
ethernetEncoder *ethernetEncoder_DUT;
100+
ethernetDecoder_tlm *ethernetDecoder_DUT;
97101
img_saver_tlm *img_saver_DUT;
98102

99103
Ethernet_AMS_Signals ethernetSignals;
@@ -118,6 +122,7 @@ SC_MODULE(Simulator) {
118122
receiver_DUT = new img_receiver_tlm("receiver_DUT");
119123
packetGenerator_DUT = new packetGenerator_tlm("packetGenerator_DUT", use_prints, sample_time);
120124
ethernetEncoder_DUT = new ethernetEncoder("ethernetEncoder_DUT", sample_time);
125+
ethernetDecoder_DUT = new ethernetDecoder_tlm("ethernetDecoder_DUT", sample_time);
121126
img_saver_DUT = new img_saver_tlm("img_saver_DUT");
122127

123128
// Connecting the signals to ethernet modules
@@ -150,6 +155,9 @@ SC_MODULE(Simulator) {
150155
ethernetEncoder_DUT->mlt3_out(ethernetSignals.mlt3_out_signal);
151156
ethernetEncoder_DUT->valid(ethernetSignals.data_out_valid);
152157

158+
ethernetDecoder_DUT->mlt3_in(ethernetSignals.mlt3_out_signal);
159+
ethernetDecoder_DUT->data_out(ethernetSignals.data_out_signal);
160+
153161
cpu->instr_bus.bind(Bus->cpu_instr_socket);
154162
cpu->mem_intf->data_bus.bind(Bus->cpu_data_socket);
155163

@@ -173,6 +181,7 @@ SC_MODULE(Simulator) {
173181
img_saver_DUT->img_inprocess_c_ptr = MainMemory->get_pointer_to_mem_region(IMG_INPROCESS_C_ADDRESS_LO);
174182
img_saver_DUT->img_inprocess_d_ptr = MainMemory->get_pointer_to_mem_region(IMG_INPROCESS_D_ADDRESS_LO);
175183
img_saver_DUT->img_output_ptr = packetGenerator_DUT->tmp_data;
184+
img_saver_DUT->img_output_dec_ptr = ethernetDecoder_DUT->data;
176185

177186
if (debug_session) {
178187
Debug debug(cpu, MainMemory);
@@ -597,6 +606,7 @@ int sc_main(int argc, char *argv[]) {
597606
sca_util::sca_trace(wf_ams, top->ethernetSignals.mlt3_out_signal, "mlt3_out");
598607
sca_util::sca_trace(wf_ams, top->ethernetSignals.data_out_valid, "data_out_valid");
599608
sca_util::sca_trace(wf_ams, top->ethernetSignals.data_out, "data_out");
609+
sca_util::sca_trace(wf_ams, top->ethernetSignals.data_out_signal, "data_out_decoded");
600610
// sca_util::sca_trace(wf_ams, top->ethernetSignals.data_in, "pkt_gen_data_in");
601611
// sca_util::sca_trace(wf_ams, top->ethernetSignals.data_in_valid, "pkt_gen_data_in_valid");
602612
// sca_util::sca_trace(wf_ams, top->ethernetSignals.n2_data_valid, "pkt_gen_n2_data_valid");
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
#ifndef ETHERNET_DECODER_TLM_CPP
2+
#define ETHERNET_DECODER_TLM_CPP
3+
4+
#include "ethernetDecoder_tlm.hpp"
5+
6+
void ethernetDecoder_tlm::processing()
7+
{
8+
current_level = static_cast<int>(mlt3_in.read());
9+
10+
if (found_sequence && bit_sequence.size() >= 5)
11+
{
12+
bit_sequence.clear();
13+
}
14+
15+
// MLT-3 to binary conversion based on level change
16+
if (current_level != previous_level)
17+
{
18+
bit_sequence.push_back('1');
19+
}
20+
else
21+
{
22+
bit_sequence.push_back('0');
23+
}
24+
25+
if (bit_sequence.size() > 80)
26+
{
27+
bit_sequence.pop_front();
28+
}
29+
30+
previous_level = current_level;
31+
bit_count++;
32+
33+
if (found_sequence && bit_sequence.size() >= 5)
34+
{
35+
std::string last_five_bits(bit_sequence.end() - 5, bit_sequence.end());
36+
37+
// 5B/4B decoding
38+
if (decoding_map.find(last_five_bits) != decoding_map.end())
39+
{
40+
std::string decoded_bits = decoding_map[last_five_bits];
41+
sc_dt::sc_bv<4> decoded_bv;
42+
decoded_bv = decoded_bits.c_str(); // Assign the value using operator=
43+
44+
// Store the first eight decodes
45+
if (!received_first_eight_decodes)
46+
{
47+
first_eight_decodes[decode_count] = decoded_bv;
48+
decode_count++;
49+
if (decode_count == 8)
50+
{
51+
data_length = (first_eight_decodes[7].to_uint() << 28) |
52+
(first_eight_decodes[6].to_uint() << 24) |
53+
(first_eight_decodes[5].to_uint() << 20) |
54+
(first_eight_decodes[4].to_uint() << 16) |
55+
(first_eight_decodes[3].to_uint() << 12) |
56+
(first_eight_decodes[2].to_uint() << 8) |
57+
(first_eight_decodes[1].to_uint() << 4) |
58+
first_eight_decodes[0].to_uint();
59+
received_first_eight_decodes = true;
60+
std::cout << "/////////////////////////////////Data length: " << std::hex << data_length << std::endl;
61+
62+
decode_count = 0;
63+
}
64+
}
65+
else
66+
{
67+
data_out.write(decoded_bv);
68+
69+
if ((decode_count < data_length * 2) && (decode_count / 2 < IMAG_ROWS * IMAG_COLS))
70+
{
71+
if (decode_count % 2 == 0)
72+
{
73+
decoded_byte.range(3, 0) = decoded_bv;
74+
}
75+
else
76+
{
77+
decoded_byte.range(7, 4) = decoded_bv;
78+
data[decode_count / 2] = static_cast<unsigned char>(decoded_byte.to_uint());
79+
}
80+
}
81+
82+
decode_count++;
83+
84+
if (decode_count >= data_length * 2)
85+
{
86+
// Reset state to wait for the sequence again
87+
found_sequence = false;
88+
received_first_eight_decodes = false;
89+
decode_count = 0;
90+
data_length = 0;
91+
}
92+
}
93+
bit_sequence.erase(bit_sequence.begin(), bit_sequence.begin() + 5);
94+
}
95+
else
96+
{
97+
std::cout << "last_five_bits:" << last_five_bits;
98+
99+
std::cout << "********Sample: " << sample_count << ", mlt3_in: " << current_level
100+
<< ", bit_sequence: " << std::string(bit_sequence.begin(), bit_sequence.end())
101+
<< ", found_sequence: " << found_sequence << std::endl;
102+
SC_REPORT_ERROR("ethernetDecoder", "Invalid input for decoding");
103+
}
104+
}
105+
106+
if (bit_sequence.size() == 80 && !found_sequence)
107+
{
108+
found_sequence = check_sequence(bit_sequence);
109+
}
110+
111+
sample_count++;
112+
}
113+
114+
#endif // ETHERNET_DECODER_TLM_CPP

modules/VirtualPrototype/src/img_saver_tlm.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,16 @@ void img_saver_tlm::do_when_write_transaction(unsigned char*&data, unsigned int
144144
memcpy(img_ptr, img_output_ptr, pixel_count);
145145
stbi_write_png("output_image_5.png", IMAG_COLS, IMAG_ROWS, channels, img_ptr, IMAG_COLS * channels);
146146

147+
dbgimgtarmodprint(true, "Saving results from memory in transmiter image");
148+
break;
149+
case 6:
150+
channels = 1;
151+
pixel_count = IMAG_COLS * IMAG_ROWS * channels;
152+
img_ptr = new unsigned char[pixel_count];
153+
154+
memcpy(img_ptr, img_output_dec_ptr, pixel_count);
155+
stbi_write_png("output_image_6.png", IMAG_COLS, IMAG_ROWS, channels, img_ptr, IMAG_COLS * channels);
156+
147157
dbgimgtarmodprint(true, "Saving results from memory in transmiter image");
148158
break;
149159
default:

modules/VirtualPrototype/src/ips_filter_tlm.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ void ips_filter_tlm::do_when_read_transaction(unsigned char*& data, unsigned int
2121

2222
this->img_result = *(Filter<IPS_IN_TYPE_TB, IPS_OUT_TYPE_TB, IPS_FILTER_KERNEL_SIZE>::result_ptr);
2323
*data = (unsigned char) this->img_result;
24+
25+
dbgimgtarmodprint(true, "Returning filter result %f", this->img_result);
2426
//memcpy(data, Filter<IPS_IN_TYPE_TB, IPS_OUT_TYPE_TB, IPS_FILTER_KERNEL_SIZE>::result_ptr, sizeof(IPS_OUT_TYPE_TB));
2527
}
2628

@@ -37,6 +39,8 @@ void ips_filter_tlm::do_when_write_transaction(unsigned char*& data, unsigned in
3739
//dbgimgtarmodprint(use_prints, "[DEBUG]: img_window data: %0f", this->img_window[address]);
3840

3941
if (address == 8) {
42+
dbgimgtarmodprint(true, "Got full window, starting filtering now");
43+
4044
filter(this->img_window, result);
4145
}
4246
}

modules/VirtualPrototype/src/packetGenerator_tlm.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ void packetGenerator_tlm::do_when_read_transaction(unsigned char*& data, unsigne
2424
if (packetGenerator::tmp_data_out_valid == true)
2525
{
2626
*data = 1;
27+
dbgimgtarmodprint(true, "Ethernet module still sending data, remaining bytes to send %0d", actual_data_length);
2728
}
2829
else
2930
{
@@ -49,7 +50,7 @@ void packetGenerator_tlm::do_when_write_transaction(unsigned char*& data, unsign
4950
unsigned char *data_length_ptr = (unsigned char *)&tmp_data_length;
5051
memcpy(data_length_ptr + address - IMG_OUTPUT_SIZE, data, data_length);
5152

52-
dbgimgtarmodprint(use_prints, "Current data_length %0d", tmp_data_length);
53+
dbgimgtarmodprint(true, "Current data_length %0d", tmp_data_length);
5354
}
5455
else if ((address >= IMG_OUTPUT_SIZE + IMG_OUTPUT_SIZE_SIZE) && (address < IMG_OUTPUT_SIZE + IMG_OUTPUT_SIZE_SIZE + IMG_OUTPUT_DONE_SIZE) && (*data == 1))
5556
{
@@ -59,7 +60,7 @@ void packetGenerator_tlm::do_when_write_transaction(unsigned char*& data, unsign
5960
tmp_data_length = 1;
6061
}
6162

62-
dbgimgtarmodprint(use_prints, "Preparing to send %0d bytes", tmp_data_length);
63+
dbgimgtarmodprint(true, "Preparing to send %0d bytes", tmp_data_length);
6364

6465
fill_data(tmp_data, (int)tmp_data_length);
6566

@@ -73,7 +74,7 @@ void packetGenerator_tlm::backdoor_write(unsigned char*&data, unsigned int data_
7374
sc_dt::uint64 local_address = address - IMG_OUTPUT_ADDRESS_LO;
7475
memcpy((tmp_data + local_address), data, data_length);
7576
for (int i = 0; (i < 10) && (local_address + i < IMG_OUTPUT_SIZE); i++) {
76-
dbgimgtarmodprint(use_prints, "Backdoor Writing: %0d\n", *(tmp_data + local_address + i));
77+
dbgimgtarmodprint(true, "Backdoor Writing: %0d\n", *(tmp_data + local_address + i));
7778
}
7879
}
7980

@@ -83,7 +84,7 @@ void packetGenerator_tlm::backdoor_read(unsigned char*&data, unsigned int data_l
8384
data = new unsigned char[data_length];
8485
memcpy(data, (tmp_data + local_address), data_length);
8586
for (int i = 0; (i < 10) && (local_address + i < IMG_OUTPUT_SIZE); i++) {
86-
dbgimgtarmodprint(use_prints, "Backdoor Reading: %0d\n", *(tmp_data + local_address + i));
87+
dbgimgtarmodprint(true, "Backdoor Reading: %0d\n", *(tmp_data + local_address + i));
8788
}
8889
}
8990

0 commit comments

Comments
 (0)