Skryppy 0 14 марта, 2017 Опубликовано 14 марта, 2017 · Жалоба Здравствуйте. Сделал в Vivado HLS проект: #include "ap_int.h" void test( int data_in1, int data_in2, int command, int *data_out1, int *data_out2 ) { #pragma HLS INTERFACE ap_vld port=data_in1 #pragma HLS INTERFACE ap_vld port=data_in2 #pragma HLS INTERFACE ap_vld port=command #pragma HLS INTERFACE ap_vld port=data_out1 #pragma HLS INTERFACE ap_vld port=data_out2 static bool flag; if (command == 1){ flag = true; } if (command != 0 && command != 1){ flag = false; } if (flag == true){ *data_out1 = data_in1; }else{ *data_out2 = data_in2; } } Не могу понять, как сделать порты data_in1 и data_in2 независимыми друг от друга. Когда сигналы valid data_in1 и data_in2 =1, то все работает нормально Но если valid data_in2 = 0, то на выход не подается и data_in1, хотя по идеи они независимые Пытался делать их в разных if-else блоках, итог такой же. Может кто сталкивался с такой проблемой? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 14 марта, 2017 Опубликовано 14 марта, 2017 · Жалоба Приветствую! Тут все как и должно быть - у Вас начальное значение flag== false поэтому пока не появится data_in2_valid НЕ закончится цикл вывода в data_out2. Удачи! Rob. P.S. Очень характерный пример разницы между soft и RTL мышлением. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Skryppy 0 14 марта, 2017 Опубликовано 14 марта, 2017 · Жалоба Спасибо, но все равно не понятно, как сделать порты независимыми. Добавил еще flag, но все равно нет данных: static bool flag1 = true; static bool flag2 = true; if (command == 1){ flag1 = true; } if (command == 1){ flag2 = false; } if (command != 0 && command != 1){ flag1 = false; } if (command != 0 && command != 1){ flag2 = true; } if (flag1 == true){ *data_out1 = data_in1; } if(flag2 == true){ *data_out2 = data_in2; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexadmin 0 14 марта, 2017 Опубликовано 14 марта, 2017 · Жалоба Спасибо, но все равно не понятно, как сделать порты независимыми. Добавил еще flag, но все равно нет данных: Чтобы сделать порты независимыми надо реализовать их в разных функциях. И запускать их в независимых процессах ;) В данном случае функция при очередном запуске упирается в отсуствие данных по одному из аргументов и ОСТАНАВЛИВАЕТСЯ. Т.е. ждет, пока данные не появятся. Все что при этом происходит по другому порту-аргументу ее сейчас не интересует. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 14 марта, 2017 Опубликовано 14 марта, 2017 · Жалоба Приветствую! Спасибо, но все равно не понятно, как сделать порты независимыми. Добавил еще flag, но все равно нет данных: Для начала самому понять (да и нам объяснить подробнее) какой алгоритм работы этой функции Вы хотите получить. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Skryppy 0 14 марта, 2017 Опубликовано 14 марта, 2017 (изменено) · Жалоба Алгоритм этой функции простой - коммутировать данные на выход при наличии команды. просто valid сигналов данных data_in1 и data_in2 может быть разный. Сделал функции my_func1, my_func2. Но результат тот же. Я не пойму как засунуть функции в параллельные процессы #include "ap_int.h" void my_func1(int data_in, int command, int *data_out) { static bool flag; if (command == 1){ flag = true; } if (command != 0 && command != 1){ flag = false; } if (flag == true){ *data_out = data_in; }else{ } } void my_func2(int data_in, int command, int *data_out) { static bool flag; if (command == 1){ flag = false; } if (command != 0 && command != 1){ flag = true; } if (flag == true){ *data_out = data_in; }else{ } } void test( int data_in1, int data_in2, int command, int *data_out1, int *data_out2 ) { #pragma HLS INTERFACE ap_vld port=data_in1 #pragma HLS INTERFACE ap_vld port=data_in2 #pragma HLS INTERFACE ap_vld port=command #pragma HLS INTERFACE ap_vld port=data_out1 #pragma HLS INTERFACE ap_vld port=data_out2 #pragma HLS PIPELINE II=1 my_func1(data_in1, command, data_out1); my_func2(data_in2, command, data_out2); } Изменено 14 марта, 2017 пользователем Skryppy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 14 марта, 2017 Опубликовано 14 марта, 2017 · Жалоба P.s. В спойлер почему-то текст не убирается(на телефоне отображается спойлер кракозябрами)Какой спойлер? Используйте тег codebox. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Skryppy 0 14 марта, 2017 Опубликовано 14 марта, 2017 (изменено) · Жалоба Спасибо, отредактировал сообщение. Использовал директивы inline, unroll, pipeline,dataflow. Так и не смог отвязаться от valid data_in2. Изменено 14 марта, 2017 пользователем Skryppy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 14 марта, 2017 Опубликовано 14 марта, 2017 · Жалоба Приветствую! Алгоритм этой функции простой - коммутировать данные на выход при наличии команды. просто valid сигналов данных data_in1 и data_in2 может быть разный. ... Увы это только часть требований - нужно уяснить что: Так как ВСЕ входы у Вас "синхронные" (требуют handshake) то не может быть полностью "параллельного" процессов. По алгоритму получается что сначала ждем command, а затем ждем либо data_in1 && data_out1 либо data_in2 && data_out2 к тому же ... my_func1(data_in1, command, data_out1); my_func2(data_in2, command, data_out2); .. будут выполнятся ПОСЛЕДОВАТЕЛЬНО так как будет 2 независимых чтения из command можно сначала считать command во временную переменную ... int command_temp=command; ... и вызвыть функции с ней объявив аргумент command в функциях как порт без handshake Однако и при этом будут зависимости от готовности входных/выходных портов Увы - описать ПОЛНОСТЬЮ параллельные процессы на последовательном языке невозможно. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Skryppy 0 14 марта, 2017 Опубликовано 14 марта, 2017 · Жалоба Понятно. Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Skryppy 0 14 марта, 2017 Опубликовано 14 марта, 2017 · Жалоба Заработало. Внес директиву #pragma HLS INLINE внутрь каждой функции- my_func1, my_func2. Спасибо всем за помощь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться