Jump to content

    

Aleksei_Rostov

Свой
  • Content Count

    311
  • Joined

  • Last visited

Posts posted by Aleksei_Rostov


  1. Добрый день. Имеется стартовый набор Spartan-3e Starter Kit. На плате имеется кристалл XC3S500E, Platform Flash, SPI Flash, Parallel NOR Flash, DDR SDRAM. Работаю с Microblaze. Шина PLB (AXI не поддерживается). Хочу хранить конфигурационные данные + программу во внешней памяти с последующей загрузкой программы в DDR. Зашел в тупик. Общий алгоритм, как я понял, следующий: прошивка состоит из bit-файла аппаратной платформы, bmm-файла блочной памяти и elf-файла загрузчика (bootloader), srec-файла основной программы (располагается по определенному адресу, указываемому в blconfig.h). Проблемы в следующем:

    1. Попытка использовать SPI Flash. Используется контроллер XPS SPI. При данном подходе SDK автоматически не формирует файл загрузчика.

    2. Попытка использовать Parallel Flash. С помощью SDK автоматом формируется файл загрузчика, в blconfig.h правится начальный адрес расположения SREC-файла. С помощью data2mem формирую новый bit-файл из старого bit, bmm и elf загрузчика (команда data2mem -bm my.bmm -bd code.elf -bt my.bit -o b new.bit). Далее в IMPACT генерирую PROM файл и добавляю в него SREC. Получаю mcs-файл, включающий в себя все, что нужно. Дальше тупик. Как прошить Parallel Flash? Ни по JTAG ни через кристалл она не доступна.

    3. Можно ли использовать сформированный для Parallel Flash загрузчик для извлечения данных из SPI Flash? Надо ли в нем что-то менять?

    4. И еще вопрос по Linker Script. Что должно стоять в разделе Section to Memory Region Mapping? Начальный адрес локальной шины, flash или DDR?

    Благодарю за любую помощь.

     

    2. На Spartan-6 Nexus 3 отладочной плате была перемычка, с помощью которой можно выбирать память под загрузку. На вашей плате посмотрите вот тут описано

    https://www.xilinx.com/support/documentatio..._kits/ug230.pdf

    4. Должен стоять тот регион памяти, в который вы желаете использовать для работы процессора (stack and heap). При этом процессор должен быть подключен к используемой памяти.

     

  2. Здравствуйте уважаемые форумчане. Недавно начал осваивать плис Xilinx. Появились некоторые вопросы, на которые не смог найти исчерпывающих ответов в сети, а самостоятельный анализ долгое время не даёт необходимой информации.

    1) Как организовать согласованную фильтрацию с использованием ядра ких-фильтра?

    2)Как организовать согласованную фильтрацию средствами vhdl?

    3)Как организовать корреляционную обработку сигнала с использованием ядер?

    Особенности сигнала: длительность - 7 мкс, период - 14 мкс, частота дискретизации - равна максимальной частоте тактирования 125 МГц(8 нс).

    Использую ise design, isim, modelsim se

     

    Если речь идет о первичной обработке радиолокационного сигнала например, то можно делать примерно так:

    1. Понижаете по частоте и децимируете входной сигнал. Например, несущая частота входного сигнала 30 МГц (для вашей частоты тактирования - 125 МГц). Опорный сигнал для понижающего преобразования выбираете исходя из ширины спектра входного сигнала. Например, у вас ЛЧМ с девиацией 10 МГц. В этом случае понижаете входной сигнал на 30 МГц. Получается ЛЧМ с переходом через 0 от - 5 до +5 Мгц. Децимируете в 10 раз (т.е. новая частота дискретизации 12.5 МГц).

    2. Собираете КИХ фильтр с ИХ зеркальной ЛЧМ на видеочастоте. Собрать можно самому, но без навыков будет сложновато, проще использовать ядра.

    3. Наблюдаете отклик на выходе КИХ фильтра, при этом необходима синхронизация по фронту зондирующего сигнала. Относительно него отсчитываете время, когда сигнал на выходе КИХ максимален и пересчитываете в дальность/время.

     

    Для верификации используйте modelsim se: в нем есть возможность посмотреть форму сигналов.

    По организации проекта: моделируете весь тракт в matlab или python. записываете входной сигнал в отдельный файл, который потом будете вычитывать в тестбенче при верификации своего проекта.

     

    А децемация проведена по схеме

    Возможно принято решение, что спектральное размножение действовать не будет, ТС тут виднее.

     

    Как вариант, чтобы весь мусор убрать при децимации, можно CIC фильтром децимировать. Его опять же можно на ядрах собрать.

     

     

  3. Вопросы.

    Почему работает описание триггера - делителя тактовой частоты, просто делить частоту на 2, без задержек в самом триггере? Как учитываются задержки в триггере?

     

    Получаемую тактовую частоту вы уже описали с помощью create_generated_clock

     

    Задержка в триггере учитывается при расчете максимально возможной частоты проекта.

    post-77312-1515339837.png

    post-77312-1515339929_thumb.png

     

    В данном случае это время Tq clk

  4. wire  [W-1:0] sum [0:N-1];
    wire  [W-1:0] sum_out;
    
    genvar i;
    generate
       for (i = 0; i < N; i = i + 1)//H_layer_size
       begin: DSP
          DSPkernel i0(
             .CLK(CLK),
             .RST(RST),
             .EN(EN),
            .DI(DATA_IN[(i+1)*64 - 1 : i*64]),
            .CI(CI[(i+1)*64 - 1 : i*64]),
            .D_VALID(DSP_VALID[i]),
            .DO(DO[i]));
    
           assign sum[i] = (i) ? sum[i  - 1] + DO[i] : DO[i];
       end
    endgenerate
    
    assign sum_out = sum[N-1];

     

    спасибо, только совсем не pipeline))

     

    получилось так

    reg  [7 : 0] sum [0 : N - 1];
         integer k;
        initial
         begin
         for (k = 0; k < N; k = k + 1)
         begin
             sum[k] = 0;
         end
         end
    assign DATA = sum[N-2];
    
         genvar i;
         generate 
           for(i = 0; i < N; i = i + 2)begin
               always@(posedge CLK)begin
                   sum[i >> 1] <= DO[i] + DO[i + 1];
                   sum[(i >> 1) + N/2] <= sum[i] + sum[i + 1];
               end
           end
         endgenerate

     

    например для N = 16 rtl выглядит:

    post-77312-1515182626_thumb.png

     

    При этом N рассчитывается:

    
    function integer clogb2 (input integer depth);
         begin
               depth = depth - 1;
             for(clogb2=0; depth>0; clogb2=clogb2+1)
               depth = depth >> 1;
             end
         endfunction  
    
    localparam N = clogb2 (M);
    

     

  5. Добрый день! Подскажите пожалуйста, как наиболее компактней описать следующий алгоритм: есть N dsp блоков, которые создаются через generate. На каждый блок умножает суммирует 4 умножения.

    Далее необходимо просуммировать выходы всех блоков. Структура алгоритма приведена на рисунке:

    post-77312-1515067493_thumb.jpg

    Описание N блоков DSP тривиально:

    /*
         * generate multiply and accummulate for layer
         */   
            genvar i;     
               generate
                 for (i = 0; i < N; i = i + 1)//H_layer_size         
                   begin: DSP                              
                    DSPkernel i0(
                       .CLK(CLK),
                       .RST(RST),
                       .EN(EN),
                       .DI(DATA_IN[(i+1)*64 - 1 : i*64]),
                        CI(CI[(i+1)*64 - 1 : i*64]),
                       .D_VALID(DSP_VALID[i]),
                       .DO(DO[i]));                       
                   end
               endgenerate      
    

     

    Каким образом можно описать параметризируемый pipline для сложения выходов DSP блоков?

     

     

  6. Добрый день!

    Подскажите пожалуйста как можно инициализировать несколько блоков ROM памяти на Verilog'e?

     

    Например

     

    
    reg [7 : 0] MyRom [0 : N - 1]
    
    genvar i;
    generate
      for (i = 0; i < N; i = i + 1) begin
            initial $readmemh($sformat("Data_block_%0d.txt", i), MyRom, 0, 16);
      end
    endgenerate
    

     

    где Data_block_0.txt, Data_block_1.txt, ... , Data_block_N-1.txt - файлы с содержимым каждого блока ROM

     

    Синтез данной конструкции проходит. При попытке запустить симуляцию появляется ошибка на sformat

  7. Добрый день. Кто нибудь запускал EthernetLite на ML605?

    Возникла необходимость перенести проект с NExys 3 со Spartan 6 на ML605, в котором есть UDP до 100 Мбит.с. На нехусе реализовывал через EthernetLite (MII) и все прекрасно работает. На ML605 (GMII/MII) пакет в трансивер уходит, но сниффером его не вижу (причем с того же нехуса пакеты захватываются). До регистров трансивера достучаться не получается. Не может ли быть проблема при работе EthernetLite c MII через GMII ML605? Переключатели на ML выставлены для GMII/MII интерфейса.

    С помощью чего попроще можно реализовать обмен на ML605 (axi_ethernet или Virtex 6 Embedded TEMAC)?

  8. Привет, Алексей!

    Это я понимаю, хочется конкретики... Нашел кстати кое-что в тему: http://www.atmel.com/Images/Atmel-42233-Us...ote_AT04055.pdf

    По поводу RTOS и lwIP ты что-то путаешь... нету там RTOS :)

    я кстати lwIP использую в бареметал. А для нагруженного потока UDP как раз и писал свое ядро...

    Но за ответ - спасибо!

     

    А для чего тебе Lwip? Как я понял у тебя свое IP ядро, которое ты прикрутил к TriState Ethernet и получаешь обмен данными. Lwip запускал на Stratix, там полный UDP/ARP/TCP/IP на ртосе. У ксайлинка полнгая аналогия

    https://www.xilinx.com/support/documentatio...es/xapp1026.pdf

     

  9. Добрый день! Кто-нибудь решал задачу портирования lwIP на свой контроллер MAC? Т.е. у меня есть свое IP-ядро, формирующее пакет для отправки через Tri Mode Ethernet MAC (Xilinx), там есть UDP-каналы самопальные и буфферы приема и передачи, к которым имеет доступ процессор, можно ли "сказать" lwIP, что тот пакет, который он сформировал нужно уложить в буффер и соответственно с приемной частью - получил прерывание - читай пакет из буффера, парсь и делай, все что положено... (ARP и т.д.)?

    Может хоть какой-то опыт есть в данном направлении?

     

    Привет Алексей! Lwip обращается к памяти, куда отмаппирован контроллер МАК. По идее тебе необходимо посмотреть как с памятью работает Lwip (найти где прописаны указатели на буферы приема/передачи, дополнительные регистры, например для Zynq это ДДР, для Микроблейза/ниоса можно назначать) и сообщить указатель на свой мак контроллер. Я решал немного другую задачу: убирал лишние функции из Lwip, чтобы реализовать UDP точка-точка без RTOS, реализованного в Lwip

  10. У меня сейчас sts_tdata периодически становится 0x40 - ошибка от слейва...

    Не сталкивался с таким?

     

    image.png

     

    При чем после того, как восстанавливается 0x80 (в конце времянки) дальше всегда вроде 0x80. Похоже на то, что какой-то регион памяти недоступен для чтения, или я не правильно понимаю?

    P.S. Адреса чтения пока - просто последовательность о 0 до 2621440, заданы только для теста....

     

    У меня была DDR на ML605 и там была проблема записи в определенный регион памяти. я просто исключил его из работы.

  11. Все, разобрался, оказывается шину статуса тоже обязательно надо читать (или хотя бы установить *_sts_tready в "1")...

     

    Статусный реади я вообще в 1 поставил и не трогал больше, только отслеживал sts_tvalid.

  12. Я тоже генерирую команды датамуверу из логики, почитал доки - структура команд простая:) + есть фифо команд. Он кстати удобно перекладывает прочитанные данные в АКСИ Стрим + можно указывать последний запрос - по нему будет генериться tlast. По этому стробу удобно запускать обработку принятых данных...

    Делаю автомат состояний для генерации команд, попробую - отпишусь что да как...

     

    Из логики тоже автомат делал и в качестве сигнала об успешной транзакции использовал статусный сигнал датамувера.

  13. Алексей, привет!

    Проясни "Датамувер это движок sg dma"... Что значит движок?

    Датамувер вроде неплохо подходит - кенеришь ему команды и на выходе получаешь поток данных, если я правильно понял...

    Привет ) Датамувер входит в состав SG DMA и выполняет транзакции на шине данных. Для обмена с ДДР датамувер подходит, но тебе каждый раз прийдется записывать указатели и стартовать датамувер заново, плюс ко всему, насколько я помню, интерфейс для записи указателей у датамувера не акси: я записывал адреса для обмена из логики, а не из СНК. Если ты при обмене для работы с указателями используешь процессор, то SG DMA очень удобное решение с точки зрения работы с указателями на массивы данных в ддр

  14. Здравствуйте!

    Столкнулся с проблемой чтения данных из DDR, подключенной к Zynq. Т.е. работа предполагается такая: при старте системы процессор из флешки копирует определенный массив значений, эти значения используются кастомным ядром в PL. При этом выборка значений случайная (массив большой)...

    Писать поток (тоже надо) в DDR через DMA я умею и прекрасно с этим справляюсь, но вот чтение да еще не поточное а по случайным адресам пока толком не понимаю как сделать...

    Есть предположение использовать CDMA, при этом к порту S_AXI_LITE подключается моя корка и генерит запросы чтения по нужным адресам (или пишет в регистры CDMA что и откуда прочитать...???)... Это будет работать?

    Может есть способ проще?

    Посмотри SG DMA. Там создаёшь лист дескрипторов с указателями на данные для чтения/записи. Когда нужно быстро было переключаться между разными адресами ддр я его использовал

     

    Кажется нащупал верный путь: DataMover!!!

    Буду пробовать...

     

    Датамувер это движок sg dma.

  15. http://www.freertos.org/Free-RTOS-for-Xili...tan-6-FPGA.html

    Тут вроде все есть, или то, что там написано - пройденный этап?

    Мне тоже интересна данная тема...

    Алексей, я запустился сначала на zynq на арме, потом и на Спартане 6 на микроблейзе. И там и там базовые проекты с двумя задачками. Осталось теперь ртос под свои нужды подпилить )

    Если не разберёшься могу подсказать

  16. Как минимум таймер должен быть, и скорее всего он должен быть заведен на прерывание... Какие конкретно ошибки выдает SDK?

    P.S. Шевяков....

     

    Проблема в том, как интегрировать FreeRTOS в SDK. Сейчас пытаюсь аппаратную платформу с микроблейзом прописать в исходниках FreeRTOS.

  17. Добрый день! Пытаюсь запустить FreeRTOS на спартане 6 самый простой проект для старта типа мигания светодиодами и хелловорд в юарт

    Использую информацию из данного сайта

    http://www.freertos.org/Free-RTOS-for-Xili...tan-6-FPGA.html

     

    Однако не получается интегрировать FreeRTOS в SDK: постоянно ошибки на отсутствие определенных файлов и тд.

     

    Может у кого нибудь получилось запустить ОС на микроблейзе?

    Какой минимальный набор файлов для FreeRTOS и требования к аппаратной платформе (объем памяти микроблейза, тактовые частоты, наличие перефирии - таймеров, юартов и тд)?

    Достаточно использовать BSP standalone?

  18. MicroBlaze is under RESET. Check if the Reset input to MicroBlaze and its Bus Interfaces are connected properly

    UNABLE to STOP MicroBlaze

     

    Картинка тут: https://drive.google.com/file/d/0B2SSFcGVsL...iew?usp=sharing (не знаю как вставить ее сюда иначе)

     

    Проверьте RESET для микроблейза. рекомендую вывести на кнопку или свитчер. В настройках SDK попробуйте программатор выбрать не автоматически, а например Digilent progr cable если вы работаете через миниUSB.

  19. Можно

     

     

    На сколько я знаю, на Xilinx форуме одному человеку таки удалось запустить что то похожее на {raw ethernet without TCP/IP} на XEmacPs_xxx.

    Полистав даташит на emacps и dmaps, понял что работа для реализации raw udp сводится к настройке через регистры изернета и дма, а далее операции чтения/записи с помощью sgdma, и контрольные регистры emacps