Перейти к содержанию
    

Всем привет!

Cyclone IV

Quartus Lite 18

DMA Controller Intel FPGA IP

On-chip memory

Есть задача, по пути к которой нужно научиться управлять DMA (соответственно гонять данные из одного блока памяти в другой) .

Через Ниос с помощью api от intela всё хорошо работает, но мне хочется научиться управлять DMA через машину состояний, но пока не получается даже регистр адреса назначения записать) 

Кто нибудь делал что то подобное?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, new123 сказал:

речь про pci?

нет, данные будут идти по специфической шине в плис, машина состояний должна декодировать поток и декодированные данные сложить в память, как только один пакет будет декодирован, машина принимается сразу за другой и начинает его складывать во второй буфер при этом давая команду DMA на пересылку первого буфера в DDR. Потом так же со вторым и с переходом на первый буфер.

Изменено пользователем Drakonof

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 часов назад, Drakonof сказал:

нет, данные будут идти по специфической шине в плис, машина состояний должна декодировать поток и декодированные данные сложить в память, как только один пакет будет декодирован, машина принимается сразу за другой и начинает его складывать во второй буфер при этом давая команду DMA на пересылку первого буфера в DDR. Потом так же со вторым и с переходом на первый буфер.

Ну так и в чем проблема? Сделайте набор автоматов: сверху - главный, который "руководит" всем процессом. А "под ним" - автоматы-исполнители. Главный выдает для исполнителя сигнал "Старт", в ответ получает "busy" или "ready". А каждый исполнитель умеет только свое: один декодирует, другой пересылает, третий работает с указателями буферов. И при таком подходе все это не будет сложно. А потом компилятор все причешет и лишнее уберет...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22 hours ago, Drakonof said:

Через Ниос с помощью api от intela всё хорошо работает, но мне хочется научиться управлять DMA через машину состояний, но пока не получается даже регистр адреса назначения записать)

Avalon State Sequencer выпилили из поставки ? простой микропрограмный автомат, как раз под авалон шину)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

25.06.2020 в 11:17, des00 сказал:

Avalon State Sequencer выпилили из поставки ? простой микропрограмный автомат, как раз под авалон шину)

Спасибо за ответ. НЕ совсем понял откуда его выпиливать) 

Так я подключил DMA, два буфера и сам контроллер. 

image.thumb.png.ac4ceda7182ba177719dd848f5d73459.png

Это сигналы из 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? или контроллер принимает их в таком виде и сам уже разбирается? этой информации я не нашел. Пробовал так и так, не работает.

Второй вопрос, который у меня появился, нужно ли выдерживать паузу несколько тактов после записи каждого регистра? этого в спецификации я тоже не нашел..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Drakonof said:

write_n <= 1'b1;

Добрый день.

Возможно стоило запустить DMA?

Изменено пользователем iglaz3

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 часов назад, iglaz3 сказал:

Добрый день.

Возможно стоило запустить DMA?

 

Да, Вы правы,  это я скинул код с ошибкой, извините. 

Без этой строчки тоже не работает...

 

   

  8'd3: begin
            address <= 8'd6;            // контрольный регистр
            writedata <= 32'h9;     // читать данные байтами и запуск передачи данных
     end

 

 

DMA.PNG

Изменено пользователем Drakonof

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я не совсем понял вашу задачу. У меня в pcie схожая  конструкция. И встала у меня задача  извне qsys заганять данные в on-chip memory, с которым работает контроллер dma.

Через bridge выкинул Avalonn-MM концы наружу и через них писал/читал в on-chip memory. Даже не знал, что можно через регистры это делать.

Кстати у вас, когда в state = 3 перейдет, дальше state никуда не идет и при этом тогда write залипнет в единице на всегда и займет шину не отдав.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 подсистемы, и не факт, что ваш последний выложенный код подходит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 и стэйт машины.

Изменено пользователем Drakonof

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 отдельно и в составе вашей системы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А какой контроллер используете? 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)

 

Изменено пользователем Yuri124

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...