Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Virtex 7 pcie
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
ArtoM
Здравствуйте!
Используется отладочная плата с ПЛИС 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
Вот код формирования посылокк на ядро 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
Форумчане, помогите laughing.gif. Проблема обрела новую сторону. Изучил pg023. Открыл для себя "чудесный мир" интерфейсов этого ядра.
Анализируя статус ошибок в chipscope из "Devise status register" выявил особенность.
На шине регистрируется ошибка "fatal error". Согласно pg023 это может быть вызвано несоответствием длины передаваемых данных (полезной нагрузки) на шине pcie и в дескрипторе (заголовке tlp пакета). А также неправильным видом запроса.

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

Используемый драйвер, программа тестирования успешно использовался с отладочной платой virtex 6. Но там и ядро было без AXI).
ArtoM
Проблема решена. bb-offtopic.gif при передаче адреса в эвм необходимо отбрасывать два младших бита.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.