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

R6L-025

Свой
  • Публикаций

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

  • Посещение

Репутация

0 Обычный

Информация о R6L-025

  • Звание
    Частый гость
  • День рождения 13.06.1991

Контакты

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

Информация

  • Город
    Ростов-на-Дону
  1. Посмотрите тут: https://rocketboards.org/foswiki/view/Documentation/EmbeddedLinuxBeginnerSGuide и тут: https://github.com/digibird1/Cyclone-V-SoC-system_Base Вторая ссылка, как я понял, как раз Ваш случай
  2. Nick, Спасибо! Вот про bin2flash я и не подумал. Опробую
  3. Да вот тут я и встретил загадочную фразу "Boot Images The procedure described here assumes you have a Nios® II boot image in the format described in the “Boot Images” section." Вообще, по аналогии с другими способами, как я понял, можно использовать скрипт для создания файла из экземпла "advanced boot copier". Но с ним тоже не особо вышло. Там алгоритм подразумевает что первые 32 байта заголовок (для external boot не используется), дальше сразу начинаются записи вида "len0, addr0, data0, len1, addr1, data1...". Если посмотреть на сформированные скриптом *.srec и *.bin файлы - то в первых 4 байтах хранящих длину сегмента (вроде как) находится число равное нескольким миллиардам. Что-то не так. Пока не разобрался почему.
  4. Доброго времени суток! Возникла задача загрузки софта в NIOS из HPS (работающих на одном кристалле). Нашел у Альтеры в "Embeded design handbook" раздел с примером как из одного проца залить код в Nios проц. Все хорошо, вот только там предполагается неким способом получить ,как в документации его называют, "распакованный" elf, представляющий из себя бинарник с размещенными некоторым способом сегментами. Как это сделать... В разделе 5.3.9.3.1 "Boot Images" есть всего 2 строчки рассказывающие что информацию о получении файла см. в разделе "Boot Images". Сепульки какие-то. Кто-нибудь может подсказать какие доки читать, или как получить требуемый формат?
  5. Да, verilog, vhdl... Берете описание портов pll корки, подключаете выходы корки к портам Вашего модуля. Вообще, лучше не делитель клока использовать, а в корке pll создать второй клок, частоту которого настраиваете как вам нужно. Както так: module my_pll ( input wire in_clk, output wire out_clk0, output wire out_clk1 ); pll pll_inst ( .inclk0 (in_clk ), .c0 (out_clk0), .c1 (out_clk1) ); endmodule // my_pll Потом назначаете номера пинов к портам модуля. Можно вручную в *.qsf скрипте, но проще будет через квартусовский pin-planner. Посмотрите на даташит или иную документацию на плату, там должны быть указаны напряжения банков ввода-вывода. Назначаете согласно этому интерфейс, например, "3.3-V LVCMOS"
  6. Ну тогда попробуйте поиграть с директивами. Quartus при синтезе проводит оптимизацию, и может попросту решить что использовать триггеры вместо памяти целесообразней для такого малого объема
  7. А, еще есть quartus templates. В выпадающем меню Edit->Insert Template есть шаблоны кода и директив (чтоб это меню появилось нужно чтоб в квартусе было открыто окно встроенного редактора кода). Там, как раз, есть шаблоны работы с памятью.
  8. А почему эту самую корку использовать нельзя? Если хотите без корки реализовать память - посмотрите главу Recommended HDL Coding Styles в quartus handbook. Там есть примеры кода которые реализует память которая будет синтезирована именно на блоках памяти. Еще есть директивы самого Quartus позволяющие указать что вы хотите от него. Попробуйте погуглить по слову "ramstyle".
  9. Помогите разобраться в работе make

    К первому вопросу - не уверен, но может быть из-за того что ссылка на компилятор указана как CC = g++, и автоматом подтягивается флаг для C++? По крайне мере если судить по второму листингу, компилятор подцепил именно флаг, а не дефолтное значение
  10. Можно создать *.qsys проект в который добавить нужные BFM корки, потом выбрать пунккт Generate->Generate TestBench systems . После генерации в директории synthesis появятся *.sv файлы. Собственно это они и есть:) Еще у альтеры есть экземплы: https://www.altera.com/support/support-reso...ication-ip.html Там же и ссылка на документацию. Правда от последней, как по мне, не сильно много толку Сейчас, как раз, занялся этим. Есть желание наковырять оттуда кода, и сделать для себя боле-менее обощенный пакет который можно былоб использовать в разных проектах
  11. Вроде как неплохо еще прогонять на случайных выборках сигналов. Т.е. задаете случайные данные, ставите передающий модуль, с приемного считываете и сравниваете с переданными. Это довольно легко поддается автоматизации и можно гонять случайные слова данных нужное количество раз. Еще попробуйте посмотреть в сторону Altera'ских bfm модулей для верификации. Из их исходников можно много интересного понадергать
  12. Общий порядок прошивки описан в Documentation/fpga/debugfs.txt. Просто заполняете файлы "flags", "config_complete_timeout_us". Потом на выбор: либо пишите путевое имя файла в "firmware_name", либо записываете вручную сам файлик прошивки в "image". В первом случае, обратите внимание, файл должен лежать в /lib/firmware, и его путевое имя начинается именно с этого пути. По сути ничего сложного, вот моя версия кода загрузки прошивки: Файл прошивки храню где мне удобно, потом создаю симлинк в /lib/firmware. После заполняю указанные файлы. После заполнения файла "firmware_name" загрузка прошивки начинается автоматически. struct fw_names { //! абсолютное путевое имя файла прошивки char* storage_fw_file; //! абсолютный путь к директории прошивок с которой работает ядреный // фреймворк char* fw_path; //! абсолютное путевое имя ссылки на файл прошивки char* fw_path_file; /*! путевое имя символлльной ссылки на файл прошивки относительно * /lib/firmware */ char* fw_framework_dir; //! структура флагов слежения за выделением памяти struct { uint8_t storage_fw_file : 1; uint8_t fw_path : 1; uint8_t fw_path_file : 1; uint8_t fw_framework_dir : 1; uint8_t : 4; } allocated_mask; }; /*! путевое имя файла конфигурации флагов для прошивки FPGA в ядре 4.x */ #define DFS_FLAG_NAME \ "/sys/kernel/debug/fpga_manager/fpga0/flags" /*! путевое имя файла конфигурации таймаута для прошивки FPGA в ядре 4.x */ #define DFS_TIMEOUT_NAME \ "/sys/kernel/debug/fpga_manager/fpga0/config_complete_timeout_us" /*! путевое имя файла прошивки для прошивки FPGA в ядре 4.x */ #define DFS_FIRMWARE_NAME \ "/sys/kernel/debug/fpga_manager/fpga0/firmware_name" /*! значение флага для конфигурации fpgamngr в ядре 4.x */ #define FLAG_STATE "2" /*! значение таймера для конфигурации fpgamngr в ядре 4.x */ #define TIMEOUT_VAL "5" /* псевдокод назначения имен */ struct fw_names fw_names; /* * расположение файла прошивки в файловой системе/ У меня он лежит в * директории /boot */ fw_names.storage_fw_file = "/boot/your_wirmware_name.rbf"; /* * путь к директории в которую надо положить файлик прошивки для того чтоб * ядро нашло нашу файл. Директория "your_dir" - Ваша собственная, можно, * конечно, без нее, просто кинуть файл прошивки непосредственно в * /lib/firmware/ */ fw_names.fw_path = "/lib/firmware/your_dir/"; fw_names.fw_path_file = "/lib/firmware/your_dir/"; fw_names.fw_framework_dir = "your_dir/your_wirmware_name.rbf"; /*****************************************************************************/ /*! * \brief Функция записывает указанную строку в файл. * * \param [in] in_string Записываемая строка * \param [in] len_string Длина записываемой строки * \param [in] file_str Указатель на файловый поток * * \retval SLOGG_SUCCESS | SLOGG_EWRITE */ /*****************************************************************************/ int write_string2file_str( const char* in_string, size_t len_string, FILE* file_str ) { int ret_value; ret_value = fwrite( in_string, len_string, 1, file_str ); if(!ret_value) { ret_value = SLOGG_EWRITE; #ifdef DEBUG_MODE slogger_print( "Не удалось записать строку %s в файловый поток", in_string ); #endif /* DEBUG_MODE */ } return(SLOGG_SUCCESS); } /*****************************************************************************/ /*! * \brief Функция осуществляет загрузку прошивки в FPGA manager через debugfs * используемую начитная с 4.x версии ядра * * \param [in] fw_names Стукрура c именами файлов прошивки, управления * FPGA mngr. */ /*****************************************************************************/ int load_fpga_image_over_dbfs( struct fw_names* fw_names ) { int ret_value; FILE* flag_str; FILE* timeout_str; FILE* firmware_name_str; /* * Следуя алгортму работы с ядреным фреймворком файлы с прошивками должны * находится в директории /lib/firmware. Создадим суб-директорию и * символьные ссылки на файлы прошивки */ ret_value = mkdir( fw_names->fw_path, 0600 ); if(ret_value && errno != EEXIST) { slogger_wrerr( "mkdir: ", errno, strerror ); ret_value = SLOGG_ERET; goto close_firm_loader; } ret_value = symlink( fw_names->storage_fw_file, fw_names->fw_path_file ); if(ret_value && errno != EEXIST) { slogger_wrerr( "symlink: ", errno, strerror ); ret_value = SLOGG_ERET; goto close_firm_loader; } flag_str = fopen( DFS_FLAG_NAME, "w" ); if(!flag_str) { slogger_wrerr( "fopen(flag_str): ", errno, strerror ); ret_value = SLOGG_ERET; goto close_firm_loader; } timeout_str = fopen( DFS_TIMEOUT_NAME, "w" ); if(!timeout_str) { slogger_wrerr( "fopen(timeout_str): ", errno, strerror ); ret_value = SLOGG_ERET; goto close_flag_str; } firmware_name_str = fopen( DFS_FIRMWARE_NAME, "w" ); if(!firmware_name_str) { slogger_wrerr( "fopen(firmware_name_str): ", errno, strerror ); ret_value = SLOGG_ERET; goto close_timeout_str; } /* Запишем флаги */ ret_value = write_string2file_str( FLAG_STATE, sizeof(FLAG_STATE), flag_str ); if(ret_value != SLOGG_SUCCESS) { goto close_firmware_name_str; } /* Запишем значение таймера */ ret_value = write_string2file_str( TIMEOUT_VAL, sizeof(TIMEOUT_VAL), timeout_str ); if(ret_value != SLOGG_SUCCESS) { goto close_firmware_name_str; } /* Запишем имя файла прошивки */ ret_value = write_string2file_str( fw_names->fw_framework_dir, MAX_LEN_OF_NAME, firmware_name_str ); if(ret_value != SLOGG_SUCCESS) { goto close_firmware_name_str; } ret_value = SLOGG_SUCCESS; close_firmware_name_str: fclose(firmware_name_str); close_timeout_str: fclose(timeout_str); close_flag_str: fclose(flag_str); close_firm_loader: return(ret_value); }
  13. Тоже недавно столкнулся с этой проблемой. Покопавшись в исходниках драйвера нашел что они вовсе выкосили chardev /dev/fpga. Теперь вместо него используют обобщенный фреймворк для заливания прошивок. И да, теперь только через sys/class. Причем там есть странность - в документации написано что решение не для продашена. Хотя, вроде, все работает. Завтра скину код
  14. Использую tcl для парсинга verilog кода. Удобно из кода получать готовые сишные хедеры со всеми смещениями внутри SystemVerilog'ских структур, именованными константами размеров массивов, смещений шин в памяти и пр.
  15. Спасибо, посмотрю внимательнее на вывод