Jump to content

    

Drakonof

Участник
  • Content Count

    37
  • Joined

  • Last visited

Everything posted by Drakonof


  1. Заработало) спасибо Пока конечно костыльно, в данном случае не работалоизза цинка, каким то образом мешал передаче данных, цинк убрал, буду разбираться
  2. Всем привет, друзья помогите разобраться с AXI lite. Vivado 2018.3, linux mint Для начала, думаю можно просто зажечь диоды(их всего 4) на платке с помощью axi_gpio ip и моего контроллера, который пока не работает. Кто знает, может подскажет где ошибка. Диоды исправные, назначены верно, частота подается. Спасибо `timescale 1 ns / 1 ps module project_1 # ( parameter integer C_M_AXI_ADDR_WIDTH = 32, parameter integer C_M_AXI_DATA_WIDTH = 32 ) ( input wire CLK, input wire A_RESET_N, output wire [C_M_AXI_ADDR_WIDTH-1 : 0] M_AXI_AWADDR, output wire [2 : 0] M_AXI_AWPROT, output wire M_AXI_AWVALID, input wire M_AXI_AWREADY, output wire [C_M_AXI_DATA_WIDTH-1 : 0] M_AXI_WDATA, output wire [C_M_AXI_DATA_WIDTH/8-1 : 0] M_AXI_WSTRB, output wire M_AXI_WVALID, input wire M_AXI_WREADY, input wire [1 : 0] M_AXI_BRESP, input wire M_AXI_BVALID, output wire M_AXI_BREADY, output wire [C_M_AXI_ADDR_WIDTH-1 : 0] M_AXI_ARADDR, output wire [2 : 0] M_AXI_ARPROT, output wire M_AXI_ARVALID, input wire M_AXI_ARREADY, input wire [C_M_AXI_DATA_WIDTH-1 : 0] M_AXI_RDATA, input wire [1 : 0] M_AXI_RRESP, input wire M_AXI_RVALID, output wire M_AXI_RREADY ); reg axi_awvalid; reg axi_wvalid; reg [C_M_AXI_DATA_WIDTH-1 : 0] axi_ardata; reg start_single_read; reg start_resp_read; reg axi_arvalid; reg axi_rready; reg axi_bready; assign M_AXI_BREADY = axi_bready; assign M_AXI_RREADY = axi_rready; // адрес на axi, он же регистр данных порта 1 axi_gpio assign M_AXI_AWADDR = 32'h40000000; // записать в регистр данных порта gpio 1 данные, значение должно загореться на диодах assign M_AXI_WDATA = 32'h0000000A; assign M_AXI_AWPROT = 3'b000; assign M_AXI_AWVALID = axi_awvalid; assign M_AXI_WVALID = axi_wvalid; assign M_AXI_WSTRB = 4'b1111; always @(posedge CLK) begin if (A_RESET_N == 0) begin axi_awvalid <= 1'b0; axi_wvalid <= 1'b0; end else begin axi_awvalid <= 1'b1; axi_wvalid <= 1'b1; if (M_AXI_AWREADY && axi_awvalid) begin axi_awvalid <= 1'b0; start_single_read <= 1'b1; end if (M_AXI_WREADY && axi_wvalid) begin axi_wvalid <= 1'b0; end end end always @(posedge CLK) begin if (A_RESET_N == 0) begin axi_bready <= 1'b0; end else if (M_AXI_BVALID && ~axi_bready) begin axi_bready <= 1'b1; end else if (axi_bready) begin axi_bready <= 1'b0; end ; end assign M_AXI_ARADDR = 32'h40000008; assign M_AXI_ARPROT = 3'b001; assign M_AXI_ARVALID = axi_arvalid; always @(posedge CLK) begin if (A_RESET_N == 0) begin axi_arvalid <= 1'b0; end else if (start_single_read) begin axi_arvalid <= 1'b1; end else if (M_AXI_ARREADY && axi_arvalid) begin axi_arvalid <= 1'b0; end end always @(posedge CLK) begin if (M_AXI_RVALID && ~axi_arvalid) begin axi_ardata <= M_AXI_RDATA; end end always @(posedge CLK) begin if (A_RESET_N == 0 ) begin axi_rready <= 1'b0; end else if (M_AXI_RVALID && ~axi_rready) begin axi_rready <= 1'b0; end else if (axi_rready) begin axi_rready <= 1'b0; end end endmodule
  3. я думаю, если бы она была не доступна в lite, то qsys не сгенерировался бы, плюс из ниоса эта ip работает. я так же про данный dma думал)))) да, всё еще будет актуально) спасибо. Почитал про дескрипторы и sg режим, мне понравилось, мне кажется лучше её поставить, хорошенько в ней разобраться и тогда можно её к pcie прикрутить.
  4. В любом случае большое спасибо, что стараетесь помочь) это приятно)
  5. спасибо. Но разве там сигнал write_n не инверсный? те для записи регистра нужно ставить 0, а не 1. Простите, не будет нагло попросить у Вас пример для sgdma? думаю лучше ставить ту ip по которой совершенно точно можно проконсультироваться)
  6. я могу его поставить, но боюсь что никогда не работал с дескрипторами и плохо представляю что это. Можно попробовать.. Вы этим ip из стэй машины управляете или из Nios?
  7. С этим разобрался. Ширина 3 бита, следовательно адресация регистров 1,2 и тд. Там единственная ссылка на документацию в которой всё взаимодействие с ядром идет через ниос и следовательно через api драйвера. Не хочу программно делать, слишком затратно ради одного dma ставить ниос.. Хотя повторюсь, что пробовал программно это сделать и оно работало. Как через стэйт машин заставить его работать не понимаю, может не предназначено, но это было бы странно
  8. да это он. это возможности dma, те какими размерностями "слов" можно трансферить данные. На сколько я понял просто выбираешь один или несколько или все размерности и доопределяешь уже в регистре контроля перед трансфером. у меня основная проблема в том что я не могу записать регистры. я сильно начинающий разработчик, но с хорошим опытом системного программирования, поэтому возможно изначально не правильно выбрал подход работы с dma ip.
  9. Дело в том что из QSYS DMA даёт мне только такие выводы .dma_control_port_slave_address (address), // dma_control_port_slave.address .dma_control_port_slave_chipselect (1'b1), // .chipselect .dma_control_port_slave_readdata (readdata), // .readdata .dma_control_port_slave_write_n (write_n), // .write_n .dma_control_port_slave_writedata (writedata) Подскажите пожалуйста как правильно сделать. Вся идея в том что бы просто перекинуть из одного on-chip в другой с помощью dma и стэйт машины.
  10. Для начала задача простая, данные из проинитенной первой on-chip переложить данные во вторую с помощью dma. Я не знаю другого способа задать начальный и конечный адреса, размер данных и запустить передачу как не через регистры. По честному я не особо умею работать с авалон. Вот весь автамат always @(posedge clk or negedge rst_n) begin if(~rst_n) begin state <= 8'd0; chip_select <= 0; writedata <= 0; end else begin case(state) 8'd0: begin address <= 3'd1; // регистр адреса откуда читать данные write_n <= 1'b0; writedata <= 18'h30000; // адресс буфера 0 state <= 8'd1; chip_select <= 1'b1; end 8'd1: begin state <= 8'd2; end 8'd2: begin address <= 3'd2; // регистр адреса куда читать данные writedata <= 18'h31000; // адресс буфера 1 state <= 8'd3; end 8'd3: begin state <= 8'd4; end 8'd4: begin address <= 3'd3; // регистр адреса сколько передавать данныхъ writedata <= 18'h100; // передавать 256 байт state <= 8'd5; end 8'd5: begin state <= 8'd6; end 8'd6: begin address <= 3'd6; // контрольный регистр writedata <= 18'h9; state <= 8'd7; end 8'd7: begin state <= 8'd8; end 8'd8: begin address <= 3'd0; write_n <= 1'b1; state <= 8'd9; end 8'd9: begin if(readdata == 18'h00010) begin led[3:0] <= 4'h7; // просто зачечь семерочку на диодах как индикатор state <= 8'd10; end end 8'd10: begin if(readdata == 18'h00001) begin led[7:4] <= 4'h7; address <= 3'd1; state <= 8'd11; end end 8'd11: begin if(readdata == 18'h30000) begin led[7] <= 1'h1; chip_select <= 1'b0; end end endcase end
  11. Да, Вы правы, это я скинул код с ошибкой, извините. Без этой строчки тоже не работает... 8'd3: begin address <= 8'd6; // контрольный регистр writedata <= 32'h9; // читать данные байтами и запуск передачи данных end
  12. Спасибо за ответ. НЕ совсем понял откуда его выпиливать) Так я подключил DMA, два буфера и сам контроллер. Это сигналы из qsys для slave порта DMA .dma_control_port_slave_address (<connected-to-dma_control_port_slave_address>), .dma_control_port_slave_chipselect (<connected-to-dma_control_port_slave_chipselect>), .dma_control_port_slave_readdata (<connected-to-dma_control_port_slave_readdata>), .dma_control_port_slave_write_n (<connected-to-dma_control_port_slave_write_n>), .dma_control_port_slave_writedata (<connected-to-dma_control_port_slave_writedata>) Так я пытаюсь передать данные из буфера 0 в буфер 1 reg [31:0] address; reg[7:0] readdata, writedata; reg write; registrator_bd registrator_bd_inst ( .clk_clk (clk), // clk.clk .reset_reset_n (rst_n),// reset.reset_n .dma_control_port_slave_address (address), // dma_control_port_slave.address .dma_control_port_slave_chipselect (1'b1), // .chipselect .dma_control_port_slave_readdata (readdata), // .readdata .dma_control_port_slave_write_n (write_n), // .write_n .dma_control_port_slave_writedata (writedata) ); always @(posedge clk) begin case(state) 8'd0: begin address <= 8'd1; // регистр адреса откуда читать данные write_n <= 1'b0; writedata <= 32'h30000; // адресс буфера 0 state <= 8'd1; end 8'd1: begin address <= 8'd2; // регистр адреса куда читать данные writedata <= 32'h31000; // адресс буфера 1 state <= 8'd2; end 8'd2: begin address <= 8'd3; // регистр адреса сколько передавать данныхъ writedata <= 32'h100; // передавать 256 байт state <= 8'd3; end 8'd3: begin address <= 8'd6; // контрольный регистр write_n <= 1'b1; writedata <= 32'h9; // читать данные байтами и запуск передачи данных end endcase end Но данные не пересылаются. Статусный регистр по нулям, что говорит о том что контроллер не сработал. Тут появляется вопрос, правильно ли я задаю смещения регистров? в даташите написано просто 0,1,2,3,6, но передавая эти цифры нужно ли их домнажать на 4? или контроллер принимает их в таком виде и сам уже разбирается? этой информации я не нашел. Пробовал так и так, не работает. Второй вопрос, который у меня появился, нужно ли выдерживать паузу несколько тактов после записи каждого регистра? этого в спецификации я тоже не нашел..
  13. нет, данные будут идти по специфической шине в плис, машина состояний должна декодировать поток и декодированные данные сложить в память, как только один пакет будет декодирован, машина принимается сразу за другой и начинает его складывать во второй буфер при этом давая команду DMA на пересылку первого буфера в DDR. Потом так же со вторым и с переходом на первый буфер.
  14. Всем привет! Cyclone IV Quartus Lite 18 DMA Controller Intel FPGA IP On-chip memory Есть задача, по пути к которой нужно научиться управлять DMA (соответственно гонять данные из одного блока памяти в другой) . Через Ниос с помощью api от intela всё хорошо работает, но мне хочется научиться управлять DMA через машину состояний, но пока не получается даже регистр адреса назначения записать) Кто нибудь делал что то подобное?
  15. Не могу разобраться с ошибкой [DRC REQP-49] connects_GTGREFCLK0_ACTIVE_connects_GTGREFCLK1_ACTIVE: GTPE2_COMMON cell xdma_p_i/xdma_0/inst/xdma_p_xdma_0_0_pcie2_to_pcie3_wrapper_i/pcie2_ip_i/inst/inst/gt_top_i/pipe_wrapper_i/pipe_lane[0].pipe_quad.gt_common_enabled.gt_common_int.gt_common_i/qpll_wrapper_i/gtp_common.gtpe2_common_i: Use of the GTGREFCLK is reserved for test purposes only. This has the lowest performance of the available clocking methods and can degrade transceiver performance. при этом critical warnings [Common 17-55] 'set_property' expects at least one object. ["C:/workspace_vivado_2019_1/xdma_p.srcs/constrs_1/new/pin.xdc":6] [Common 17-55] 'set_property' expects at least one object. ["C:/workspace_vivado_2019_1/xdma_p.srcs/constrs_1/new/pin.xdc":8] [Common 17-55] 'set_property' expects at least one object. ["C:/workspace_vivado_2019_1/xdma_p.srcs/constrs_1/new/pin.xdc":10] [Common 17-55] 'set_property' expects at least one object. ["C:/workspace_vivado_2019_1/xdma_p.srcs/constrs_1/new/pin.xdc":12] [Common 17-55] 'set_property' expects at least one object. ["C:/workspace_vivado_2019_1/xdma_p.srcs/constrs_1/new/pin.xdc":15] [Vivado 12-2285] Cannot set LOC property of instance 'xdma_p_i/refclk_ibuf'... xdma_p_i/refclk_ibuf is not a leaf level instance ["C:/workspace_vivado_2019_1/xdma_p.srcs/constrs_1/new/pin.xdc":19] set_property IOSTANDARD LVCMOS33 [get_ports sys_rst_n] set_property LOC M20 [get_ports sys_rst_n] set_property PULLUP true [get_ports sys_rst_n] # PCIe Lane 0 set_property LOC GTPE2_CHANNEL_X0Y7 [get_cells {xdma_p_i/xdma_0/inst/gt_top_i/pipe_wrapper_i/pipe_lane[0].gt_wrapper_i/gtp_channel.gtpe2_channel_i}] # PCIe Lane 1 set_property LOC GTPE2_CHANNEL_X0Y6 [get_cells {xdma_p_i/xdma_0/inst/gt_top_i/pipe_wrapper_i/pipe_lane[1].gt_wrapper_i/gtp_channel.gtpe2_channel_i}] # PCIe Lane 2 set_property LOC GTPE2_CHANNEL_X0Y5 [get_cells {xdma_p_i/xdma_0/inst/gt_top_i/pipe_wrapper_i/pipe_lane[2].gt_wrapper_i/gtp_channel.gtpe2_channel_i}] # PCIe Lane 3 set_property LOC GTPE2_CHANNEL_X0Y4 [get_cells {xdma_p_i/xdma_0/inst/gt_top_i/pipe_wrapper_i/pipe_lane[3].gt_wrapper_i/gtp_channel.gtpe2_channel_i}] # GTP Common Placement set_property LOC GTPE2_COMMON_X0Y1 [get_cells {xdma_p_i/xdma_0/inst/gt_top_i/pipe_wrapper_i/pipe_lane[0].pipe_quad.gt_common_enabled.gt_common_int.gt_common_i/qpll_wrapper_i/gtp_common.gtpe2_common_i}] мой xdc set_property LOC IBUFDS_GTE2_X0Y3 [get_cells xdma_p_i/refclk_ibuf] set_property LOC F11 [get_ports sys_clk_p] set_property LOC E11 [get_ports sys_clk_n] set_property LOC C12 [get_ports {pcie_rx_n[0]}] set_property LOC D12 [get_ports {pcie_rx_p[0]}] set_property LOC C10 [get_ports {pcie_tx_n[0]}] set_property LOC D10 [get_ports {pcie_tx_p[0]}] set_property LOC A13 [get_ports {pcie_rx_n[1]}] set_property LOC B13 [get_ports {pcie_rx_p[1]}] set_property LOC A9 [get_ports {pcie_tx_n[1]}] set_property LOC B9 [get_ports {pcie_tx_p[1]}] set_property LOC C14 [get_ports {pcie_rx_n[2]}] set_property LOC D14 [get_ports {pcie_rx_p[2]}] set_property LOC C8 [get_ports {pcie_tx_n[2]}] set_property LOC D8 [get_ports {pcie_tx_p[2]}] set_property LOC A11 [get_ports {pcie_rx_n[3]}] set_property LOC B11 [get_ports {pcie_rx_p[3]}] set_property LOC A7 [get_ports {pcie_tx_n[3]}] set_property LOC B7 [get_ports {pcie_tx_p[3]}] #0 set_property PACKAGE_PIN M26 [get_ports calib_led] set_property IOSTANDARD LVCMOS33 [get_ports calib_led] #1 set_property PACKAGE_PIN T24 [get_ports link_led] set_property IOSTANDARD LVCMOS33 [get_ports link_led] При этом если сделать open ip example design и прописать в .xdc set_property IOSTANDARD LVCMOS33 [get_ports sys_rst_n] set_property LOC M20 [get_ports sys_rst_n] set_property PULLUP true [get_ports sys_rst_n] set_property LOC IBUFDS_GTE2_X0Y3 [get_cells refclk_ibuf] set_property LOC F11 [get_ports sys_clk_p] set_property LOC E11 [get_ports sys_clk_n] то пример собирается, не могу понять что моему проекту нужно. xdma_p.pdf
  16. Нет что Вы) просто разбираться с новыми трудностями вместо старых которые всё равно никуда не денутся очень не охота. Буду пытаться через xdma что то сделать, хотя проект даже еще не собрался. Но а вообще, есть вероятность что AC701 сама по себе не позволяет работать через dma с хостом? (вопрос конечно может показаться глупым, но, если позволите, я сошлюсь на неопытность) Спасибо что Вы еще здесь.
  17. не могу понять, у xdma можно поставить частоту 250 или 125МГц, но на плате только 200 для ядра. Даже относительно AC701 проект не собирается.. может попробуем разобраться с моей конфигурацией? если честно я был бы очень рад не начинать всё с начала и довести до конца то что уже есть
  18. спасибо. я там уже был, как я сказал, уже много чего попробовал и уже запутался. Какой выбирать вариант Types of DMA mappings при написании драйвера, правильно ли составлена блок диаграмма в вивадо (пусть даже относительно cdma), куда записывать адрес dma выделенный драйвером (в регистры cdma или pcie) и какой адрес (dma_addr_t или буфера который передаётся в аргумент при использование dma_map_single)? Про какие ошибки Вы говорите, укажите пожалуйста, что бы я исправил, если Вам не сложно. Начну конечно же с создания новой блок диаграммы c xdma, но если там что то не так сделаю, то копать драйвер можно до посинения, но он так и не заработает... я не прошу исчерпывающего решения из коробки, просто обсудить детали
  19. Спасибо за Ваш ответ. Вы про xdma говорите? Дело в том что в Xilinx Answer 65062 AXI Memory Mapped for PCI Express Address Mapping представлена связка pcie + cdma. Да и бегать от варианта к варианту не хочется, решил разобраться для начало в одном, а если потом нужно будет другие освою. Если не сложно, Вы не могли бы конкретизировать что добавить и что исправить. Если честно уже столько вариантов перепробовал, что забыл что исправлял и не много запутался) В моей компании только начинают осваивать xilinx, а на линукс так вообще никого, по этому и спросить не у кого кроме как на форуме.. Буду крайне признателен если поможете разобраться. Спасибо.
  20. Всем привет! Artix7 Vivado 2019.1 Debian10 Собрал систему Axi Memory Mapped to Pci Express, CDMA, DDR3. Задача в том что бы посылать данные через PCIe в DDR с помощью DMA. В данный момент с ПК данные записываются в DDR ПЛИСа со скоростью 500Мб/с, что для заданных целей проекта мало. В ip PCIe у меня выделено 3 бара: DDR,BRAM, регистры CDMA. Всё прекрасно пишется и читается, но как я сказал выше, медленно. Так же в этой коре выделен один AXI BAR с адресом 0x40000000, который транслируется в адресное пространство CDMA как BAR0 PCIe'са и имеет адрес 0x60000000. Написал простенький дравер на линикс под данные цели, где заполняю регистры DMA. Адрес назначения = 0x80000000 (это адрес ddr в адресном пространстве cdma) и адрес источника который возвращает драйвер как выделенную память под dma, затем устанавливаю количество байт, что активирует трансфер из сорса в адрес назначение и в идеи данные из буфера выделенного драйвером в ПК должны появиться в ddr ПЛИС, но их там нет. Если сорс адрес ставить bram, то по той же схеме через драйвер, данные передаются из brem в ddr. Не могу понять что упускаю... pdf блок диаграммы, настройки и драйвей под линукс прикрепил. Можно попросить посмотреть файлы? Может кто нибудь подскажет что я не правильно делаю. PS не нашел ответов в и в Xilinx Answer 65062 AXI Memory Mapped for PCI Express Address Mapping design_1.pdf test_pci.c настройки и адреса.pdf
  21. Извините, а лекций у Вас не осталось или хотя план занятий? Обещаю не распространять, если это важно.
  22. Спасибо за ответ. Извините, мой косяк. На борде не получиться использовать это ip. Там разводка только для tri mod сделана. В мануале к отладке написано. да...
  23. Всем привет! vivado 2018.3 artyx7 ac701 development kit. Столкнулся с проблемой в назначение ножек. В идеи когда при создание проекта выбирается борда вместо отделенного ПЛИСа, то Vivado в настройках ip позволяет сделать привязку к определённым в отладочной плате выводам. Как я и сделал в моём случае. Дело в том что среде ругается на отсутствие назначений ножек для axi_ethernetlite. На схеме к отладке ножек этих нет. Что делаю не так?) phy_col, phy_crs, phy_rst_n ... phy_tx_data[3:0] при этом phy_mdc, phy_mdio_i,phy_mdio_o,phy_mdio_t среда назначила нормально. Схему block design прикрепил в атач. Заранее спасибо за помощь) ethernet_lite.pdf
  24. Здравствуйте, сейчас проводите такие занятия? )