Разработка приложений для СнК SmartFusion2 с использованием средств разработки Libero SoC и SoftConsole.
Часть 1
Решить проблемы безопасности в мире «Интернета вещей» можно, предоставив пользователю надежную систему защиты от несанкционированного вторжения не только в его данные, но и в само устройство. Подобная система защиты должна быть реализована на уровне кристалла микросхемы. Первыми и пока единственными семействами микросхем, имеющих указанные средства защиты на уровне, достаточном для осуществления концепции «Интернета вещей», являются системы на кристалле SmartFusion2 и ПЛИС Igloo2 корпорации Microsemi.
Данная статья открывает цикл материалов, посвященных особенностям проектирования для систем на кристалле SmartFusion2.
Краткий обзор архитектуры СнК SmartFusion2
Структурная схема СнК SmartFusion2 представлена на рис. 1.
Основные структурные элементы СнК SmartFusion2 — это микроконтроллерная подсистема с большим набором аппаратно реализованных блоков интерфейсов, матрица ПЛИС и системный контроллер с его подсистемой безопасности.
Структурная схема FPGA Igloo2 показана на рис. 2.
Архитектура Igloo2 включает подсистему памяти, сильно сокращенную версию микроконтроллерной подсистемы SmartFusion2, матрицу ПЛИС и системный контроллер.
Состав аппаратурных блоков, входящих в СнК SmartFusion2 и ПЛИС Igloo2, изображен на рис. 3.
При рассмотрении рис. 3 может показаться, что Igloo2 является некоторой усеченной версией SmartFusion2. Так и есть на самом деле. Кристаллы SmartFusion2 и Igloo2 производятся в едином техпроцессе. Затем на финишной стадии у некоторого количества кристаллов лазером отсекается часть блоков. Делается это для того, чтобы не платить роялти за такие элементы архитектуры, как процессор ARM Cortex-M3, контроллер CAN-интерфейса и т. п., поскольку известно, что довольно большое количество микросхем будет иметь спрос и без указанных блоков архитектуры. По выходе с конвейера соответствующие чипы SmartFusion2 и Igloo2 имеют совместимость pin-to-pin, что позволяет мигрировать с одного семейства на другое без переразводки печатной платы.
Более подробно архитектура СнК SmartFusion2 и ПЛИС Igloo2 описана в статье [1].
В рамках данного цикла статей СнК SmartFusion2 представляет наибольший интерес как чип с полным набором периферийных блоков. Компания Microsemi представляет целую линейку отладочных плат на основе SmartFusion2 [2]. Для отработки описываемых примеров проектирования подойдет любая из существующих.
Создание проекта
В качестве первого задания для СнК Smart-Fusion2 возьмем ставший классическим пример программы, выполняющей отправку сообщения “Hello, world!” по интерфейсу UART микроконтроллерной подсистемы и мигание светодиодом, которое реализуем в FPGA-матрице.
Запускаем среду разработки Libero SoC 11.6., кликнув на ярлычок на рабочем столе или на аналогичный в меню «Пуск» (рис. 4).
Создаем проект (рис. 5).
В главном меню LiberoSoC выбираем команду Project/New Project, запускаем мастер создания нового проекта. В появившемся окне указываем название нашего проекта LedUART и его место расположения на диске. Нажимаем кнопку Next (рис. 6).
В появившемся окне Device selection указываем нужные параметры, в выпадающих списках выбираем PartNumber микросхемы, с которой будем работать. Нажимаем Next (рис. 7).
В следующем окне выбираем настройки стандарта ввода/вывода по умолчанию, напряжение питания PLL и задержку старта микросхемы после сигнала Reset. Нажимаем кнопку Next (рис. 8).
В следующем появившемся окне отмечаем мастер, который будем использовать для настройки микроконтроллерной подсистемы. Нажимаем кнопку Next (рис. 9).
В следующих появляющихся окнах ничего не меняем, просто нажимаем Next до появления окна следующего содержания (рис. 10).
Сгенерированный мастером компонент LedUART_MSS_0 отражает состояние настроек микроконтроллерной подсистемы по умолчанию (рис. 11).
Нам нужно изменить эти настройки в соответствии с задачами, решаемыми нашим приложением. Приложение отправляет сообщение “Hello world!”, используя аппаратный интерфейс UART микроконтроллерной подсистемы. Для выполнения этой операции понадобится один контроллер интерфейса UART. Настроим его, дважды щелкнув на блоке MMUART_0. В появившемся окне выберем настройки, показанные на рис. 12.
Мигание светодиодом реализуем средствами матрицы ПЛИС, микроконтроллерная подсистема в этом участвовать не будет, поэтому все блоки архитектуры, кроме MMUART_0, которые можно отключить, мы отключаем, снимая галочку, как показано на рис. 13.
Для обеспечения работы нашего проекта остается настроить подсистему тактирования (MSS_ССС) и сброса (MSS_Reset). Система тактирования СнК SmartFusion2 синтезирует заданные пользователем номиналы частот и доводит тактовые сигналы до различных блоков архитектуры, таких как процессор Cortex-M3, контроллер DDR-памяти и т. п. Для реализации нашей задачи установим значения тактовых частот CLK_BASE и M3_CLK равными 50 и 100 МГц, как показано на рис. 14.
Система сброса позволяет реализовать различные способы прохождения сигналов сброса внутри системы. В рамках нашего проекта выберем настройки, показанные на рис. 15.
После выполнения описанных действий окно настроек микроконтроллерной подсистемы должно выглядеть, как на рис. 16.
Синтезируем компонент микроконтроллерной подсистемы с нашими настройками, выполнив команду SmartDesign/Generate Component основного меню или нажав кнопку с пиктограммой .
Затем сохраняем текущие настройки, выполнив команду Project/Save или нажав кнопку с пиктограммой .
Переходим в окно проектирования верхнего уровня нашего проекта. После настройки микроконтроллерной подсистемы внешний вид компонента LedUART_MSS_0 изменился — в правом верхнем углу компонента появился восклицательный знак на желтом фоне.
Это значит, что описание верхнего уровня компонента LedUART_MSS_0 нужно обновить. Для этого кликаем правой кнопкой на компоненте и в появившемся меню выбираем Update Instance with Latest Component (рис. 17).
После выполнения обновления компонента его внешний вид приобретает окончательную форму, необходимую для выполнения нашей задачи, то есть отображаются только выбранные нами блоки и сигналы (UART, Reset, Clock), все отключенные нами блоки более не отображаются (рис. 18).
Теперь нужно добавить компоненты, отвечающие за тактирование, системный сброс и мигание светодиодом. Для генерации сигнала тактирования используем компонент Chip Oscillators палитры Clock & Management из каталога. Окно настройки компонента вызываем как обычно, двойным щелчком левой кнопки мыши на компоненте (рис. 19).
Для тактирования работы СнК SmartFusion2 можно применить как внешние кварцевые генераторы, подключаемые к специальным контактам СнК, так и внутренние RC-генераторы на 50 и 25 МГц. Для нашего тестового задания выбираем внутренний генератор на 50 МГц. Тактирующий сигнал нужно подать на пользовательскую логику, как показано на рис. 20.
Компонент, отвечающий за системный сброс, находится в палитре компонентов Macro Library стандартного каталога и в настройке не нуждается.
Стандартного компонента для мигания светодиодом, разумеется, не существует. Его нужно сделать самостоятельно. Для выбранной нами частоты внутреннего генератора 50 МГц, чтобы обеспечить интенсивное мигание приблизительно 6 раз в секунду, вполне достаточно простого счетчика на 23 разряда. Для этого создаем файл HDL-описания счетчика, выполнив команду File>New>HDL (рис. 21).
В появившемся окне выберем язык HDL-описания (VHDL или Verilog) и введем имя создаваемого компонента (рис. 22).
После этого среда создаст текстовый файл, в котором нужно ввести HDL-описание нашего счетчика на выбранном нами языке описания. Тест HDL-описания на языке VHDL приведен на рис. 23.
Одновременно с созданием файла HDL-описания во вкладке Design Hierarchy появилось название созданного нами компонента — таким образом, мы получили возможность использовать созданный компонент в нашей системе. Для этого переносим мышкой название компонента на рабочее поле проекта, аналогично тому, как мы это делали с компонентами из стандартного каталога. Результат представлен на рис. 24.
Для того чтобы соединить нужные контакты, необходимо при нажатой кнопке клавиатуры Ctrl выделить мышкой контакты, которые собираемся соединить, затем нажать правую кнопку мыши, в появившемся меню выбрать пункт Connect, как показано на рис. 25.
Выход счетчика у нас имеет разрядность [22:0], для зажигания светодиода будем использовать только самый старший разряд, который нужно вычленить из группы. Для этого нажимаем на контакте Q [22:0] правой кнопкой мыши и выбираем пункт Edit Slice. В появившемся окне нажимаем кнопку Add Slice Entry (зеленый знак «плюс») и заполняем таблицу по образцу, представленному на рис. 26.
Выводим нужные сигналы на верхний уровень для дальнейшего подключения контактов СнК, последовательно нажимаем на контакты Q [22] компонента MyCounter_0, MMUART_0_FABRIC компонента LedUART_MSS_0, в выпадающем меню выбираем пункт Promote to Top Level (рис. 27).
Неиспользуемые выходы компонентов следует пометить выбором пункта Mark Unused в меню, выпадающем при нажатии правой кнопки мыши на соответствующем контакте.
Выполняем команды меню Save и Generate Component.
Переходим во вкладку DesignFlow и выполняем команду Place and Route>IO Constraints (рис. 28).
Назначаем номера контактов внешним соединениям проекта. Сохраняем внесенные изменения и закрываем I/O Editor (рис. 29).
В рамках данного примера ввиду простоты FPGA-части проекта мы опускаем моделирование дизайна в Modelsim. Разумеется, при разработке реальных проектов пропускать исследования поведенческой модели не следует.
Подключаем программатор к устройству с СнК, подаем на плату питание, запускаем команду Program Design/Run PROGRAM Action. В результате выполнения данной команды будет синтезирован файл конфигурационной последовательности, который будет загружен в кристалл. Об окончании процесса можно судить по зажиганию зеленого светодиода на программаторе и миганию выбранного светодиода на плате отладочного набора.
Разработка встроенного программного обеспечения процессора Cortex-M3
Выполняем конфигурирование драйверов блоков архитектуры. Для этого выбираем необходимые для нашего приложения драйверы встраиваемого программного обеспечения (рис. 30). Для демонстрации работы интерфейса MMUART_0 нам понадобятся драйверы интерфейса MMUART и библиотека CMSIS.
Теперь можно запустить генерацию тестового проекта встраиваемого программного обеспечения (ВПО). Для этого выполним команду Export Firmware. В появившемся окне (рис. 31) выберем среду разработки ВПО, в которой в дальнейшем будем работать. Предлагается три возможные среды разработки: SoftConsole, IAR EWARM и Keil. В рамках данного примера выберем SoftConsole, ставим галочку Create project for selected Software Tool Chain и нажимаем OK. В папке проекта появится каталог SoftConsole с файлами проекта ВПО.
Теперь необходимо внести в код программы работы процессора нужные нам изменения. Для этого запускаем SoftConsole v3.4. При старте среда просит указать проект, с которым мы собираемся работать. Указываем расположение папки LedUART_MSS_CM3 (рис. 32).
После этого откроется основное окно среды разработки SoftConsole, которое должно выглядеть так, как показано на рис. 33. Если во вкладке Project Explorer отсутствует наш проект, его нужно загрузить вручную, выполнив команды File>Import, в открывшемся окне во вкладке General выбрать пункт Existing Project into Workspace и в следующем появившемся окне указать расположение проекта Firmware, то есть …\LedUART\SoftConsole\LedUART_MSS_CM3. После чего окно примет вид, показанный на рис. 33.
Теперь нужно открыть файл main.c и отредактировать его содержимое. Полный текст программы показан на рис. 34. Кроме того, архив проекта со всеми исходными текстами можно скачать по ссылке [3]. Помимо приветствия, в код программы добавлены строки по реализации «зеркала», то есть отправки в порт полученного из порта символа.
Создаем исполняемый файл, выполнив команду Project>Clean основного меню.
Пошаговая отладка кода встраиваемого программного обеспечения
Для выполнения отладки необходимо подключить программатор FlashPro4 к отладочной плате и персональному компьютеру, выполнить подсоединение SmartFusion2 к персональному компьютеру по интерфейсу MMUART_0. После этого следует запустить программу-терминал для отображения на экране ПК посылаемых SmartFusion2 сообщений. Приступим к пошаговой отладке программы, выполнив команду основного меню Softconsole Run>Debug Configurations. В появившемся окне дважды щелкаем левой кнопкой мыши на строке Microsemi Cortex-M3 Target, появляется пункт LedUART_MSS_CM3_app. Щелкаем на нем и нажимаем кнопку Debug. В результате описанных действий запускается пошаговая отладка разработанного нами приложения. При нажатии кнопки Step Over или клавиши F6 клавиатуры выполняется очередная строка кода программы. Для реализации кода в непрерывном режиме нажмем кнопку Resume (клавиша F8 клавиатуры) и пронаблюдаем отправку в окно терминала символов, вводимых нами с клавиатуры (рис. 34–36).
На этом первое знакомство с процессом разработки проекта для СнК SmartFusion2 с использованием Libero SoC и SoftConsole считаем состоявшимся.
- Иоффе Д., Казаков А. SmartFusion2 и IGLOO2 — надежные, экономичные, компактные // Компоненты и технологии. 2014. № 8.
- Иоффе Д., Казаков А. SmartFusion2 и IGLOO2 в помощь разработчику. Обзор отладочных плат для новых семейств ПЛИС корпорации Microsemi // Компоненты и технологии. 2014. № 10.
- drive.google.com/open?id=0B6gJ23CPBznKQlVzMklLR3JIMFU /ссылка утрачена/