alxkon 0 16 декабря, 2016 Опубликовано 16 декабря, 2016 (изменено) · Жалоба Приветствую всех! Столкнулся с такой непоняткой, пытаюсь смастерить такой несложный модуль: Входные даные: 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; } Изменено 16 декабря, 2016 пользователем antsu88 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться