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

 
 
 
Closed TopicStart new topic
> Virtex 7 pcie, Проблемы с организацией передачи даных в ПК из ПЛИС
ArtoM
сообщение Apr 9 2014, 04:34
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 10-06-11
Из: Ростов-на-Дону
Пользователь №: 65 614



Здравствуйте!
Используется отладочная плата с ПЛИС xc7vx415t-2ffg1927. Сгенерил корку pcie virtex7 1.6. Ise 14.6.

Параметры корки:
- pcie gen 2. 5Gb/s
- axi data 256 bit
- clk 125 mhz
- data word aligned

Доступ/чтение BAR осуществляется без проблем.

В ПЛИС организован DMA. Перекачка идет в тестовом режиме 1 пакета 128 байт. Затем после перекачки ПЛИС генрит прерывание MSI.

Логика работы следующая:
1) ПК пишет в BAR начальный адрес оперативной памяти куда попадут данные из ПЛИС, длину запрашиваемых данных в TLP пакетах. Дает команду "СТАРТ".

2) ПЛИС передает данные. На ядро идут команды s_axis_rq*.
3) После передачи ядру запрошенных данных ПЛИС дает команду прерывания на ядро.

Счетчик отправляется непосредственно из ПЛИС в ПК:
Прикрепленное изображение


Получаю на выходе прерывание, а данные в памяти ПК не перезаписываются, то есть вместо ожидаемой "пилы" в памяти лежат нули записываемые туда при инициализации драйвером.
Прикрепленное изображение


В модели корки показан режим работы IO, но используется интерфейс axis_cq/cc.

Проблема может быть в заголовке TLP s_axis_rq? Есть ли примеры работы с интерфейсом s_axis_rq*?

Сообщение отредактировал ArtoM - Apr 9 2014, 04:36
Go to the top of the page
 
+Quote Post
ArtoM
сообщение Apr 9 2014, 08:12
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 10-06-11
Из: Ростов-на-Дону
Пользователь №: 65 614



Вот код формирования посылокк на ядро pcie s_axis_rq*.

Код
PIO_TX_DMA_START_DESC : begin // Запись в память ЭВМ (host cpu) дескриптора с начальным адрессом памяти для DMA

                s_axis_rq_tvalid  <= #TCQ 1'b1;
                s_axis_rq_tlast   <= #TCQ 1'b0;
                s_axis_rq_tkeep   <= #TCQ 8'hFF;                  // 4DW Descriptor and DW Payload For Memory Transaction
                s_axis_rq_tdata   <= #TCQ {DATA_TLP_IN[223:96], // 4DW Payload
                                           1'b0,                 // Force ECRC
                                           3'b000,               // Attributes
                                           3'b000,               // Traffic Class
                                           1'b0,                 // RID Enable to use the Client supplied Bus/Device/Func No
                                           16'b0,               // Completer -ID, set only for Completers or ID based routing
                                           (AXISTEN_IF_ENABLE_CLIENT_TAG ?
                                           8'h00 : req_tag),      // Select Client Tag or core's internal tag
                                           8'h00,                 // Req Bus No- used only when RID enable = 1
                                           8'h00,                 // Req Dev/Func no - used only when RID enable = 1
                                           1'b0,                  // Poisoned Req
                                           4'b0011,               // Req Type for MRd Req
                                           11'h20,                // DWORD Count
                                                         30'h0000_0000,
                                           DATA_TLP_IN[255:224],// Memory Write cpu Address [62 bits]
                                           2'b10};                //AT -> 00- Untranslated Address  10-> Translated Address
  
                s_axis_rq_tuser          <= #TCQ {(AXISTEN_IF_RQ_PARITY_CHECK ? s_axis_rq_tparity : 32'b0), // Parity
                                                  4'b1010,      // Seq Number
                                                  8'h00,        // TPH Steering Tag
                                                  1'b0,         // TPH indirect Tag Enable
                                                  2'b0,         // TPH Type
                                                  1'b0,         // TPH Present
                                                  1'b0,         // Discontinue
                                                  3'b000,       // Byte Lane number in case of Address Aligned mode
                                                  4'hF,           // Last BE of the Read Data
                                                  4'hF};         // First BE of the Read Data


                if(s_axis_rq_tready) begin
                  state <= #TCQ PIO_TX_DMA_START_DW;
                  trn_sent <= #TCQ 1'b1;
                  
                  cnt_tx_to_pci <= cnt_tx_to_pci +4;
                end        
                else
                  state <= #TCQ PIO_TX_DMA_START_DESC;

              end // PIO_TX_DMA_START_DESC                   
            
            PIO_TX_DMA_START_DW : begin // Запись в память ЭВМ (host cpu) полезной информации из FIFO

                s_axis_rq_tvalid  <= #TCQ 1'b1;
                s_axis_rq_tlast   <= #TCQ 1'b0;
                s_axis_rq_tkeep   <= #TCQ 8'hFF;                  // 4DW Descriptor and DW Payload For Memory Transaction
                s_axis_rq_tdata   <= #TCQ DATA_TLP_IN;          // 4DW Payload

                s_axis_rq_tuser          <= #TCQ {(AXISTEN_IF_RQ_PARITY_CHECK ? s_axis_rq_tparity : 32'b0), // Parity
                                                  4'b1010,      // Seq Number
                                                  8'h00,        // TPH Steering Tag
                                                  1'b0,         // TPH indirect Tag Enable
                                                  2'b0,         // TPH Type
                                                  1'b0,         // TPH Present
                                                  1'b0,         // Discontinue
                                                  3'b000,       // Byte Lane number in case of Address Aligned mode
                                                  4'hF,           // Last BE of the Read Data
                                                  4'hF};         // First BE of the Read Data

                if(s_axis_rq_tready)  
                          if(cnt_tx_to_pci < 20) begin    
                            cnt_tx_to_pci <= cnt_tx_to_pci +8;             // на шине 8DW    
                                    state          <= #TCQ PIO_TX_DMA_START_DW;
                                    trn_sent       <= #TCQ 1'b1;    
                            end
                        else
                            begin
                                    state          <= #TCQ PIO_TX_DMA_START_DW_END;
                                    trn_sent       <= #TCQ 1'b1;    
                            end
                else
                  state           <= #TCQ PIO_TX_DMA_START_DW;

              end // PIO_TX_DMA_START_DW    
            
              PIO_TX_DMA_START_DW_END: begin // завершаем передачу данных в ЭВМ для записи в память        
                  
                s_axis_rq_tvalid  <= #TCQ 1'b1;
                s_axis_rq_tlast   <= #TCQ 1'b1;
                s_axis_rq_tkeep   <= #TCQ 8'hF0;                  // 4DW Descriptor and DW Payload For Memory Transaction
                s_axis_rq_tdata   <= #TCQ DATA_TLP_IN;          // 4DW Payload

                s_axis_rq_tuser          <= #TCQ {(AXISTEN_IF_RQ_PARITY_CHECK ? s_axis_rq_tparity : 32'b0), // Parity
                                                  4'b0000,      // Seq Number
                                                  8'h00,        // TPH Steering Tag
                                                  1'b0,         // TPH indirect Tag Enable
                                                  2'b0,         // TPH Type
                                                  1'b0,         // TPH Present
                                                  1'b0,         // Discontinue
                                                  3'b000,       // Byte Lane number in case of Address Aligned mode
                                                  4'hF,           // Last BE of the Read Data
                                                  4'hF};         // First BE of the Read Data

                if(s_axis_rq_tready) begin
                      state          <= #TCQ PIO_TX_RST_STATE;
                      trn_sent       <= #TCQ 1'b1;                      
                  end
                else
                  state           <= #TCQ PIO_TX_DMA_START_DW_END;

              end // PIO_TX_DMA_START_DW


Сообщение отредактировал ArtoM - Apr 9 2014, 08:14
Go to the top of the page
 
+Quote Post
ArtoM
сообщение Apr 18 2014, 11:39
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 10-06-11
Из: Ростов-на-Дону
Пользователь №: 65 614



Форумчане, помогите laughing.gif. Проблема обрела новую сторону. Изучил pg023. Открыл для себя "чудесный мир" интерфейсов этого ядра.
Анализируя статус ошибок в chipscope из "Devise status register" выявил особенность.
На шине регистрируется ошибка "fatal error". Согласно pg023 это может быть вызвано несоответствием длины передаваемых данных (полезной нагрузки) на шине pcie и в дескрипторе (заголовке tlp пакета). А также неправильным видом запроса.

Подскажите в каком направлении копать? И интересно почему после выявлении ошибки система перестает регистрировать прерывания, а ядро pcie их якобы выдает по команде (msi_sent ='1').

Используемый драйвер, программа тестирования успешно использовался с отладочной платой virtex 6. Но там и ядро было без AXI).
Go to the top of the page
 
+Quote Post
ArtoM
сообщение Apr 29 2014, 16:00
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 10-06-11
Из: Ростов-на-Дону
Пользователь №: 65 614



Проблема решена. bb-offtopic.gif при передаче адреса в эвм необходимо отбрасывать два младших бита.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 30th July 2025 - 09:13
Рейтинг@Mail.ru


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