Jump to content

    

dde29

Участник
  • Content Count

    87
  • Joined

  • Last visited

Everything posted by dde29


  1. Под этой плисиной, квадратный пад есть? Скорее всего не в тему, но если он не пропаян - плисина даже не заведется... Будет работать в режиме кнопки. А не... они же вроде только в корпусе ультраБГА, тогда какой нафиг квадратный пад)... Вы БГАшну микросхему с таким количеством ног паяете одной лишь воздушной станцией???
  2. module test (input clk); reg data; initial begin force data = 1; end always_ff @ (posedge clk) data <= !data; endmodule Так тоже не проканало...
  3. Вероятно да, Но! Непонятный мне момент, если я, например моделирую считаемую CRC и мне необходимо смоделировать ошибку CRC, то есть искусственно в какой-то момент времени подсунуть левые данные с высоты тестбенча, в результате которых сумма получится неверная. Значит при использовании always с суффиксом _ff у меня это не выйдет...
  4. Это все понятно, но дайте все-таки разобраться. Если брать в расчет, что Ривьера просто до попы придирчивая к стандарту и блюдет всё и вся, и что не допускает любой конфликт параллельных процессов (даже не синтезируемых), то почему данный код Ривьера компилит без проблем: module test (input clk); reg data; initial begin data = 1; end always @ (posedge clk) data <= !data; endmodule Судя по всему дело именно в том что используется конструкция always против always_ff. Вероятно СВ более досконально блюдёт код. А Ментор со своим МоделСимом просто поклал на это...
  5. Всем привет. Начал тут осваивать симулятор Riviera-PRO и наткнулся на довольно нелепую проблему: Имеется модуль, в котором имеется присваивание сигналу в разных местах: ....... initial begin reset = 1'b1; end ....... always_ff @(posedge clk200) begin : sync_reset_reg reset <= ~lockpll; end ....... Казалось бы - бред, не может сигналу присваивать значение в параллельных процессах, НО. Стандарту это не противоречит, поэтому ModelSim/QuestaSim разрешает данную конструкцию, а синтезатор, например Quartusа, тупо не обратит на блок initial внимание, так как это не синтезируемая конструкция. А вот при запуске компиляции данного модуля Riviera выдает ошибку: ALOG: Error: VCP2675 C:/aldec/Riviera-PRO-2013.10/Projects/.../mymodule.v : (48, 1): Cannot write to a variable 'reset' that is also driven by an always_comb/always_latch/always_ff procedural block. Наверное существует некая опция команды alog, о которой я не знаю? P.S. Блок initial я используя в симуляции, для избежания в начальный момент времени неопределенного состояния сигнала Х, так как это в некоторых случаях чревато...
  6. Дык, вроде, дал понять, что да - получилось - изначально затык был в том, что после инициализации SysTick был установлен флаг вызова обработчика прерывания SysTick_Handler, который у меня нигде не был описан. Поэтому и висел на этом месте. После того как добавил обработчик, все стало ок...
  7. Задам, наверное глупый вопрос - а прикрутить openocd можно, например, к Dev-C++ ?
  8. Благодарю всем за дельные совет! Обязательно учту и рассмотрю все!
  9. Уверен, что когда будет писаться код под какой-то реальный проект, думаю ресурсы будут задействованы только те которые надо, а пока и так сойдет))))
  10. Для человека, который до этого из микроконтроллеров только АВР-ки программил - думаю неплохо)
  11. Вобщем, я понял почему при использовании инициализации HAL_Init() программа полностью висла (не так уж и плохо использовать HAL:) ). Пройдя вглубь функции HAL_Init(), через несколько вызовов в файле stm32f4xx_hal_cortex.c натыкаемся на функцию SysTick_Config(uint32_t ticks), в которой описана настройка регистров системного таймера: if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) { return (1UL); /* Reload value impossible */ } SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ return (0UL); Внимание обратил на флаг SysTick_CTRL_TICKINT_Msk, установка которого заставляет вызывать прерывание по сбросу системного таймера... Стало понятно, что у меня нигде не описана обработка этого прерывания. Получается проц переходит по адресу прерывания и остается там... Добавив в main.c функцию обработки прерывания по сбросу системного таймера, код стал работоспособен: void SysTick_Handler(void) { HAL_IncTick(); }
  12. Этот "быстрый" HAL_init() стартанул так, что ничего не работает)))) так что в нем еще поразбираться надо... По специфике моей профессии - нету готовых блоков IP для Альтеры, поэтому привык писать с нуля конфигурации - в этом случае и SignalTap-ом пользоваться удобнее - заранее знаешь к чем прицепиться - но это уже оффтоп)
  13. 2) и 3) Закомментировал сначала //SystemClock_Config(); - эффекта не дало... Закомментировал следом //HAL_Init(); - нужный светодиод (PD15) начал мигать... Вернул в код SystemClock_Config(); - снова все сломалось Согласно логике можно сделать вывод, что инициализация библиотек и схемы тактирования в моем проекте производится неверно... Придется либо разбираться в библиотеках HAL от STM, что геморрой, но и как Вы предложили - геморрой еще тот. Я больше на данном этапе своего ARM-развития, вероятно, предпочту первый вариант... 4) Насколько я знаю прикрутить openocd это тоже довольно сложно (работаю в виндовс), ну что ж буду копать дальше и информировать о сдвигах в положительную сторону. Спасибо! Судя по тому, что уровень моего знания STM довольно низок, писать код не используя HAL довольно сложно - потребуется много времени на штудирование документации а использование HAL от производителя как раз и направлено на, так называемый, быстрый старт... Я по основной специализации - FPGA-шник и сам сторонник, чтобы писать код самостоятельно с нуля, не используя схематик и ip-блоки, чтобы знать досконально что творится в камне, поэтому целиком и полностью понимаю Вас...
  14. Все привет! Изучаю программирование ARM-контроллеров, в частности STM32. Решил пойти следующим путем: STM32F4-DISCOVERY + ARM-NONE-EABI-GCC + собственный Makefile Выбор пал на GNU дабы использовать не коммерческие САПРы Собственный Makefile позволяет контроллировать этапы сборки. Собрал простой проект: инициализация системы (HAL_init и тактирование), ну и помыргать светодиодами. Проект собирается без ошибок, загорается светодиод, но такое впечатление, что когда доходит до цикла моргания светодиодами - виснет. И я заступорился - куда копать... Привожу проект полностью Подозрения падают на инициализацию тактирования, а также не неверный старт-ап или скрипт сборки... Может, местные Гуру подскажут что-нить дельное?) Так же отдельно приведу код main.c чтобы не качать полностью архив из-за одного файла: #include "stm32f4xx.h" #include "stm32f4xx_hal.h" static void GPIO_init(void); static void SystemClock_Config(void); static void Error_Handler(void); int main(void) { //////////////////////////////////////////////////////////////////////////// //Libraries initialization - Инициализация библиотек HAL_Init(); //GPIO initialization - Инициализация портов ввода/вывода GPIO_init(); //Clock initialiaztion - Инициализация системы тактирования SystemClock_Config(); long cnt = 0; while(1) { if (cnt == 100) {cnt = 0;} else {cnt = cnt + 1;} if (cnt <= 50) HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_RESET); else HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_SET); /* HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_SET); HAL_Delay(1000); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_RESET); HAL_Delay(1000); */ } } static void GPIO_init(void) { /////////////////////////////////////////////////////////////////////////// GPIO_InitTypeDef GPIO_InitStruct; /* Enable the GPIO_LED Clock */ __GPIOD_CLK_ENABLE(); /* Configure the GPIO_LED pin */ GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_15|GPIO_PIN_12; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FAST; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_SET); //HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_RESET); //HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET); } static void SystemClock_Config(void) { RCC_ClkInitTypeDef RCC_ClkInitStruct; RCC_OscInitTypeDef RCC_OscInitStruct; __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); //////////////////////////////////////////////////////////////////////////// //Set External High-speed oscillator type - Установка типа генератора - у нас имеется внешний кварц 8МГц RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; //SysClk = 8(HSE) / PLLM / RCC_PLLP_DIV2 * PLLN = 168 MHz RCC_OscInitStruct.PLL.PLLM = 8; RCC_OscInitStruct.PLL.PLLN = 336; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 7; if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } //////////////////////////////////////////////////////////////////////////// RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV4; if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { Error_Handler(); } HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); } static void Error_Handler(void) { /* Turn LED5 on */ HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET); while(1) { } } void _exit(int i) { while (1); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_RESET); } MyTestARM5.rar
  15. Делал так - все работает. Была ошибка разводки платы, клок подвели как раз на банк с 3.3В. Скомпилил банк на 2.5В. Все ОК. CYCLONE III.
  16. В данной флеш существует сигнал готовноыти RY#/BY# - который показывает выполнила ли микросхема требуемые действия. А именно, когда сигнал RY#/BY# находится в состоянии лог 1, значит микросхемы выполнила свой внутренний алгоритм и готова к следующим действиям. Если же сигнал RY#/BY# находится в состоянии лог 0, то микросхема занята, находится в процессе выполнения требуемой от нее операции (запись, стирание, блокировка, разблокировка) Суть проблемы. Наша фирма получила одну такую флеш... вроде как бывшую в употреблении. Нами была собрана схема, в которой данная флеш-память управляется с ПЛИС. После подачи питания на плис - все необходимые сигналы находятся нужном состоянии (WE# = 1, OE# = 1, CE# = 1, RST = 1). Т.е. сигнал RY#/BY# должен находится в состоянии ожидания (лог 1). а наша микросхема выдает лог 0, как буд-то бы микросхема занята. Сооветственно все попытки работы с флеш не увенчались успехом. Следует уточнить что микросхема снабжена алгоритмом блокировки и разблокировки. Но даже в заблокированном состоянии сигнал RY#/BY# должен быть находить в состоянии лог 1. Может у кого был опыт работы с данной флеш памятью WF2M16 от Microsemi?...
  17. Понятно, что положительные и отрицательные сигналы надо подключать к конкретным выводам ПЛИС - Differential Paires - или как там. Но выбирать куда конкретно подколючать дифференциальные сигналы, т.е. на какие пары пинов - выбираю я сам. Так вот в Pin Planner не прописаны все отрицательные сигналы - какие-то отсутствуют - именно в этом проблема!
  18. Столкнулся с Quartus II 9.1 Web Edition. Создал проект - где присутсвует циклическое ФИФО. Суть проекта. тактовый вход - LVDS - 160МГц выходная шина данных - LVDS - 16 бит фифо циклически выдает данные на выход с частотой 160 МГц. После компиляции в PinPlanner должны присутвовать выходные пины - положительные и отрицательные составляющие LVDS сигналов. Положительные присутствуют все а отрицательных половина нет. Тот же самы проект создал и Quartus II 9.0 Web Edition - такая же вата. Может кто сталкивался с этим глюком - можно ли его как-то побороть?
  19. Спасибо - да - mem_init_install. А вот как его создать и куда пихать - ваще не впонятках? :) я как понимаю его надо вкючить в MakeFile - а в куда именно?