Jump to content

    

Lutovid

Свой
  • Content Count

    129
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Lutovid

  • Rank
    Частый гость
  • Birthday 05/17/1992

Контакты

  • Сайт
    http://
  • ICQ
    0

Информация

  • Город
    Москва

Recent Profile Visitors

1014 profile views
  1. Так тут разговор про фул стек или нет? Фул хардвер стек? или с использованием контроллера?
  2. Большое спасибо! Действительно дело в этом, надо будет почитать что это за пины и зачем их отдельно задавать...
  3. Извините за мою непонятливость, я уже читал про них в мануале. Написано: Multiple bitstreams can be stored in the linear BPI flash memory. The two most significant address bits (A25, A24) of the flash memory are connected to DIP switch SW16 positions 1 and 2, respectively, and to the bank 65 RS1 and RS0 pins of the FPGA. By placing valid bitstreams at different offset addresses in the flash memory, various bitstreams can be selected to configure the FPGA by appropriately setting the DIP switch SW16. Я не хочу переключать свичами адрес старта, я хочу запустить вторую прошивку через hwicap по адресу, который задам. Поэтому я выставил свич в 0 позицию(те переключатели, которые отвечают за адрес). А M вектор выставил в мастер BPI Видимо я опять чего-то не учел...
  4. Всем спасибо, запись заработала нормально! Правда есть еще 1 вопрос. Решил попробоватьь сконфигурировать флешку с двумя прошивами. Настройки выставил следующие: Размеры прошив 12.3 МБ и 29.7 МБ соответственно. то есть во флешке по адресу 0x1080000 (c учетом удвоения адреса) будет лежать вторая прошива - это в хексредакторе я и наблюдал. Общий размер итоговой прошивы 47МБ Флешка 128МБ так что все вроде бы ок. Но в результате заливки через джтаг если делать верификацию - она фэйлится: Performing Erase Operation... Erase Operation successful. Performing Program and Verify Operations... Program/Verify Operation failed. Byte 16777216 does not match (FF != 20) ERROR: [Labtools 27-3144] Invalid option: Byte 16777216 does not match (FF != 20) program_hw_cfgmem: Time (s): cpu = 00:00:16 ; elapsed = 00:06:06 . Memory (MB): peak = 7032.930 ; gain = 0.000 ; free physical = 13965 ; free virtual = 55011 ERROR: [Common 17-39] 'program_hw_cfgmem' failed due to earlier errors. В чем может быть проблема? Подскажите пожалуйста
  5. Да, опечатался Про объяснение понял, но как воспользоваться этим - не понятно - я же не храню информацию о том что после стирания (выставили 0xFF) я записал 0x0F, а следовательно могу записать 0x0A например. Но спасибо за информацию, я этого не знал. Я экспериментировал с указанным кодом и если выставить стирание не 256кбайт, а 1024, то пишет он все равно первые 256, а дальше зависает. Но скорее всего это опять моя невнимательность и где-то допущена ошибка. Хотя мне хватает режима стирания 256 и его записи.
  6. Огромное спасибо! не углядел
  7. int bpi_program_flash_user_data(u32 StartAddr,u32 BytesNumber, u8* DataStart) { u32 tic; XTmrCtr_Enable(XPAR_TMRCTR_0_BASEADDR, 1); int Status=XST_SUCCESS; int i; FileByteCount = BytesNumber; NoOfblockperPartition =0; NoOf1024Packets =0; for(i=0; i<BytesNumber; i++) { WriteBuffer[i] = *(DataStart+i); } if (NoOf1024Packets==0) { tic = XTmrCtr_mGetTimerCounterReg(XPAR_TMRCTR_0_BASEADDR,1); Status = bpi_flash_erase_1024(StartAddr, BytesNumber); if(Status != XST_SUCCESS) { return XST_FAILURE; } NoOfblockperPartition++; tic = XTmrCtr_mGetTimerCounterReg(XPAR_TMRCTR_0_BASEADDR,1)-tic; xil_printf("erase time = %d\n\r", tic); } tic = XTmrCtr_mGetTimerCounterReg(XPAR_TMRCTR_0_BASEADDR,1); Status = bpiFlashWrite_1024(StartAddr, BytesNumber); if(Status != XST_SUCCESS) { return XST_FAILURE; } else { NoOf1024Packets++; if (NoOf1024Packets ==256) { NoOf1024Packets=0; } } tic = XTmrCtr_mGetTimerCounterReg(XPAR_TMRCTR_0_BASEADDR,1)-tic; xil_printf("write time = %d\n\r", tic); XTmrCtr_Disable(XPAR_TMRCTR_0_BASEADDR, 1); return XST_SUCCESS; } модифицировал код. В итоге: erase time = 84861670 write time = 150483 erase time = 87956353 write time = 150430 erase time = 87231692 write time = 150863 erase time = 88019450 write time = 148818 erase time = 87290593 write time = 149747 erase time = 92611360 write time = 149437 erase time = 88054675 write time = 154769 erase time = 88052405 write time = 148445 Иными словами очистка 0.7 секукнды, запись 1.2 микросекунды Но на сколько я знаю перед записью нужно обязательно очищать. Я ошибаюсь? Я понимаю, что скорость не будет высокой, но через джтаг пишется-то прошива во флеш быстрее, а учитывая что я хочу записывать 32 мегабайта - я поседею, пока это все писаться будет.
  8. Возникла новая проблема с этой темой связанная, подскажите кто-нибудь, пожалуйста Собрал проект по примеру https://www.xilinx.com/support/documentation/application_notes/xapp1282-us-post-cnfg-nor-axi-emp-ip.pdf Запись/чтение работает, пишу по 1024 байта. НО запись этого блока занимает 0.7 секунд Вот код си int bpi_program_flash_user_data(u32 StartAddr,u32 BytesNumber, u8* DataStart) { u32 tic; XTmrCtr_Enable(XPAR_TMRCTR_0_BASEADDR, 1); tic = XTmrCtr_mGetTimerCounterReg(XPAR_TMRCTR_0_BASEADDR,1); xil_printf("timer INIT\n\r"); int Status=XST_SUCCESS; int i; FileByteCount = BytesNumber; NoOfblockperPartition =0; NoOf1024Packets =0; for(i=0; i<BytesNumber; i++) { WriteBuffer[i] = *(DataStart+i); } if (NoOf1024Packets==0) { Status = bpi_flash_erase_1024(StartAddr, BytesNumber); if(Status != XST_SUCCESS) { return XST_FAILURE; } NoOfblockperPartition++; } Status = bpiFlashWrite_1024(StartAddr, BytesNumber); if(Status != XST_SUCCESS) { return XST_FAILURE; } else { NoOf1024Packets++; if (NoOf1024Packets ==256) { NoOf1024Packets=0; } } tic = XTmrCtr_mGetTimerCounterReg(XPAR_TMRCTR_0_BASEADDR,1)-tic; xil_printf("timer = %d", tic); XTmrCtr_Disable(XPAR_TMRCTR_0_BASEADDR, 1); return XST_SUCCESS; } В консоли: timer INIT timer = 478694timer INIT timer = 95275505timer INIT timer = 95351562timer INIT timer = 87752350timer INIT timer = 93063388timer INIT timer = 87836049timer INIT timer = 93870938timer INIT timer = 90060920timer INIT timer = 86285611timer INIT timer = 93038591timer INIT timer = 93885447timer INIT timer = 87073618timer INIT timer = 88577868 тактовая счетчика 125МГц. вот и получается, что каждые 1024 байта пишутся около секунды... Это уж очень дофига. Я полагаю< что можно подстроить скорость в emc, но пока не понял что менять можно, а что нет - так как от примера долеко не отходил. Подскажите пожалуйста как победить проблему? Может вообще дело в микроблейзе и emc не надо копать? Я прикрепил скрин параметров emc - то же самое, что в примере.
  9. Спасибо, это я уже на форуме ксайлинкса нашел - это решило другую проблемы
  10. Совпадают, я уже заметил такой момент - если добавить чипскоуп на emc в новой версии, то все начинает работать, с времянкой все ок... что-то видимо в примере недоконстрейнчено или оптимизируется без скоупа
  11. Нашел вот такой крутой пример http://www.xilinx.com/support/documentation/application_notes/xapp1282-us-post-cnfg-nor-axi-emp-ip.pdf Хочется с ним досконально разобраться, но возникла проблема - на вивадо 16.1(на которой написан пример) все работает, а при переходе к 17.1(на которой я работаю в основном) стандартная библиотечная функция XFlash_Initialize возвращает ошибку XFLASH_CFI_QUERY_ERROR. Я попробовал залить софт из sdk 17.1 в хард старой версии - все работает - то есть дело не в обновлении библиотек, как я понимаю. Апгрейд лог вроде ничего критичного не выдает по части emc(прикрепил файл). Адреса после апгрейда все сохранились старые. Поискал на форуме ксайлинкса проблему - не нашел. Подскажите пожалуйста, сталкивался кто с такой проблемой? ip_upgrade.log
  12. я имел в виду совпадает ли dst UDP пакета и src pause frame. Если да, то пока идей нет
  13. Я решил освоить emc, в качестве примера взял экзампл дизайн на это ядро и пробую его развести для своей платы. И тут сразу возникла проблема - Vivado не может разместить ноги dq0,1,2,3, clk и cen. Судя по раскладке это Config пины - их нельзя использовать внутри прошивки? Как тогда эту флешку использовать кроме как для выгрузки прошивки в ПЛИС?
  14. А значения в полях мак адреса верные(для udp и для pause frame)? По идее на стороне ПЛИС это можно не детектировать - вайршарк позволяет видеть тайминг пакетов - достаточно проследить< что после дросселирующего фрейма выдержана пауза - если я правильно понял задачу.