Чтение файла и передача его через порт
Я пишу некоторый код, который требует, чтобы я прочитал файл и затем использовал его в качестве входных данных для модуля 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();