Перейти к содержанию
    

Vivado hls, проблема с valid сигналов

Здравствуйте. Сделал в 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, то все работает нормально

image.jpg

 

Но если valid data_in2 = 0, то на выход не подается и data_in1, хотя по идеи они независимые

image.jpg

 

Пытался делать их в разных if-else блоках, итог такой же.

Может кто сталкивался с такой проблемой?

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

 

Тут все как и должно быть - у Вас начальное значение flag== false поэтому пока не появится data_in2_valid НЕ закончится цикл вывода в data_out2.

 

Удачи! Rob.

 

P.S. Очень характерный пример разницы между soft и RTL мышлением.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, но все равно не понятно, как сделать порты независимыми. Добавил еще 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;

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, но все равно не понятно, как сделать порты независимыми. Добавил еще flag, но все равно нет данных:

 

Чтобы сделать порты независимыми надо реализовать их в разных функциях. И запускать их в независимых процессах ;)

В данном случае функция при очередном запуске упирается в отсуствие данных по одному из аргументов и ОСТАНАВЛИВАЕТСЯ. Т.е. ждет, пока данные не появятся. Все что при этом происходит по другому порту-аргументу ее сейчас не интересует.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

 

Спасибо, но все равно не понятно, как сделать порты независимыми. Добавил еще flag, но все равно нет данных:

 

Для начала самому понять (да и нам объяснить подробнее) какой алгоритм работы этой функции Вы хотите получить.

 

Удачи! Rob.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Алгоритм этой функции простой - коммутировать данные на выход при наличии команды.

просто 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);

}

 

Изменено пользователем Skryppy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

P.s. В спойлер почему-то текст не убирается(на телефоне отображается спойлер кракозябрами)
Какой спойлер? Используйте тег codebox.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, отредактировал сообщение.

Использовал директивы inline, unroll, pipeline,dataflow. Так и не смог отвязаться от valid data_in2.

Изменено пользователем Skryppy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

 

Алгоритм этой функции простой - коммутировать данные на выход при наличии команды.

просто 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Заработало. Внес директиву #pragma HLS INLINE внутрь каждой функции- my_func1, my_func2. Спасибо всем за помощь.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...