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

Wolfsoul

Участник*
  • Постов

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

  • Посещение

Репутация

0 Обычный

Информация о Wolfsoul

  • Звание
    Участник
    Участник
  1. Ищу работу по специальности системный-программист (программист встраиваемых систем). Интересует активная работа с полной занятостью. Самый важный фактор - возможность повышения профессионального уровня в процессе работы и обучение. Прошу учитывать тот факт, что я хочу несколько сменить профиль своей деятельности. До сих пор моей основной работой было разработка цифровых устройств на базе ПЛИС фирмы Altera. Профессиональные навыки: • программирование на языках C/C++ с использованием методов объектно-ориентированного программирования и библиотек MFC; • программирование на языке Pascal; • программирование на языке описания аппаратуры VHDL; • перевод технической документации; • обладаю базовыми знаниями SQL. • опыт работы с процессорами семейств TigerShark, Nios (архитектура AVR) и TMS320C67x. Опыт работы: С 2005 г. – по настоящее время ФГУП КБ «Аметист». Должность: инженер. Должностные обязанности: • разработка управляющих программ для микроэлектронных устройств; • разработка модулей цифровой обработки сигналов и модулей сопряжения с микроэлектронными устройствами на базе программируемых логических интегральных схем (ПЛИС); • программирование микроконтроллеров; • разработка программного обеспечения (ПО) для тестирования и диагностики аппаратных средств. Отладка стороннего ПО. 2003-2005гг. ФГУП Московский Авиационный институт им. Серго Орджоникидзе, кафедра «Вычислительных комплексов, систем и сетей» Должность: техник. Должностные обязанности: • разработка диагностических программ и отладка стороннего ПО. • сравнительный анализ процессоров цифровой обработки сигналов (ПЦОС); • программирование стандартных ПЦОС; • перевод технической литературы. Образование: 2001-2007гг. Московский Авиационный институт им. Серго Орджоникидзе. факультет «Системы управления, информатика и электроэнергетика» Специальность: Вычислительные комплексы, системы и сети. Квалификация: инженер. 1996-2001гг. Московский Авиационный техникум им. Годовикова Н.Н. Специальность: Вычислительные комплексы, системы и сети. Квалификация: техник. Дополнительные сведения: ПК – опытный пользователь. Иностранные языки: английский язык – чтение, перевод со словарем, перевод технической документации. Желаемый уровень з/п: от 20000 рублей. Контактная информация: Email: [email protected]
  2. К сожалению точно ответить не смогу, но может быть Вам стоит попробовать LogicLock для конкретного блока?
  3. Проверил на плате. Результат - все нормально. Действия: 1. Запрограмил EPCS как было описано ранее. 2. Изменил сишник 3. Build-All 4. Залил флеш-программером 5. передернул питание Все работает как и ожидалось. Проверяйте свои действия. Попробуйте удалить и пересоздать сессию флеш-программера. Для того, чтоб вопрос более не возникал. Поставьте Smart компиляцию в QII, проведите полную компиляцию проекта. Измените сишник, откомпилируйте программу. Попробуйте еще раз компильнуть весь проект. Ожидаемый результат: мгновенная компиляция (изменений в железе проекта нет). Вопрос для размышления: представьте разделенную работу железячника и программера и проект заполняющий целиком весть камень (например EP2S180), а теперь представьте работу программера если ему прийдется перекомпилировать железячный проект каждый раз Вот я сам думаю, куда бы я послал тогда этот Ниос ;)
  4. Адрес резета я обычно указываю 0, пока проблем не было... (Кроме того, вроде вне зависимости от типа epcs SOPC выделяет на контроллер 800h адресов) Я на этом форуме выкладывал ссылку на аналогичную тему на niosforum.com, так там человек тоже предлагал устанавливать смещение отличное от 0, однако у меня не получилось реализовать его алгоритм - SOPC выдал ошибку. Если вы говорите о: You must program both the software project and FPGA configuration data when the CPU reset address is in EPCS flash memory. То наверное просто стоит поставить галку напротив Program FPGA configuration data into hardware-image region of flash memory и указать sof если его там еще нет. У меня потом в проекте стоит Hardware image - custom и Memory - epcs_controller. Проект, который описываю "игровой" для обучения расчитан на циклоновую DK и 100% рабочий (только что проверял прошивку). Кстати хочу сказать, что наверное не стоит располагать программу с epcs (я ее там только храню для заливки в onchip поскольку SDRAM мне использовать нельзя). А то уж больно медленно вы будете работать :) Кстати, а вы просматривали доки по программированию epcs?
  5. Насчет SRAM не знаю - таких проблем не было, кроме того обычно вместо SDRAM использую накристальную память. Вопрос: а вы случайно не забыли произвести обновление библиотечной части проекта в IDE? Она автоматически не делается. Насчет символа epcs. Какая у вас версия QII? Это вроде нужно было до 7.0... Я ничего не указываю в SOPC (версия QII 7.1). В 7.1 надо только настроить в самом проекте. Насчет прошивки программы. Я вроде уже писал... Ну да ладно. 1) Создаем проект в QII 2) Создаем Ниос 2 в SOPC 3) generate Nios II 4) Вставляем ниос в проект в QII 5) Создаем и компилируем программу для Ниоса в IDE 6) Производим компиляцию проекта в QII 7) Заливаем проект в ПЛИС через QII (нужно сформировать необходимый интерфейс с epcs) 8) используя flashprogrammer перезаливаем проект на флешку 9) сбрасываем конфигурацию (выкл, вкл питания) и смотрим результат http://electronix.ru/forum/index.php?showt...30842&st=15
  6. А на проект взглянуть мона? И ссылку на доки по киту для вашей платы, пожалуйста.
  7. Ладно, с предыдущим разобрался: не учел, что при создании компонента памяти используется Dynamic Address Alignment. Заодно извиняюсь насчет 72 - на самом деле 64 (не успел вчера исправить). Т.е. получается следующее: Ниос берет по одному адресу сразу 4 числа сливая их в одно. Нормального результата добился путем проверки сдвигом IORD(MY_MRAM_BASE,0)>>0,8, 16 или 24. Однако возни другой вопрос: Для окончательной проверки создал такой же модуль памяти в самом QII, создал новый компонент на основе vhdl описания модуля памяти в SOPC и указал использовать Dynamic Address Alignment (иначе он в 4 последовательных байта записывает одно и тоже значение, равное младшему байту в соответствии с Native Address Alignment), но проверка на плате показывает, что установку Dynamic Address Alignment (Memory Slave) SOPC при создании нового компанента проигнорировал и выставил Register Slave (проверил это еще и повторным открытием компанента, там значение Memory Slave сменилось на Register Slave без моей помощи :( ). Вопрос: как этого можно избежать? Это мой косяк или прикол в довесок к QII 7.1?
  8. Изучая Ниос II, столкнулся с еще одной непонятностью: Создал я системный модуль. В него включил процессор, память и PIO. Ради интереса решил попробовать обращение к памяти из IDE. Создал дополнительный компонент памяти (RAM, тип MRAM, data width = 8, Total memory size = 256 byte, Read latency Slave s1 = 1). Подсоединил только к data master. Вставил системный модуль в проект, откомпилировал. В IDE попробовал провернуть следующее обращение: IOWR(ONCHIP_MEM_BASE, <смещение> , <записываемое число>); А затем записать на выходные PIO: IOWR_ALTERA_AVALON_PIO_DATA(MY_CPU_INOUT_DATA_BASE, IORD(ONCHIP_MEM_BASE,<смещение>)); Так вот, пока записываю/читаю по адресам до 72, все нормально, но как только пытаюсь обратиться по более старшим адресам, то получаю фигню. Вопрос, чем это вызвано? Я предполагаю, что это как-то связано с адресацией, но не пойму как.
  9. Вы добавили не тот файл. Добавленный Вами файл отвечает за соединение портов блока lpm_add_sub0 с остальными блоками (карта портов), он не содержит разделов, в которыйх описывается его архитектура, функциональность и порты. Для устранения предупреждения, Вам следует присоединить к проекту файл lpm_add_sub0.vhd (без окончания _inst). Добавленный Вами, файл (lpm_add_sub0_inst.vhd) следует исключить из проекта. Обратите также внимание на то, что Ваш Warrning имеет уровень важности "Info" (информационный) т.е. не требует обязательной реакции на него.
  10. Не уверен, что прав, но вероятно у Вас в 2-х проектах были созданы 2 объекта (например счетчика), имеющих одно и тоже имя, но разные настройки. Попробуйте в дочернем проекте заменить тот блок, на который ругается компилятор и придать ему уникальное имя.
  11. Для программирования кристалла с использованием EPCS с заливкой внутри этой флэш-памяти программы для Nios II, необходимо выполнить следующие действия: В Quartus II: 1. Создать проект, в который будет установлен системный модуль 2. Указать тип используемого устройства флэш-памяти (это необходимо сделать и при отсутствии Ниоса в проекте, для программирования кристалла, используя флэш-память). В SOPC Builder нужно: 1. Создать требуемый системный модуль. 2. Установить контроллер EPCS памяти и указать его адреса и прерывание (автоматически). 3. Сгенерировать системный модуль. В IDE: 1. Написать программу, которая будет выполняться процессором. 2. Откомпилировать проект. В Quartus II: 1. Установить системный модуль в проект (через Мегавизор). 2. Выполнить полную компиляцию проекта и сгенерировать файл *.sof. 3. «Залить» проект в ПЛИС. НЕ выключая плату. В IDE: 1. Запустить Flash Programmer и создать новую сессию в нем. 2. Установить «галку» перед строкой «Program FPGA configuration data into hardware-image region of flash-memory». 3. Убедиться, что в строке «FPGA Configuration (SOF)» указан нужный файл. А в пункте «Memory» указан EPCS контроллер. 4. Запустить программатор. 5. Сбросить плату (выключить и включить питание). Процедура проводилась в Quartus II v7.1 для DK на основании Cyclone и платы с Stratix II. Необходимо отметить, что в версии QII 7.1 отсутствует необходимость создавать «Описание платы». О предыдущих версиях квартуса, не знаю. PS Если найдете неточности в описании, то пишите и я их исправлю.
  12. При необходимости создать свое прерывание процессора от внешнего устройства рабочей оказалась следующая последовательность действий: 1. SOPC builder: a. Создать компонент PIO назначив его настройки аналогично HW tutorial для Nios (входы, на 1 модуль PIO выделяется одно прерывание, синхронные, захват по фронту) b. Созданному модулю(ям) распределить адреса и прерывания. c. Сгенерировать системный модуль (ну сам Ниос в общем) 2. В IDE: a. Произвести инициализацию PIO, например: static void init_button_pio() { /* Переопределение глобального указателя edge_capture * для соответствия прототипуalt_irq_register()*/ void* edge_capture_ptr = (void*) &edge_capture; /* Разрешение прерывания*/ IOWR_ALTERA_AVALON_PIO_IRQ_MASK(CPU_MY_PIO_IRQ_MODULE_BASE, 0x1); /* Сброс регистра захвата фронта*/ IOWR_ALTERA_AVALON_PIO_EDGE_CAP(CPU_MY_PIO_IRQ_MODULE_BASE, 0x0); alt_irq_register( CPU_MY_PIO_IRQ_MODULE_IRQ, edge_capture_ptr, handle_button_interrupts ); } В данном случае ISR инициализируется внутри функции инициализации PIO b. Написать функцию обработчик прерывания, например: static void handle_button_interrupts(void* context, alt_u32 id) { /* сопоставление указателя edge_capture_ptr и указателя на контекст*/ volatile int* edge_capture_ptr = (volatile int*) context; /* * Чтение значения регистра захвата фронта с PIO. * Сохранение значения. */ *edge_capture_ptr = IORD_ALTERA_AVALON_PIO_EDGE_CAP(CPU_MY_PIO_IRQ_MODULE_BASE); /* Пользовательский код */ /* Запись в регистр захвата фронта для сброса его */ IOWR_ALTERA_AVALON_PIO_EDGE_CAP(CPU_MY_PIO_IRQ_MODULE_BASE, 0); /* reset interrupt capability for the PIO. */ IOWR_ALTERA_AVALON_PIO_IRQ_MASK(CPU_MY_PIO_IRQ_MODULE_BASE, 0x1); } 3. Написать основную программу. 4. Откомпилировать проект. 5. Запустить проект на плате. Использованные материалы: Nios Hardware Development tutorial (для Nios), Nios II Software Developer’s Handbook для QII v7.1 (раздел ISR), Upgrading Nios Processor Systems to the Nios II Processor (для тех, кто не знаком с Nios эта часть не нужна) и Quartus II Version 7.1 Handbook Volume 4: SOPC Builder, alt_irq.h. Данные, пригодившиеся в мануалах: Nios Hardware Development tutorial – как создать модуль для приема прерывания через PIO. Nios II Software Developer’s Handbook для QII v7.1 (раздел ISR) – как инициализировать прерывание и написать код для его обработки. Upgrading Nios Processor Systems to the Nios II Processor – что изменилось в командах для Ниос 2. Quartus II Version 7.1 Handbook Volume 4: SOPC Builder – как создать компонент и как это делается на примере SDRAM. Alt_irq.h – какие действия выполняются при регистрации прерывания. (напомню, что эту библиотечку можно найти в папке с библиотечными файлами проекта после генерации системного модуля или открыть ее из IDE также после генерации системного модуля). Успеха всем нам, начинающим. PS найдете неточности, пишите и я исправлю ошибки.
  13. Я просмотрел дополнительные рабочие примеры программ. Взял за основу пример count_binary, прилагаемый с IDE и немного изменил код программы: #include "system.h" #include "sys/alt_irq.h" volatile int my_context; volatile unsigned char qqq = 0; void My_ISR(void* context, alt_u32 id); int main (void) { alt_irq_init (ALT_IRQ_BASE); volatile unsigned int *out; out = (unsigned int*) MY_OUT_BASE; volatile unsigned char a = 0; volatile unsigned char b = 0; volatile int i = 1; void* my_context_ptr = (void*) &my_context; alt_irq_register(MY_IRQ_IRQ , my_context_ptr,My_ISR); while(1) { a = a+5; if (a>240) a=0; *out = a; for(i=0;i<10000;i++) //просто задержка, чтоб не дергать выходной рег-р b = i+b; } return 0; } void My_ISR(void* context, alt_u32 id) { volatile int* my_context_ptr = (volatile int*) context; qqq += 1; while(1); } Результат следующий: виснуть проект перестал, но ожидаемых действий не наблюдается (вместо того, чтобы остановится внутри обработчика прерывания и прекратить запись на выходные регистры, продолжается вывод на выходную шину чисел, кратных 5) Изучал alt_irq.h, alt_irq_enable как я понял делать не надо тк он выполняется при выходе из alt_irq_register.c. Правда не до конца уверен, что понял, что делает alt_irq_pending и как его можно использовать (не совсем улавливаю смысл), тч если не сложно поясните, пожалуйста. Пробовал использовать alt_irq_init, но хоть и написал строку аналогичную примеру hello_alt_main.c (alt_irq_init (ALT_IRQ_BASE); ), но результат остался тот же :( Возвращаемые значения alt_irq_pending и alt_irq_enable всегда равны 0. alt_irq_enabled возвращает 1. Может кто-нибудь предложит идеи? Заранее спасибо...
  14. Возникла проблема с реализацией пользовательской обработки прерывания. Реализован процессор Nios II. Список элементов следующий: - CPU Ниос 2 - ROM на on_chip_mem - RAM на on_chip_mem - Выходной пользовательский интерфейс (выходная от Ниоса шина данных и линия разрешения записи) My_out - Выходной пользовательский интерфейс (входная линия прерывания irq) My_irq. В IDE написан код программы: #include "system.h" #include "sys/alt_irq.h" void My_ISR(); int main() { volatile unsigned int * out; out = (unsigned int*) MY_OUT_BASE; volatile int a = 20; alt_irq_register(MY_IRQ_IRQ ,0,My_ISR); while(1) { a = a+5; if(a > 250) a = 0; *out = a; } void My_ISR() { volatile unsigned int *qqq; qqq = (unsigned int*) MY_OUT_BASE; while(1) { *qqq = 1; } } Содержимое system.h о My_irq: #define MY_IRQ_NAME "/dev/My_irq" #define MY_IRQ_TYPE "altera_avalon_user_defined_interface" #define MY_IRQ_BASE 0x00002004 #define MY_IRQ_SPAN 4 #define MY_IRQ_IRQ 16 #define MY_IRQ_IMPORTED_WAIT 0 #define MY_IRQ_NIOS_GEN_WAITS 1 #define MY_IRQ_SIMULATE_IMPORTED_HDL 0 #define MY_IRQ_PORT_TYPE "Avalon Slave" #define MY_IRQ_HDL_IMPORT 0 #define MY_IRQ_TIMING_UNITS "cycles" #define MY_IRQ_UNIT_MULTIPLIER 12.5 #define MY_IRQ_SETUP_VALUE 0 #define MY_IRQ_HOLD_VALUE 0 #define MY_IRQ_WAIT_VALUE 0 #define MY_IRQ_ADDRESS_WIDTH 32 #define MY_IRQ_MODULE_LIST "" #define MY_IRQ_SHOW_STREAMING 1 #define MY_IRQ_SHOW_LATENCY 0 #define MY_IRQ_TECHNOLOGY "User Logic" #define MY_IRQ_FILE_COUNT 0 #define MY_IRQ_PORT_COUNT 1 #define MY_IRQ_COMPONENT_DESC "" #define MY_IRQ_MODULE_NAME "" Идея: при поступлении прерывания на вход процессора, он проваливается в процедуру обработки прерывания и записывает в бесконечном цикле в выходной регистр число. Программа предназначена только для освоения создания собственных обработчиков прерываний. Проблема: отсутствует реакция на сигнал прерывания, описанная в программе. После поступления сигнала прерывания процессор подвисает (не производя вывода ожидаемой величины = 1) и более не выполняет никаких действий. Основное тело программы выполняется нормально до поступления прерывания. Самостоятельно ошибку найти не смог. Подобную программу писал на Nios, все работало (только использовалась процедура nr_installuserisr(na_My_irq_irq, My_ISR, 0); ). Использовал САПР Quartus II 5.1 и прилагаемые к нему SOPC Builder и IDE (Nios II Evalution). Связь IDE-Board через ByteBlasterII и jtag. Запуск ПО осуществляю через «Run As…». Текст в консоле: Using cable "ByteBlasterII [LPT1]", device 1, instance 0x00 Pausing target processor: OK Downloading 00010020 ( 0%) Downloaded 7KB in 0.2s (35.0KB/s) Verifying 00010020 ( 0%) Verified OK Leaving target processor paused
  15. Кое в чем разобрался, так что отвечу на свой же вопрос (вдруг кому-то тоже прийдется столкнуться). 1. При использовании собственной платы, отличной от Nios DK, необходимо сначала создать описание этой платы. Опиани платы можно создать опираясь на Quartus II Handbook, Volume 4: SOPC Builder (Board Description Editor). На www.altera.com рекомендую искать именно как Board Description Editor. 2. Если я правильно понял, то использование EPCS для хранения программы это скорее фича Nios II и к Nios отношения не имеет (вероятно ошибаюсь, вернусь к этому вопросу как только разбирусь поглубже с описанием платы). Кроме того в 3. EPCS Device Controller Core with Avalon Interface нашел следующую интересную фразу: The core provides drivers for HAL-based Nios II systems, and the precompiled boot loader code compatible with the Nios II processor. No software support is provided for any other processor, including the first-generation Nios. Спасибо за помощь.
×
×
  • Создать...