реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Vivado hls, проблема с valid сигналов, Проблема создания независимых портов данных
Skryppy
сообщение Mar 14 2017, 07:00
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 14-02-11
Пользователь №: 62 975



Здравствуйте. Сделал в 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 блоках, итог такой же.
Может кто сталкивался с такой проблемой?


Go to the top of the page
 
+Quote Post
RobFPGA
сообщение Mar 14 2017, 07:56
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 886
Регистрация: 23-12-04
Пользователь №: 1 643



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

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

Удачи! Rob.

P.S. Очень характерный пример разницы между soft и RTL мышлением.
Go to the top of the page
 
+Quote Post
Skryppy
сообщение Mar 14 2017, 08:56
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 14-02-11
Пользователь №: 62 975



Спасибо, но все равно не понятно, как сделать порты независимыми. Добавил еще 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;
}
Go to the top of the page
 
+Quote Post
alexadmin
сообщение Mar 14 2017, 09:01
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 503
Регистрация: 17-11-05
Из: СПб, Россия
Пользователь №: 10 965



Цитата(Skryppy @ Mar 14 2017, 11:56) *
Спасибо, но все равно не понятно, как сделать порты независимыми. Добавил еще flag, но все равно нет данных:


Чтобы сделать порты независимыми надо реализовать их в разных функциях. И запускать их в независимых процессах wink.gif
В данном случае функция при очередном запуске упирается в отсуствие данных по одному из аргументов и ОСТАНАВЛИВАЕТСЯ. Т.е. ждет, пока данные не появятся. Все что при этом происходит по другому порту-аргументу ее сейчас не интересует.
Go to the top of the page
 
+Quote Post
RobFPGA
сообщение Mar 14 2017, 09:09
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 886
Регистрация: 23-12-04
Пользователь №: 1 643



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

Цитата(Skryppy @ Mar 14 2017, 11:56) *
Спасибо, но все равно не понятно, как сделать порты независимыми. Добавил еще flag, но все равно нет данных:


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

Удачи! Rob.
Go to the top of the page
 
+Quote Post
Skryppy
сообщение Mar 14 2017, 10:36
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 14-02-11
Пользователь №: 62 975



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

Сделал функции my_func1, my_func2. Но результат тот же.
Я не пойму как засунуть функции в параллельные процессы

CODE

#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 - Mar 14 2017, 11:13
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Mar 14 2017, 11:05
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 724
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(Skryppy @ Mar 14 2017, 13:36) *
P.s. В спойлер почему-то текст не убирается(на телефоне отображается спойлер кракозябрами)
Какой спойлер? Используйте тег codebox.
Go to the top of the page
 
+Quote Post
Skryppy
сообщение Mar 14 2017, 11:14
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 14-02-11
Пользователь №: 62 975



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

Сообщение отредактировал Skryppy - Mar 14 2017, 11:33
Go to the top of the page
 
+Quote Post
RobFPGA
сообщение Mar 14 2017, 11:40
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 886
Регистрация: 23-12-04
Пользователь №: 1 643



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

Цитата(Skryppy @ Mar 14 2017, 13:36) *
Алгоритм этой функции простой - коммутировать данные на выход при наличии команды.
просто 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.
Go to the top of the page
 
+Quote Post
Skryppy
сообщение Mar 14 2017, 12:03
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 14-02-11
Пользователь №: 62 975



Понятно. Спасибо.
Go to the top of the page
 
+Quote Post
Skryppy
сообщение Mar 14 2017, 13:36
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 14-02-11
Пользователь №: 62 975



Заработало. Внес директиву #pragma HLS INLINE внутрь каждой функции- my_func1, my_func2. Спасибо всем за помощь.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th March 2017 - 14:31
Рейтинг@Mail.ru


Страница сгенерированна за 0.0144 секунд с 7
ELECTRONIX ©2004-2016