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

Проблема с Vivado HLS

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

 

Столкнулся с такой непоняткой, пытаюсь смастерить такой несложный модуль:

Входные даные: AXI4 MM Master

Выход: AXI4 Stream Master, нужны user и last сигналы

Контрольный интерфейс: AXI4 Lite Slave, задает количество даных которые нужно перебросить

 

Доки все скурил, гугл перелопатил, но все же в итоге бред собачий получается, чего-то я не понимаю.

Перепробывал все варианты как задавать интерфейс и через масив структур типа ap_axiu и как указатель на структуру ap_axiu и т.д. и т.п.

"C Simulation" проходит, "Co-Simulation" не проходит, на временных диаграмах бред.

 

Описание axi4 mm и axi4 lite работают корректно в железе.

 

Подскажите пожалуйста, как описать правильно axi stream часть... :crying:

 

#include <stdio.h>
#include <string.h>
#include "ap_int.h"
#include "ap_axi_sdata.h"


/* Common Definitions */

/* AXI4 MM Master IF Definition */
#define C_MM_DATA_WIDTH 32
#define C_MM_BURST_SIZE 32

/* AXI4 Master Stream IF Definition */
#define C_STR_DATA_WIDTH  32
#define C_STR_USR_WIDTH   2
#define C_STR_ID_WIDTH    1
#define C_STR_DEST_WIDTH  1


void axi4_data_feeder(
                      /* Ctrl IF - AXI4 Lite */
                      /* Register */
                      ap_uint<C_MM_DATA_WIDTH> ctrl_data_cnt,

                      /* Input IF - AXI4 MM Master  */
                      volatile ap_uint<C_MM_DATA_WIDTH>* mm_master,

                      /* Output IF AXI4 Stream */
                      ap_axiu<C_STR_DATA_WIDTH, C_STR_USR_WIDTH,
                              C_STR_ID_WIDTH,C_STR_DEST_WIDTH > *str_master )
{

/*----------------------------------------------------------------------------*/
/* Define the RTL interfaces */
#pragma HLS INTERFACE s_axilite port=return bundle=CTRL_IF

/* Bundle register to the CTRL IF */
#pragma HLS INTERFACE s_axilite register port=ctrl_data_cnt bundle=CTRL_IF

/* Define AXI4 master IF */
#pragma HLS INTERFACE m_axi depth=32 port=mm_master offset=slave max_read_burst_length=32 max_write_burst_length=32
/* Bundle Offset Control of the AXI4 Master to AXI4 Lite Slave ( CTRL_IF )  */
#pragma HLS INTERFACE s_axilite port=mm_master bundle=CTRL_IF

/* Define AXI4 Stream Master */
#pragma HLS INTERFACE axis register forward port=str_master

/*----------------------------------------------------------------------------*/

ap_uint<C_MM_DATA_WIDTH> cnt;

cnt = 0;

/*  */
str_master[ cnt ].data = mm_master[ cnt ];
str_master[ cnt ].keep = 0b1111;
str_master[ cnt ].strb = 0b1111;
str_master[ cnt ].user = 0b01;
str_master[ cnt ].last = 0b0;
str_master[ cnt ].id   = 0b0;
str_master[ cnt ].dest = 0b0;

/* */
//for( cnt = 1; cnt < ( ctrl_data_cnt - 1 ); cnt++ )
for( cnt = 1; cnt < ( 15 ); cnt++ )
{
  str_master[ cnt ].data = mm_master[ cnt ];
  str_master[ cnt ].keep = 0b1111;
  str_master[ cnt ].strb = 0b1111;
  str_master[ cnt ].user = 0b00;
  str_master[ cnt ].last = 0b0;
  str_master[ cnt ].id   = 0b0;
  str_master[ cnt ].dest = 0b0;
}

/* */
str_master[ cnt ].data = mm_master[ cnt ];
str_master[ cnt ].keep = 0b1111;
str_master[ cnt ].strb = 0b1111;
str_master[ cnt ].user = 0b10;
str_master[ cnt ].last = 0b1;
str_master[ cnt ].id   = 0b0;
str_master[ cnt ].dest = 0b0;

}

Количество даных ограничено в исходнике до 16, иначе ко-симуляция никогда не начинается

 

#include <stdio.h>
#include <string.h>
#include "ap_int.h"
#include "ap_axi_sdata.h"

#define TEST_FAILURE -1
#define TEST_PASSED   1


/* AXI4 MM Master IF Definition */
#define C_MM_DATA_WIDTH 32
#define C_MM_BURST_SIZE 32

/* AXI4 Master Stream IF Definition */
#define C_STR_DATA_WIDTH  32
#define C_STR_USR_WIDTH   2
#define C_STR_ID_WIDTH    1
#define C_STR_DEST_WIDTH  1

void axi4_data_feeder(
                      ap_uint<C_MM_DATA_WIDTH> ctrl_data_cnt,
                      volatile ap_uint<C_MM_DATA_WIDTH>* mm_master,
                      ap_axiu<C_STR_DATA_WIDTH, C_STR_USR_WIDTH,
                              C_STR_ID_WIDTH,C_STR_DEST_WIDTH > *str_master );


int main()
{
int cnt;
int test_result;
int data;

ap_uint<C_MM_DATA_WIDTH> ctrl_data_cnt;
ap_uint<C_MM_DATA_WIDTH> input_data[ 32 ];

ap_axiu<C_STR_DATA_WIDTH, C_STR_USR_WIDTH,
               C_STR_ID_WIDTH,C_STR_DEST_WIDTH > str_master[32];



ctrl_data_cnt = 16;

for( cnt = 0; cnt < 16; cnt++ )
{
  input_data[ cnt ] = cnt;
}

axi4_data_feeder( ctrl_data_cnt, input_data, str_master );



test_result = 1;
cnt = 0;

while( ( cnt < 16 ) && ( test_result == 1 )  )
{

  

  if( input_data[ cnt ] != str_master[ cnt ].data )
  {
   test_result = -1;
  }
  
  data = input_data[ cnt ];
  printf("\r\n >> input_data( %d ): ", data );
  
  data =  str_master[ cnt ].data;
  printf("\r\n >> stream_data( %d ): ", data );
  
  cnt++;
}


if( test_result == -1  )
{
  printf("\r\n Test Failed\r\n");
}
else
{
  printf("\r\n Test Passed\r\n");
}

return 0;

}

post-60920-1481887039_thumb.png

post-60920-1481887045_thumb.png

post-60920-1481887058_thumb.png

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

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


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

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

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

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

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

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

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

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

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

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