Jump to content

    

Drakonof

Участник
  • Content Count

    39
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Drakonof

  • Rank
    Участник

Информация

  • Город
    Array

Recent Profile Visitors

472 profile views
  1. в общем нужно было ножки тактирования настроить на SI5324_OUT (а не на SMA_MGT) и установить константу 3 на порт phyaddres. Всё заработало.
  2. Всем привет. Не могу понять как поднять sfp на zc706 dev kit. Vivado 2018.3 В общем есть кит zc706 и sfp (1Gbps) модуль d-link DEV-310T. Для начала нужно просто запустить в internal loopback режиме. Как я понял этот режим работы конфигурируется через configuration_vector порт ip ядра 1G/2.5G Ethernet PCS/PMA or SGMII, поставил const ip на 5 разрядов со значением 2 (1G/2.5G Ethernet PCS/PMA or SGMII v16.0 LogiCORE IP Product Guide стр. 62), вроде никаких больше установок для этого вектора не нужны (в тч Auto-Negotiation Enable). Ядро настроенно как Tri-Mode Ethernet MAC, стандарт 1000BASEX, Receive GMII Clock Source: TXOUTCLK. после сборки и портированрия бинарника и hw файла в sdk, запустил в нём lwIP Echo server пример в котром проследил что тактовый генератор (SI5324) запрограммировался (если верить статусам драйвера i2c), но сам phy изернета проходит только пару шагов инициализации по I2С и начинает слать статус ошибки. Коллега мне объяснил что phy не нужно инитить и он должен работать по дефолту, я функцию закоментировал. пример шлёт в терминал: -----lwIP TCP echo server ------ Start PHY autonegotiation Waiting for PHY to complete autonegotiation. autonegotiation complete link speed for phy address 0: 1000 DHCP Timeout Configuring default IP of 192.168.1.10 Board IP: 192.168.1.10 Netmask : 255.255.255.0 Gateway : 192.168.1.1 TCP echo server started @ port 7 и повисает, при этом после строчки "link speed for phy address 0: 1000" пример секунд 10 ждет. Не очень понимаю, это ошибка сборки моего проекта или он ждёт каких то действий) Народ подскажите куда копать что бы sfp начало что то слать в loopback. xlconstant_1[0:0] == 1 xlconstant_2[4:0] == 2 (loopback control == 1) status_vector порт ethernet ip идущий на vio == 0, что говорит: бит 0 и 1 -> нет линка (1G/2.5G Ethernet PCS/PMA or SGMII v16.0 LogiCORE IP Product Guide стр. 64), а loopback он должен быть? Еще уточнение, sfp заткнут заглушкой, те без патчкорда, но на сколько я понимаю в данном режиме это не важно. Заранее спасибо за советы. design_1.pdf
  3. Заработало) спасибо Пока конечно костыльно, в данном случае не работалоизза цинка, каким то образом мешал передаче данных, цинк убрал, буду разбираться
  4. Всем привет, друзья помогите разобраться с 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
  5. я думаю, если бы она была не доступна в lite, то qsys не сгенерировался бы, плюс из ниоса эта ip работает. я так же про данный dma думал)))) да, всё еще будет актуально) спасибо. Почитал про дескрипторы и sg режим, мне понравилось, мне кажется лучше её поставить, хорошенько в ней разобраться и тогда можно её к pcie прикрутить.
  6. В любом случае большое спасибо, что стараетесь помочь) это приятно)
  7. спасибо. Но разве там сигнал write_n не инверсный? те для записи регистра нужно ставить 0, а не 1. Простите, не будет нагло попросить у Вас пример для sgdma? думаю лучше ставить ту ip по которой совершенно точно можно проконсультироваться)
  8. я могу его поставить, но боюсь что никогда не работал с дескрипторами и плохо представляю что это. Можно попробовать.. Вы этим ip из стэй машины управляете или из Nios?
  9. С этим разобрался. Ширина 3 бита, следовательно адресация регистров 1,2 и тд. Там единственная ссылка на документацию в которой всё взаимодействие с ядром идет через ниос и следовательно через api драйвера. Не хочу программно делать, слишком затратно ради одного dma ставить ниос.. Хотя повторюсь, что пробовал программно это сделать и оно работало. Как через стэйт машин заставить его работать не понимаю, может не предназначено, но это было бы странно
  10. да это он. это возможности dma, те какими размерностями "слов" можно трансферить данные. На сколько я понял просто выбираешь один или несколько или все размерности и доопределяешь уже в регистре контроля перед трансфером. у меня основная проблема в том что я не могу записать регистры. я сильно начинающий разработчик, но с хорошим опытом системного программирования, поэтому возможно изначально не правильно выбрал подход работы с dma ip.
  11. Дело в том что из 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 и стэйт машины.
  12. Для начала задача простая, данные из проинитенной первой 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
  13. Да, Вы правы, это я скинул код с ошибкой, извините. Без этой строчки тоже не работает... 8'd3: begin address <= 8'd6; // контрольный регистр writedata <= 32'h9; // читать данные байтами и запуск передачи данных end
  14. Спасибо за ответ. НЕ совсем понял откуда его выпиливать) Так я подключил 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? или контроллер принимает их в таком виде и сам уже разбирается? этой информации я не нашел. Пробовал так и так, не работает. Второй вопрос, который у меня появился, нужно ли выдерживать паузу несколько тактов после записи каждого регистра? этого в спецификации я тоже не нашел..