Jump to content

    

Recommended Posts

Всем привет!

Cyclone IV

Quartus Lite 18

DMA Controller Intel FPGA IP

On-chip memory

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

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

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

Share this post


Link to post
Share on other sites
1 час назад, new123 сказал:

речь про pci?

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

Edited by Drakonof

Share this post


Link to post
Share on other sites
7 часов назад, Drakonof сказал:

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

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

Share this post


Link to post
Share on other sites
22 hours ago, Drakonof said:

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

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

Share this post


Link to post
Share on other sites
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? или контроллер принимает их в таком виде и сам уже разбирается? этой информации я не нашел. Пробовал так и так, не работает.

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

Share this post


Link to post
Share on other sites
14 часов назад, iglaz3 сказал:

Добрый день.

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

 

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

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

 

   

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

 

 

DMA.PNG

Edited by Drakonof

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites
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

 

Share this post


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

Share this post


Link to post
Share on other sites
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 и стэйт машины.

Edited by Drakonof

Share this post


Link to post
Share on other sites
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 отдельно и в составе вашей системы.

Share this post


Link to post
Share on other sites

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

 

Edited by Yuri124

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.