Lutovid 0 26 декабря, 2018 Опубликовано 26 декабря, 2018 · Жалоба Всем привет, с наступающим! У меня возникла необходимость общения с флешкой Micron MT28GU01GAAA1EGC-0SIT на плате vcu108. Раньше с bpi флешками не работал поэтому глупый вопрос. Для spi флешек все понятно - там стандартный spi и есть уже готовое решение от тех же ксайлинкс. Для работы с bpi flash я так понимаю нужно использовать axi emc в качестве готового решения? Или как вообще это делается? Поверхностный гуглеж дает много информации о прошивке флешки через джтаг, но пока не нашел информации как общаются с флешкой из ПЛИС внутри прошивки. P.S. Задача - в адресном пространстве под прошивкой хранить свои данные для микроблейза. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lutovid 0 26 декабря, 2018 Опубликовано 26 декабря, 2018 · Жалоба Я решил освоить emc, в качестве примера взял экзампл дизайн на это ядро и пробую его развести для своей платы. И тут сразу возникла проблема - Vivado не может разместить ноги dq0,1,2,3, clk и cen. Судя по раскладке это Config пины - их нельзя использовать внутри прошивки? Как тогда эту флешку использовать кроме как для выгрузки прошивки в ПЛИС? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 26 декабря, 2018 Опубликовано 26 декабря, 2018 · Жалоба Приветствую! 12 minutes ago, Lutovid said: Я решил освоить emc, в качестве примера взял экзампл дизайн на это ядро и пробую его развести для своей платы. И тут сразу возникла проблема - Vivado не может разместить ноги dq0,1,2,3, clk и cen. Судя по раскладке это Config пины - их нельзя использовать внутри прошивки? Как тогда эту флешку использовать кроме как для выгрузки прошивки в ПЛИС? Естественно не может так как эти ноги выделенные для конфигурации и напрямую user их пользовать не может. Для этого есть STARTUP примитив который работает прокладкой межу user логикой и этими ногами STARTUPE3 #( .PROG_USR ("FALSE"), // Activate program event security feature. Requires encrypted bitstreams. .SIM_CCLK_FREQ(0.0 ) // Set the Configuration Clock Frequency (ns) for simulation ) i_STARTUPE3 ( .CFGCLK (cfgclk ), // 1-bit output: Configuration main clock output .CFGMCLK (cfgmclk ), // 1-bit output: Configuration internal oscillator clock output .EOS (mcap_eos ), // 1-bit output: Active-High output signal indicating the End Of Startup .PREQ ( ), // 1-bit output: PROGRAM request to fabric output .PACK (1'b0 ), // 1-bit input: PROGRAM acknowledge input .DI (p_flash_d_i[3:0]), // 4-bit output: Allow receiving on the D input pin .DO (p_flash_d_o[3:0]), // 4-bit input: Allows control of the D pin output .DTS ({4{p_flash_dts}}), // 4-bit input: Allows tristate of the D pin .FCSBO (p_flash_nce_o ), // 1-bit input: Controls the FCS_B pin for flash access .FCSBTS (1'b0 ), // 1-bit input: Tristate the FCS_B pin .GSR (1'b0 ), // 1-bit input: Global Set/Reset input (GSR cannot be used for the port) .GTS (1'b1 ), // 1-bit input: Global 3-state input (GTS cannot be used for the port name) .KEYCLEARB(1'b1 ), // 1-bit input: Clear AES Decrypter Key input from Battery-Backed RAM (BBRAM) .USRCCLKO (emcclk_gclk ), // 1-bit input: User CCLK input .USRCCLKTS(~gpio05_o[2] ), // 1-bit input: User CCLK 3-state enable input .USRDONEO (gpio05_o[0] ), // 1-bit input: User DONE pin output control .USRDONETS(~gpio05_o[1] ) // 1-bit input: User DONE 3-state enable output ); Удачи! Rob Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lutovid 0 26 декабря, 2018 Опубликовано 26 декабря, 2018 · Жалоба Спасибо большое! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lutovid 0 11 января, 2019 Опубликовано 11 января, 2019 · Жалоба Нашел вот такой крутой пример 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bad0512 2 14 января, 2019 Опубликовано 14 января, 2019 · Жалоба On 1/11/2019 at 7:22 PM, Lutovid said: Нашел вот такой крутой пример 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 Проверьте ключи библиотеки XilFlash в BSP - совпадают лт они для BSP разных версий. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lutovid 0 17 января, 2019 Опубликовано 17 января, 2019 · Жалоба On 1/14/2019 at 7:39 AM, Bad0512 said: Проверьте ключи библиотеки XilFlash в BSP - совпадают лт они для BSP разных версий. Совпадают, я уже заметил такой момент - если добавить чипскоуп на emc в новой версии, то все начинает работать, с времянкой все ок... что-то видимо в примере недоконстрейнчено или оптимизируется без скоупа Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 22 января, 2019 Опубликовано 22 января, 2019 · Жалоба Как-то была проблема с работой памяти на плате с Virtex 7, в SYNC mode не хотела работать, всё решалось переходом в ASYNC mode и работой в данном режиме. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lutovid 0 22 января, 2019 Опубликовано 22 января, 2019 · Жалоба 4 hours ago, doom13 said: Как-то была проблема с работой памяти на плате с Virtex 7, в SYNC mode не хотела работать, всё решалось переходом в ASYNC mode и работой в данном режиме. Спасибо, это я уже на форуме ксайлинкса нашел - это решило другую проблемы Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lutovid 0 16 апреля, 2019 Опубликовано 16 апреля, 2019 · Жалоба Возникла новая проблема с этой темой связанная, подскажите кто-нибудь, пожалуйста Собрал проект по примеру 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 - то же самое, что в примере. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 16 апреля, 2019 Опубликовано 16 апреля, 2019 · Жалоба Попробуйте отдельно измерить время стирания и записи. Но NOR в принципе стирается и пишется медленно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lutovid 0 17 апреля, 2019 Опубликовано 17 апреля, 2019 · Жалоба 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; } 23 hours ago, aaarrr said: Попробуйте отдельно измерить время стирания и записи. модифицировал код. В итоге: 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 мегабайта - я поседею, пока это все писаться будет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexadmin 0 17 апреля, 2019 Опубликовано 17 апреля, 2019 · Жалоба Вероятно надо очищать блоками большего размера, это надо инструкцию на флэшку изучать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 17 апреля, 2019 Опубликовано 17 апреля, 2019 · Жалоба 4 minutes ago, Lutovid said: Но на сколько я знаю перед записью нужно обязательно очищать. Я ошибаюсь? Нужно. Но ваша флеш стирается блоками по 256КБайт, а пишете Вы по одному. Отсюда и низкая скорость. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lutovid 0 17 апреля, 2019 Опубликовано 17 апреля, 2019 · Жалоба 14 minutes ago, aaarrr said: Но ваша флеш стирается блоками по 256КБайт, а пишете Вы по одному. Отсюда и низкая скорость. Огромное спасибо! не углядел Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться