Здравствуйте, уважаемые форумчане!
Обращаюсь я со следующей просьбой.
Есть плата на которой располагаются 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
Большое спасибо!!!