Чтение файла и передача его через порт

Я пишу некоторый код, который требует, чтобы я прочитал файл и затем использовал его в качестве входных данных для модуля SystemC. Это означает, что я должен прочитать файл, скажем, abc.xxx, а затем отправить его содержимое в двоичном виде на порт (другой способ интерпретировать это: я хочу прочитать файл в буфер и отправить этот буфер через Порт SystemC). Мои вопросы:

1) Я мог бы использовать текстовый файл в качестве ввода. Прочитайте текстовый файл и сохраните его текстовое содержимое в виде строки (этого будет достаточно для моих целей). Но как мне отправить эту строку через порт systemC?

2) Приведенное выше решение предназначено только для текстовых файлов, где я хочу использовать текстовое содержимое текстового файла. Но как и в случае с моим исходным запросом, что я буду делать, если просто захочу передать файл через порт?

Я извиняюсь, если мой запрос не совсем понятен. Заранее спасибо!!

1 ответ

Решение

Если я правильно понимаю, вы хотели бы получить входные данные из файла в одном SC_MODULE и отправить его другому SC_MODULE, Вы не даете никаких ограничений, поэтому, предполагая, что вы хотите отправлять текст только с использованием двоичного кодирования ASCII, вы можете использовать целое число без знака sc_port с шириной 8 бит: sc_uint<8> отправить строку символ за символом.

Процедура отправки модуля.
Для правильной аппаратной передачи вам понадобятся сигналы квитирования:

  • сигнал готовности: sc_in<bool > Чтобы проверить, готов ли принимающий модуль к приему новых данных.
  • действительный сигнал: sc_out<bool > vld, чтобы сообщить принимающему модулю, что в порт поступили новые данные.
  • и порт данных sc_out<sc_int<8> > DataPat для отправки байтов. Остерегайтесь с использованием защищенного слова "данные".

Теперь давайте предположим, что вы хотите отправить текстовый файл с 10 символами, я думаю, что цикл for будет самым простым и интуитивно понятным способом сделать это. Поместите этот код в SC_THREAD, потому что он содержит управляющую логику, которую вы хотите выполнить только один раз. Предполагая, что тактовый период 10 нс для этого дизайна, вы получите что-то вроде этого:

// open file for reading
std::ifstream fp_in;
fp_in.open("data.txt", ios::in | ios::binary);
if (fp_in.is_open())
{
    cout  << "file opened for reading" << endl;
    fp_in.seekg(0, ios::beg ); // put file pointer to beginning of file
}
else {
    cout << "Unable to open data.txt for reading";
}

// read data from file and send
const int DATALENGHT = 10;
char buffer;
for(int i=0; i<DATALENGHT; ++i)
{
    while(rdy.read() != true) wait(10, SC_NS); // wait untill receiver is ready
    fp_in.read(buffer, 1);
    datap.write(buffer);
    vld.write(true);
    wait(10, SC_NS); // wait one clockcycle for the receiver to read it.
    vld.write(false);
    datap.write(0);   
}
fp_in.close();
Другие вопросы по тегам