Jump to content

    

farbius

Свой
  • Content Count

    247
  • Joined

  • Last visited

Everything posted by farbius


  1. Здравствуйте! Уважаемые товарищи подскажите пожалуйста, какие варианты решения для следующей задачки: необходимо последовательно запустить два elf файла на microblaze, который загружается из FLASH памяти. Сейчас создаю свой bootloader в виде bit файла с проинициализированной BRAM (16 КБайт), который записываю во FLASH (адресом выше записываю основной elf файл для работы процессора ). При подаче питания в ПЛИС подгружается bit файл и запускается elf из BRAM памяти, который вычитывает основной elf в DDR и сбрасывает Microblaze для выполнения кода уже из DDR. Тут все просто. Теперь возникла необходимость перед запуском основного elf файла записать массив user data во FLASH (выше bit, elf). Проинициализировать BRAM bootloader'ом и массивом user data не получится, т.к. 16 кБайт BRAM недостаточно, а увеличить нельзя. Вот и необходимо сделать так: подали питание, загрузили bit с инициализированной BRAM, процессор вычитал в DDR elf с массивом user data и вычитал elf с основным ПО, выполнил elf с массивом user data (записал данные во FLASH), потом сбросили процессор и сказали ему выполнять код уже из основного elf файла. Как указать microblaze на указатель откуда в DDR выполнять код?
  2. Выложу исходники, может кому пригодится. Получилось так, записываю: во флеш по адресу 0х00000000 файл с проинициализированной BRAM: download.bit По адресу 0х00440000 файл: first_elf.elf по адресу 0х00840000 файл: second_elf.elf При подаче питания запускается download.bit, потом загружается и исполняется first_elf.elf, и далее second_elf.elf. Код для формирования bootloader'а download.bit взял от trenz electonics^ #include "spi_flash.h" #include <stdio.h> //----------------------------------------------------------------------------- #define SSB_START_ADDR 0x00440000 #define XIL_BIT_SYNC 0x665599AA #define ELF_EHSIZE 52 #define ELF_SHENTSIZE 40 #define ELFMAG 0x464C457F #define SHT_PROGBITS 1 #define ELF_HDR_SHNUM_OFF 48 #define ELF_HDR_SHOFF_OFF 8 #define ELF_HDR_SHTYPE_OFF 4 #define ELF_HDR_SHADDR_OFF 3 #define ELF_HDR_SHOFFSET_OFF 4 #define ELF_HDR_SHSIZE_OFF 5 #define MEM_TEST_RANGE 0x1000 #define SPI_READ_CMD 0x0300 //----------------------------------------------------------------------------- u8 e_shnum, section, sh_type; u32 e_shoff, sh_addr, sh_offset, sh_size; int (*reset_func) () = 0; u32 int_read_buf[13]; u32 int_readtest_buf[64]; u8* char_readtest_buf = (u8*)int_readtest_buf; u8* char_read_buf = (u8*)int_read_buf; u8 *mem_section; volatile u32 *ddr_mem = (u32*)XPAR_MIG_7SERIES_0_BASEADDR; //----------------------------------------------------------------------------- void pause(int p){ volatile int v; for(v = 0; v < (400000 * p); v++); } //----------------------------------------------------------------------------- int main(void){ int i; print("\r\nTrenz Electronic ELF bootloader "__DATE__" "__TIME__"\r\n\r\n"); spi_flash_init(XPAR_AXI_QUAD_SPI_0_DEVICE_ID); // Init SPI Flash // Test memory before use it! for(i = 0; i < MEM_TEST_RANGE; i++) ddr_mem[i] = i; for(i = 0; i < MEM_TEST_RANGE; i++){ if(ddr_mem[i] != i){ xil_printf("ERROR: Memory test failed!\r\n"); while(1); } } //////////////////////////////////// // Read SSB spi_flash_read(SSB_START_ADDR, ELF_EHSIZE, char_read_buf); if(int_read_buf[0] != ELFMAG){ xil_printf("ERROR: Boot image not found\r\n"); while(1); } e_shnum = char_read_buf[ELF_HDR_SHNUM_OFF]; e_shoff = int_read_buf[ELF_HDR_SHOFF_OFF]; for(section = 0; section < e_shnum; section++){ // Sections loop spi_flash_read((SSB_START_ADDR + e_shoff + section * ELF_SHENTSIZE), ELF_SHENTSIZE, char_read_buf); sh_type = char_read_buf[ELF_HDR_SHTYPE_OFF]; sh_addr = int_read_buf[ELF_HDR_SHADDR_OFF]; sh_offset = int_read_buf[ELF_HDR_SHOFFSET_OFF]; sh_size = int_read_buf[ELF_HDR_SHSIZE_OFF]; mem_section = (u8*)sh_addr; if(sh_type == SHT_PROGBITS){ // Process only sections with data if(sh_addr == 0){ if(sh_size == 8) spi_flash_read((SSB_START_ADDR + sh_offset), sh_size, mem_section); } else // Usual sections spi_flash_read((SSB_START_ADDR + sh_offset), sh_size, mem_section); } } // Sections loop xil_printf("\r\nBoot...\r\n"); pause(1); reset_func(); // Start Second Stage while(1); } Полученный при компиляции elf файл размещаю в BRAM и при прошивке ПЛИС получаю download.bit Код для формирования first_elf.elf: #include "spi_flash.h" #include <stdio.h> //----------------------------------------------------------------------------- #define SSB_START_ADDR 0x00840000 #define XIL_BIT_SYNC 0x665599AA #define ELF_EHSIZE 52 #define ELF_SHENTSIZE 40 #define ELFMAG 0x464C457F #define SHT_PROGBITS 1 #define ELF_HDR_SHNUM_OFF 48 #define ELF_HDR_SHOFF_OFF 8 #define ELF_HDR_SHTYPE_OFF 4 #define ELF_HDR_SHADDR_OFF 3 #define ELF_HDR_SHOFFSET_OFF 4 #define ELF_HDR_SHSIZE_OFF 5 #define MEM_TEST_RANGE 0x1000 #define SPI_READ_CMD 0x0300 //----------------------------------------------------------------------------- u8 e_shnum, section, sh_type; u32 e_shoff, sh_addr, sh_offset, sh_size; int (*reset_func) () = 0; u32 int_read_buf[13]; u32 int_readtest_buf[64]; u8* char_readtest_buf = (u8*)int_readtest_buf; u8* char_read_buf = (u8*)int_read_buf; u8 *mem_section; volatile u32 *ddr_mem = (u32*)XPAR_MIG_7SERIES_0_BASEADDR; //----------------------------------------------------------------------------- void pause(int p){ volatile int v; for(v = 0; v < (400000 * p); v++); } //----------------------------------------------------------------------------- int main(void){ int i; print("\r\nTrenz Electronic ELF bootloader "__DATE__" "__TIME__"\r\n\r\n"); spi_flash_init(XPAR_AXI_QUAD_SPI_0_DEVICE_ID); // Init SPI Flash ////////////////////////////////////////////////////////// ////////// ANY USER APP ///////////////////////////////// for(i = 0; i < 100; i ++){ xil_printf("data from first app is %d", i); } /////////////////////////////////////////////////////// //////////////// END ANY USER APP ///////////////////// /////////////////////////////////////////////////////// //////////////////////////////////// // Read SSB spi_flash_read(SSB_START_ADDR, ELF_EHSIZE, char_read_buf); if(int_read_buf[0] != ELFMAG){ xil_printf("ERROR: Boot image not found\r\n"); while(1); } e_shnum = char_read_buf[ELF_HDR_SHNUM_OFF]; e_shoff = int_read_buf[ELF_HDR_SHOFF_OFF]; for(section = 0; section < e_shnum; section++){ // Sections loop spi_flash_read((SSB_START_ADDR + e_shoff + section * ELF_SHENTSIZE), ELF_SHENTSIZE, char_read_buf); sh_type = char_read_buf[ELF_HDR_SHTYPE_OFF]; sh_addr = int_read_buf[ELF_HDR_SHADDR_OFF]; sh_offset = int_read_buf[ELF_HDR_SHOFFSET_OFF]; sh_size = int_read_buf[ELF_HDR_SHSIZE_OFF]; mem_section = (u8*)sh_addr; if(sh_type == SHT_PROGBITS){ // Process only sections with data if(sh_addr == 0){ if(sh_size == 8) spi_flash_read((SSB_START_ADDR + sh_offset), sh_size, mem_section); } else // Usual sections spi_flash_read((SSB_START_ADDR + sh_offset), sh_size, mem_section); } } // Sections loop xil_printf("\r\nBoot...\r\n"); pause(1); reset_func(); // Start Second Stage while(1); } По сути тот же bootloader только адрес указывает на расположение следующего elf файла (0x00840000) и файл разместил в DDR, но не с начального адреса, а со смещением. Второй second_elf.elf это уже любой elf файл, размещенный в DDR с начального адреса.
  3. Конечно можно) К сожалению в проекте вся блочная память разделена между остальными ядрами и на процессор остается только 16 Кбайт
  4. Спасибо за ответ. У меня получается так: во флеш с нулевого адреса записывается bit файл с инициализированной bram. Инициализирована bram elf файлом, в котором программа просто находит elf файл по заданному указателю и вычитывает ИСПОЛНЯЕМЫЙ код в ДДР. То есть компилировать в screc формат нет необходимости, т.к. это elf файл из BRAM вычитывает только исполняемую часть elf для DDR.
  5. В 2017.4 vivado заново пересобрал проект и ошибка пропала. Скорее всего среда что то подтягивает от предыдущих попыток сборки.
  6. Собираемый выходной кадр необходимо хранить во внешней памяти, а у меня условие использовать только внутренние ресурсы ПЛИС.
  7. Приходит кадр из 720 строк, за длительность кадра необходимо выдать подряд 360 строк. Причем 360-ую строку буду формировать во время прихода 719 и 720. То есть в любом случае необходимо копить линии, т.к. нельзя выдать одну линию, следующую не выдавать (сигналы hsync и valid бланкированы). VESA стандарт pdf VESA_standart.pdf
  8. Сигнал valid в HDMI в течении линии будет прерываться, если я правильно понял. То есть записали в buf3 данные рассчитали первый выходной пиксель, как сумму четного, нечетного пикселя 1-ой и 2-ой строки, деленную на 4. Ждем пока запишется в buf3 четный пиксель второй строки, рассчитываем второй выходной пиксель. Когда ожидаем в сигнале valid разрыв. Кадр не отобразится на мониторе.
  9. Вывод это я для себя сделал) Если на две пришедшие выходит одна, то бланкирование через линию неизбежно при уменьшении в два раза, в этом случае монитор кадры не воспринимает.
  10. Данное усреднение или прореживание актуально только по горизонтальной развертке, тогда действительно пару буферов на 640 точек будет достаточно. Но как быть с вертикальной разверткой? Просто бланкировать каждую вторую линию для получения 360-ти линий не получится: зона active pixels должна быть без пропусков.
  11. У меня задача попроще чем у ТС. Входной поток 1280х720 60 Гц (74.25 МГц пиксельклок). Необходимо масштабировать с коэффициентом равным 2, т.е. получить 640х360 разрешение. При этом алгоритм использует только внутреннюю память ПЛИС, т.е. места для хранения всего кадра нет. Решение вижу следующее: 1. Генерировать пиксельклок ниже чем 74.25 (при этом как прочитал выше значение частоты выбирается согласно стандарта VESA), использовать буферизацию только по одной линии и расставлять согласно стандарта vsync, hsync со своими back\front porch'ами и длительностями. При этом в буфер записывать каждый второй пиксель. Кто нибудь реализовывал аналогичным способом или есть другой вариант? Собрал свой источник видеосигнала 1280х720 60 Гц, уменьшал зону active pixel в несколько раз, монитор кадры отображает. Если в зоне active pixel бланкировать через линию и в линии через пиксель (для масштабирования на 2), то монитор не отображает видео кадр. Отсюда вывод: зона active pixel должна быть без разрывов.
  12. Решаю аналогичную задачу, только интерфейс HDMI. Действительно porch можно менять в определенных пределах. Масштабирование получилось только если выдавать синхросигналы все на своих местах (кроме datavalid), изменять только datavalid сигнал, причем сначала необходимо выдавать все активные пиксели. Можно поподробней про "отскалируйте". Как я понимаю делаем следующее: прореживаем каждую линию видео кадра, буферизируем полученный масштабированный кадр и выдаем его на экран 800х600. А если необходимо обойтись без внешней памяти для буферизации? менять пиксельклок?
  13. Добрый день! Поделитесь опытом, кто работал с hdmi на ПЛИС. Сделал свой HDMI передатчик на 720p 74.25 MHz. Подключаю к монитору, наблюдаю кадры, которые формирую с заданным разрешением. Сделал свой HDMI приемник на 720p 74.25 MHz. На вход подключил выход своего передатчика. Chipscope вылавливаю данные, которые отправляю. Подаю на вход приемника выход видеокарты компьютера, при этом разрешение экрана задаю 720p. Выловить данные не могу (даже пиксельклока нет). Вопрос: видеокарта генерирует пиксельклок постоянной частоты (максимальной), независимо от выставляемого разрешения экрана? В качестве источника видеосигнала могу использовать HDMI transmiter с MAX 10 Development kit. HDMI выполнен на микросхеме ADV7513. Кто нибудь запускал данную микросхему? Генерирую видеоданные параллельной шиной (hsync, vsync, de, rgb[23:0]) но видео сигнала на выходе HDMI нет. Там еще I2C интерфейс для конфигурирования контрольных регистров. Может есть у кого готовый паттерн по I2C для запуска микросхемы? Интересует 480p или 720p для RGB.
  14. Большое спасибо! Сегодня только рассуждали, как видеокарта определяет наличие монитора. Данные сигналы заведены в ПЛИС на hdmi mojo shield
  15. HPD это сигнал для микросхемы типа ADV7513, мне на вход ПЛИС TMDS сигналы и i2c приходят на прямую.
  16. 1. Работаю со Spartan 6. 2. LVDS буфер (вообще использую готовую приставку HDMI https://embeddedmicro.com/products/hdmi-shield) 3. Для синхронизации во входных сериализованных данных вылавливаю Video Guardband (два пикселя длительноситью) Замкнул i2c монитора и видеокарты, побежал клок и сигналы с карты. Rom для EDID с i2c слейвом придется все равно реализовывать. На гитхабе есть вот такой проект https://github.com/tmatsuya/i2c_edid/blob/m.../rtl/i2c_edid.v
  17. То есть помимо TMDS с десериализатором в приемнике должен быть реализован I2C слейв, через который видеокарта вычитывает информацию о мониторе? После этого карта генерирует соответствующий пиксельклок и параллельные видеоданные.
  18. Можно поподробней? Речь идет о параметрах монитора, настраиваемых в ПК или самом мониторе?
  19. Жизненный опыт собственный и опыт друзей\знакомых показал, что учишься по одной специальности, а работаешь все равно по другой. Если у парня склонность к математике, технике, воображение развито, то только вперед! Не понравится, всегда можно перестроиться позже к тому, что более нравится (экономика, финансы и тд). А в плане востребованности специалистов переживать не стоит: люди с руками и головой нужны всегда! Если человек специалист в одной области (экономика, радиотехника, математика) и плюс программист, то точно без хлеба не останется.
  20. Добрый день! Подскажите пожалуйста, кто какие решения применял для прошивки .bit в Spartan 6 через IMPACT + Platform Cable USB II при возникновении ошибки '1': Programming terminated. DONE did not go high. Полный лог IMPACT PROGRESS_START - Starting Operation. Maximum TCK operating frequency for this device chain: 25000000. Validating chain... Boundary-scan chain validated successfully. '1': Programming device... LCK_cycle = NoWait. LCK cycle: NoWait done. '1': Reading status register contents... [0] CRC ERROR : 0 [1] IDCODE ERROR : 0 [2] DCM LOCK STATUS : 0 [3] GTS_CFG_B STATUS : 0 [4] GWE STATUS : 0 [5] GHIGH STATUS : 0 [6] DECRYPTION ERROR : 0 [7] DECRYPTOR ENABLE : 0 [8] HSWAPEN PIN : 0 [9] MODE PIN M[0] : 0 [10] MODE PIN M[1] : 0 [11] RESERVED : 0 [12] INIT_B PIN : 0 [13] DONE PIN : 0 [14] SUSPEND STATUS : 0 [15] FALLBACK STATUS : 0 INFO:iMPACT:2219 - Status register values: INFO:iMPACT - 0000 0000 0000 0000 INFO:iMPACT:579 - '1': Completed downloading bit file to device. INFO:iMPACT:188 - '1': Programming completed successfully. LCK_cycle = NoWait. LCK cycle: NoWait INFO:iMPACT - '1': Checking done pin....done. '1': Programming terminated. DONE did not go high. PROGRESS_END - End Operation. Elapsed time = 2 sec. Отладочная плата Mojo Spartan 6 https://embeddedmicro.com/products/mojo-v3 При этом Get deviceID и Get device Signature выполняются без проблем.
  21. Chipscope тоже через питон работает?
  22. Листаю этот же документ. Проблема в том, что в единицу не возвращается. Прошиться получилось! В чем причина так и не понял. Возможно где то присутствовал плохой контакт.
  23. Питание на месте и при загрузке не меняет своего значения (в том числе и питание второго банка, на котором находится пин DONE). Во время прошивки пин переходит в состояние логического нуля из единицы. Пин DONE bidirectional, внешних устройств, влияющих на него по идее нет. Пин выведен через транзистор на светодиоид. Пытаюсь разобраться не держит ли микроконтроллер на плате данный пин .
  24. Скорость снижал, Done параллельно заведен на светодиод, к земле не притянут (на плате есть возможность сконфигурировать через Atmega контроллер, при данном способе конфигурации сигнал Done срабатывает), качество клока не смотрел, т.к. device ID, device Signature через impact читаются. Настройки в Generate programming File САПР менял на Done high, unused pins pull up, clock JTAG clock и тд. Без результатов.