Drakonof 0 24 июня, 2020 Опубликовано 24 июня, 2020 · Жалоба Всем привет! Cyclone IV Quartus Lite 18 DMA Controller Intel FPGA IP On-chip memory Есть задача, по пути к которой нужно научиться управлять DMA (соответственно гонять данные из одного блока памяти в другой) . Через Ниос с помощью api от intela всё хорошо работает, но мне хочется научиться управлять DMA через машину состояний, но пока не получается даже регистр адреса назначения записать) Кто нибудь делал что то подобное? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 24 июня, 2020 Опубликовано 24 июня, 2020 · Жалоба речь про pci? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Drakonof 0 24 июня, 2020 Опубликовано 24 июня, 2020 (изменено) · Жалоба 1 час назад, new123 сказал: речь про pci? нет, данные будут идти по специфической шине в плис, машина состояний должна декодировать поток и декодированные данные сложить в память, как только один пакет будет декодирован, машина принимается сразу за другой и начинает его складывать во второй буфер при этом давая команду DMA на пересылку первого буфера в DDR. Потом так же со вторым и с переходом на первый буфер. Изменено 24 июня, 2020 пользователем Drakonof Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 24 июня, 2020 Опубликовано 24 июня, 2020 · Жалоба 7 часов назад, Drakonof сказал: нет, данные будут идти по специфической шине в плис, машина состояний должна декодировать поток и декодированные данные сложить в память, как только один пакет будет декодирован, машина принимается сразу за другой и начинает его складывать во второй буфер при этом давая команду DMA на пересылку первого буфера в DDR. Потом так же со вторым и с переходом на первый буфер. Ну так и в чем проблема? Сделайте набор автоматов: сверху - главный, который "руководит" всем процессом. А "под ним" - автоматы-исполнители. Главный выдает для исполнителя сигнал "Старт", в ответ получает "busy" или "ready". А каждый исполнитель умеет только свое: один декодирует, другой пересылает, третий работает с указателями буферов. И при таком подходе все это не будет сложно. А потом компилятор все причешет и лишнее уберет... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 25 июня, 2020 Опубликовано 25 июня, 2020 · Жалоба 22 hours ago, Drakonof said: Через Ниос с помощью api от intela всё хорошо работает, но мне хочется научиться управлять DMA через машину состояний, но пока не получается даже регистр адреса назначения записать) Avalon State Sequencer выпилили из поставки ? простой микропрограмный автомат, как раз под авалон шину) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Drakonof 0 26 июня, 2020 Опубликовано 26 июня, 2020 · Жалоба 25.06.2020 в 11:17, des00 сказал: Avalon State Sequencer выпилили из поставки ? простой микропрограмный автомат, как раз под авалон шину) Спасибо за ответ. НЕ совсем понял откуда его выпиливать) Так я подключил 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? или контроллер принимает их в таком виде и сам уже разбирается? этой информации я не нашел. Пробовал так и так, не работает. Второй вопрос, который у меня появился, нужно ли выдерживать паузу несколько тактов после записи каждого регистра? этого в спецификации я тоже не нашел.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iglaz3 0 26 июня, 2020 Опубликовано 26 июня, 2020 (изменено) · Жалоба 1 hour ago, Drakonof said: write_n <= 1'b1; Добрый день. Возможно стоило запустить DMA? Изменено 26 июня, 2020 пользователем iglaz3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Drakonof 0 27 июня, 2020 Опубликовано 27 июня, 2020 (изменено) · Жалоба 14 часов назад, iglaz3 сказал: Добрый день. Возможно стоило запустить DMA? Да, Вы правы, это я скинул код с ошибкой, извините. Без этой строчки тоже не работает... 8'd3: begin address <= 8'd6; // контрольный регистр writedata <= 32'h9; // читать данные байтами и запуск передачи данных end Изменено 27 июня, 2020 пользователем Drakonof Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iglaz3 0 27 июня, 2020 Опубликовано 27 июня, 2020 · Жалоба Попробуйте, 2 такта держать запись каждого регистра. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 27 июня, 2020 Опубликовано 27 июня, 2020 · Жалоба Я не совсем понял вашу задачу. У меня в pcie схожая конструкция. И встала у меня задача извне qsys заганять данные в on-chip memory, с которым работает контроллер dma. Через bridge выкинул Avalonn-MM концы наружу и через них писал/читал в on-chip memory. Даже не знал, что можно через регистры это делать. Кстати у вас, когда в state = 3 перейдет, дальше state никуда не идет и при этом тогда write залипнет в единице на всегда и займет шину не отдав. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Drakonof 0 27 июня, 2020 Опубликовано 27 июня, 2020 · Жалоба 1 час назад, new123 сказал: Я не совсем понял вашу задачу. У меня в pcie схожая конструкция. И встала у меня задача извне qsys заганять данные в on-chip memory, с которым работает контроллер dma. Через bridge выкинул Avalonn-MM концы наружу и через них писал/читал в on-chip memory. Даже не знал, что можно через регистры это делать. Кстати у вас, когда в state = 3 перейдет, дальше state никуда не идет и при этом тогда write залипнет в единице на всегда и займет шину не отдав. Для начала задача простая, данные из проинитенной первой 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 29 июня, 2020 Опубликовано 29 июня, 2020 · Жалоба On 6/26/2020 at 11:45 PM, Drakonof said: Спасибо за ответ. НЕ совсем понял откуда его выпиливать) в IP корках раньше был Avalon State Sequencer, это микропрограмный автомат для шины Avalon. Скрывает от пользователя всю Avalon-mm кухню. On 6/28/2020 at 12:59 AM, Drakonof said: По честному я не особо умею работать с авалон. Т.е. вы не зная как работает шина, не моделируя ничего, пытаетесь организовать через нее транзакцию? В частности, Avalon-mm содержит механизм рукопожатия (handshake), в вашем коде его не видно. ЕМНИП там есть режимы работы без hanshake, но с гарантированным wait-state (похожий механизм есть в AMBA APB), там настройка wait-state идет относительно самой Avalon подсистемы, и не факт, что ваш последний выложенный код подходит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Drakonof 0 29 июня, 2020 Опубликовано 29 июня, 2020 (изменено) · Жалоба 2 часа назад, des00 сказал: в IP корках раньше был Avalon State Sequencer, это микропрограмный автомат для шины Avalon. Скрывает от пользователя всю Avalon-mm кухню. Т.е. вы не зная как работает шина, не моделируя ничего, пытаетесь организовать через нее транзакцию? В частности, Avalon-mm содержит механизм рукопожатия (handshake), в вашем коде его не видно. ЕМНИП там есть режимы работы без hanshake, но с гарантированным wait-state (похожий механизм есть в AMBA APB), там настройка wait-state идет относительно самой Avalon подсистемы, и не факт, что ваш последний выложенный код подходит. Дело в том что из 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 и стэйт машины. Изменено 29 июня, 2020 пользователем Drakonof Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 29 июня, 2020 Опубликовано 29 июня, 2020 · Жалоба 40 minutes ago, Drakonof said: Дело в том что из 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) Подскажите пожалуйста как правильно сделать. квартуса у меня нет, поэтому не подскажу по конкретике. но, на вашем месте, я бы начал с изучения документации на DMA IP и документации на шину Avalon, затем моделирование DMA-IP, скорее всего базовый тестбенч создается при генерации корки, затем моделирование DMA отдельно и в составе вашей системы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Yuri124 1 29 июня, 2020 Опубликовано 29 июня, 2020 (изменено) · Жалоба А какой контроллер используете? https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/ug/ug_embedded_ip.pdf Если тот, который в п.29 - то у него Quote Size of the individual transfers: Byte (8-bit), halfword (16-bit), word (32-bit), doubleword (64-bit) or quadword (128-bit) Изменено 29 июня, 2020 пользователем Yuri124 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться