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

chipmasta

Участник
  • Постов

    6
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные chipmasta


  1. Победил!

    Нужно в Qsys указать dual-port для этого onchip_memory, подключаем к клоку и тд, на s2 я ничего не подключал https://screencast.com/t/qzC2b9Qh7BIi

     

    далее в сгенеренном Qsys'ом файле дописал тестовый код-

     

    soc_system_onchip_memory2_0 onchip_memory2_0 (
            .clk         (clk_clk),                                          //   clk1.clk
            .address     (mm_interconnect_0_onchip_memory2_0_s1_address),    //     s1.address
            .clken       (mm_interconnect_0_onchip_memory2_0_s1_clken),      //       .clken
            .chipselect  (mm_interconnect_0_onchip_memory2_0_s1_chipselect), //       .chipselect
            .write       (mm_interconnect_0_onchip_memory2_0_s1_write),      //       .write
            .readdata    (mm_interconnect_0_onchip_memory2_0_s1_readdata),   //       .readdata
            .writedata   (mm_interconnect_0_onchip_memory2_0_s1_writedata),  //       .writedata
            .byteenable  (mm_interconnect_0_onchip_memory2_0_s1_byteenable), //       .byteenable
            .reset       (rst_controller_reset_out_reset),                   // reset1.reset
            .reset_req   (rst_controller_reset_out_reset_req),               //       .reset_req
            .address2    (0),                                                 //     s2.address
            .chipselect2 (1'b1),                                                 //       .chipselect
            .clken2      (1'b1),                                                 //       .clken
            .write2      (1'b1),                                                 //       .write
            .readdata2   (datain),                                                 //       .readdata
            .writedata2  (32'hF0F0F0),                                                 //       .writedata
            .byteenable2 (4'b1111),                                                 //       .byteenable
            .clk2        (clk_clk),                                          //   clk2.clk
            .reset2      (rst_controller_reset_out_reset),                   // reset2.reset
            .reset_req2  (rst_controller_reset_out_reset_req),               //       .reset_req
            .freeze      (1'b0)                                              // (terminated)
        );

     

    Запускаем, смотрим память в Си и видим наши байтики - https://screencast.com/t/HUUN9xW0

     

    Всем большое спасибо за помощь!

  2. Продолжая рассуждения... :rolleyes:

     

    в Qsys у нас есть инстанс этого onchip_memory2_0 https://screencast.com/t/GFn3nu9x , из HPS модуля в него уходит сигнал, именно этот HPS модуль и исопльзуется линуксом, и именно по этому линукс имеет доступ к RAM через этот onchip_memory2_0. Следовательно в этот же порт нужно стучаться из плис. Может есть идеи как это сделать? Может как-то из кода напрямую можно туда ходить, или нужно добавить еще компонент в Qsys типа PIO и из кода с этим PIO уже общаться... Так-же у onchip_memory2_0 есть опция dual-port судя по всему как раз для моей цели, но всё равно не понятно что в порт должно заходить чтобы из верилог кода был доступ)

  3. Приветствую! Благодарю за развёрнутый ответ!

    Примерно так себе и представлял реализацию этого FSM с состояниями.

     

    Очень интересует непосредственно работа с RAM, вы используете MemAddr, но что это должно быть? если это будет просто reg то как указать что этот reg должен обращаться к RAM а не к регистрам плис, далее как получить нужный базовый адрес этого axi порта, по которому HPS обращается к памяти...

    Другими словами я не могу понять как из плиса прочитать или записать в определённый участок RAM, и именно тот участок к которому hps обращается. Толи этот доступ суперпримитивно делается что никто не пишет, то ли секретная магия, потому что конкретной реализации я не могу найти в примерах. Нужно ли для такой записи/чтения использовать soc_system_onchip_memory2_0 компонент...

     

    ( тем временем курю вот эту книгу http://www.dsol.ru/stud/book7/index_annotation.html )

     

    Есть дока по этой памяти - https://www.altera.com/content/dam/altera-w.../cyc_c51007.pdf без примеров))

  4. Возможно я неверно решаю задачу. К примеру линукс получает данные по сети, плис эти данные должен обработать, результат вернуть в линукс, а линукс уже по сети даст ответ в сторонний сервис.

    Решил сделать так:

    1. в блоке always плис мониторит флаг впамяти, назовём его requestReady

    2. линукс закидывает в память данные для обработки и меняет флаг requestReady на 1. и в цикле начинает мониторить флаг в памяти answerReady

    3. плис увидев что requestReady == 1, забирает данные для обработки, обрабатывает и закидывает в память ответ, меняя флаг answerReady на 1

    4. линукс увидев что answerReady == 1, забирает ответ сгенеренный в плисе

     

    Верна ли логика и какое самое быстрое и оптимальное решение? Данных не много, но поток постоянный.

    Из тех знаний что я собрал, решил что работа через soc_system_onchip_memory2_0 будет самым верным решением. Вот теперь пытаюсь понять как это в верилоге реализовать) Думал что это одна из самых распространённых задач, но фактически не могу найти ни одного дельного туториала. Буду благодарен за любую информацию.

  5. Спасибо за ответ!

     

    Светодиодами я помигал уже и хочется дальше) Сейчас у молодёжи такая тенденция,- хочется всего и побыстрее)))

     

    Приведённый выше кусочек кода я взял из интернета, и он создаёт инстанс, который можно просмотреть в "In-System Memory Content editor". И в этом инстансе видны записанные hF0F0F0F0 - https://www.screencast.com/t/yOkuCoK2pKxj

     

    Но в сгенерированном проектом файле soc_system.v тоже инстанцируется этот блок:

    soc_system_onchip_memory2_0 onchip_memory2_0 (
            .clk        (clk_clk),                                          //   clk1.clk
            .address    (mm_interconnect_0_onchip_memory2_0_s1_address),    //     s1.address
            .clken      (mm_interconnect_0_onchip_memory2_0_s1_clken),      //       .clken
            .chipselect (mm_interconnect_0_onchip_memory2_0_s1_chipselect), //       .chipselect
            .write      (mm_interconnect_0_onchip_memory2_0_s1_write),      //       .write
            .readdata   (mm_interconnect_0_onchip_memory2_0_s1_readdata),   //       .readdata
            .writedata  (mm_interconnect_0_onchip_memory2_0_s1_writedata),  //       .writedata
            .byteenable (mm_interconnect_0_onchip_memory2_0_s1_byteenable), //       .byteenable
            .reset      (rst_controller_reset_out_reset),                   // reset1.reset
            .reset_req  (rst_controller_reset_out_reset_req),               //       .reset_req
            .freeze     (1'b0)                                              // (terminated)
        );

     

    От этого в "In-System Memory Content editor" у меня два инстанса (на скриншоте видно) .

     

    Так вот, когда я записываю память через Си код со сдвигом к AXI порту ( 0xC0000000 ) который должен быть залинкован к soc_system_onchip_memory2_0, то мои байты записываются в 1 инстанс - https://www.screencast.com/t/5W9LjT1jjtP , а добраться во второй инстанс я не нахожу как, пробовал разные сдвиги расчитывать но безрезультатно.

     

    Выходит тот инстанс который я сам создаю не связан с axi портом, а где-то "болтается" в просторах памяти с другим сдвигом.

     

    Буду пробовать работать с тем инстансом который создаётся по дефолту в soc_system.v. Просто странно писать код в сгенерированном файле.

     

    Надеялся что есть возможность получить память в ПЛИСЕ напряму по адресу, типа getmem[0xC0000000]

     

    Всё приходится собирать по крупицам из разных источников, тема сложная, еще раз спасибо за поддержку!

     

     

     

     

     

    Верно ли понимаю, что мне важно chipselect правильный получить, чтобы инстанцировать модуль этот в правильное пространство памяти?

  6. Всем привет! Я только начал вникать в мир ПЛИС но столкнулся со слишком уж большим количеством входных данных) Сам программист, решил вот с железом "пообщаться"

    Задача стоит, как мне казалась простая - из HPS записать данные в RAM FPGA, в FPGA эти данные прочитать, и записать туда же в RAM "ответ".

    Имеем : De0 Nano SoC, за основу взять проект который идёт в комплекте GHRD. Квартус 17.

    Смотрим в Qsys, там уже имеется блок onchip_memory2_0, который даст нашему HPS доступ к RAM. С этим доступом вроде как всё ясно - в Си приложении работаем с /dev/mem, базовый адрес у нас по 0xC0000000. И действительно - работает. Если в блоке onchip_memory2_0 постаивть галочку "доступно для In-System memory Editor" то можно посмотреть этот RAM, увидеть и изменения сделанные со сторны HPS. Здесь всё хорошо.

    А вот с чтением этих байтов в ПЛИС у меня полный ступор, от слова совсем) Я нашел в soc_system.v (который я так понял генерится из Qsys) как инстанцируется модуль onchip_memory2_0. Дальше что?

     

    Я пробовал инстанцировать свой onchip_memory2_0 и даже записать туда данные -

     

    soc_system_onchip_memory2_0 m(.address(0)
    , .byteenable(4'b1111)
    , .chipselect(1)
    , .clk(FPGA_CLK1_50)
    , .clken(1'b1)
    , .reset(hps_fpga_reset_n)
    , .reset_req(1'b0)
    , .write(1'b1)
    , .writedata(32'hF0F0F0F0)
    , .readdata(datain)
    );

     

    в таком случае я вижу два инстанса в эдиторе, и даже вижу записанные байты, НО к этому инстансу не могу достучаться из HPS...

     

    Люди добрые, подскажите, как реализовывать в Верилоге... как будет выглядеть код который запишет/прочитает данные в этот, доступный для HPS, RAM ?

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