Программируемая логика - это не так уж и сложно. Разберемся вместе.
Ответить

Доступ к BAR0 qsys pci-e в ПЛИС Cyclone IV на плате DB4CGX15

Пт сен 19, 2014 09:34:42

Здравствуйте, уважаемые форумчане!
Обращаюсь я со следующей просьбой.
Есть плата на которой располагаются Cyclone IV и PCI-E-endpoint интерфейс. Необходимо организовать передачу данных с ПК для последующей обработки на ПЛИС и затем отправки их обратно на ПК. Написан модуль ядра linux, который записывает в BAR0 регистр значение. На ПЛИС необходимо взять это значение, прибавить к нему двойку и вернуть обратно. Проблема заключается в том что я не могу дотянуться до BAR0 регистра из ПЛИСины, для того чтобы его модернизировать. Предпринимались попытки создания собственного модуля в QSYS (Quartus II web ed.) с коннектом по интерфейсу Avalon MM slave к выводу BAR 0 Avalon MM Master, и Avalon MM Master к выводу txs в pci-e. Все тщетно. Предпринималась попытка поиска регистра в сгенерированных файлах Qsys чтобы внутри модуля управляющей шины Avalon MM записать значение прибавленное к исходному в шину на выход Bar0.
Тоже без результатно. Как PCI-устройство плата воспринимается в ОС корректно.
Код модуля Qsys и изображение схемы приведены ниже:

Код:
`timescale 1 ps / 1 ps
module bvs_pci_server1bar #(
      parameter AUTO_CLOCK_SINK_CLOCK_RATE = "-1"
   ) (
      input  wire [31:0] serv_bar1_0_addr,          //     avalon_slave.address
      input  wire        serv_bar1_0_read,          //                 .read
      output wire        serv_bar1_0_waitreq,       //                 .waitrequest
      input  wire        serv_bar1_0_write,         //                 .write
      output wire [63:0] serv_bar1_0_readd,         //                 .readdata
      input  wire [63:0] serv_bar1_0_writed,        //                 .writedata
      input  wire [6:0]  serv_bar1_0_burstcnt,      //                 .burstcount
      input  wire [8:0]  serv_bar1_0_byteen,        //                 .byteenable
      output wire        serv_bar1_0_readdatavalid, //                 .readdatavalid
      output wire [19:0] serv_txs_addr,             //    avalon_master.address
      output wire [7:0]  serv_txs_byteen,           //                 .byteenable
      input  wire [63:0] serv_txs_readd,            //                 .readdata
      output wire        serv_txs_read,             //                 .read
      output wire        serv_txs_write,            //                 .write
      input  wire        serv_txs_readdatavalid,    //                 .readdatavalid
      input  wire        serv_txs_waitreq,          //                 .waitrequest
      output wire        serv_txs_chipsel,          //                 .chipselect
      output wire [6:0]  serv_txs_burstcnt,         //                 .burstcount
      output wire [63:0] serv_txs_writed,           //                 .writedata
      input  wire        serv_rst,                  //       reset_sink.reset
      input  wire        serv_clk,                  //       clock_sink.clk
      output wire        serv_irq                   // interrupt_sender.irq
   );

   // TODO: Auto-generated HDL template

   assign serv_bar1_0_waitreq = 1'b0;

   assign serv_bar1_0_readd = 64'b0000000000000000000000000000000000000000000000000000000000000000;

   assign serv_bar1_0_readdatavalid = 1'b0;

   assign serv_txs_burstcnt = 7'b0000000;

   assign serv_txs_addr = 20'b00000000000000000000;

   assign serv_txs_chipsel = 1'b0;

   assign serv_txs_write = 1'b0;

   assign serv_txs_read = 1'b0;

   assign serv_txs_byteen = 8'b00000000;
   
   reg[63:0] _value = 64'b0000000000000000000000000000000000000000000000000000000000000000;
   reg _irq = 1'b0;
   reg _txs_writed = 64'b0000000000000000000000000000000000000000000000000000000000000000;

   always @(posedge serv_clk)
   begin
      if(serv_bar1_0_readd != _value)
         begin
            _value <= serv_bar1_0_readd;
            _txs_writed <= serv_bar1_0_readd | 64'h00000002;
            _irq <= 1'b1;
         end
      else
         _irq <= 1'b0;
   end
   
   assign serv_value = _value;
   assign serv_irq = _irq;
   assign serv_txs_writed = _txs_writed;
   
endmodule


Большое спасибо!!!
Вложения
qsys_interconnect.png
(128.55 KiB) Скачиваний: 729
qsys.png
(45.78 KiB) Скачиваний: 712
Ответить