Московский Государственный Технический Университет имени
Центр обучения Altera
Лабораторная работа №1
"Создание простой системы в SOPC Builder
в пакете Quartus II"
Москва
2009
Содержание
Цель работы.. 2
1. Часть I. Создание системы NIOS II. 2
2. Часть II. Процесс проектирования ПО.. 11
Цель работы
Изучить средства создания систем на кристалле на основе процессора Nios II фирмы Altera. Освоить методику создания и конфигурации систем на кристалле. Реализовать и отладить программное обеспечение системы на кристалле. Освоить методики отладки проекта с применением современных программных и аппаратных средств.
Требования к аппаратному обеспечению:
Для выполнения лабораторных работ требуется, чтобы к компьютеру была подключена отладочная плата NIOSII Development Board, Stratix II Edition (RoHS).
1. Часть I. Создание системы NIOS II
Цель: получение базовых навыков конфигурации системы на кристалле на основе процессора NiosII в средстве SOPC Builder. Подготовка проекта системы на кристалле для использования в следующих лабораторных работах.
Порядок выполнения работы
1. Создайте каталог C:\altera\81\qdesigns\nios_course\altera_trn.
Внимание! Имена проектов и каталогов не должны содержать русских букв и пробелов, так как в этом случае не будут выполняться Tcl скрипты и Java, используемые в средствах разработки. Пробелов и русских букв также не должно быть в сетевом имени компьютера и имени пользователя. Не рекомендуется создавать каталоги в папках установки quartus и niosll, так как доступ к файлам и их модификация могут быть заблокированы (зависит от прав пользователя).
Скопируйте в созданный каталог файл nios_II_lab_l. exe и разархивируйте. Будет создан каталог nios_II_Iab. Каталог содержит частично реализованный проект для отладочной платы. Откройте частично реализованный проект niosII_lab. qpf в САПР Quartus II.
2. Определите семейство ПЛИС и разводку выводов проекта. Для настройки используйте скрипт TCL, имеющийся в каталоге проекта. Скрипт содержит настройки микросхемы и разводки выводов для данной отладочной платы. В меню Tools выберите Tcl Scripts, далее в папке проекта выберите скрипт, соответствующий используемой отладочной плате (Setup_Stratix_2S60N. tcl) и нажмите Run.
3. Переходим к созданию системы на кристалле. Запустите SOPC Builder из меню Tools. Задайте имя системы niosII. Выберите язык реализации VHDL. В окне SOPC Builder (Рис. 1) проверьте выбор семейства Stratix II. Должна быть установлена целевая частота системы, равная 50 МГц. Эта частота соответствует частоте генератора, установленного на плате.

Рис. 1 – SOPS Builder
4. Добавьте в проект ядро процессора Nios II Processor. Для этого сделайте двойной щелчок на пункте Nios II Processor в каталоге компонентов. В составе системы появится процессорное ядро и будет выведен диалог настройки параметров процессора (Рис. 2).

Рис. 2 – диалог настройки параметров процессора Nios II
Выполните следующие настройки:
На странице Core Nios II выберите тип ядра Nios II/s. Не изменяйте остальные настройки (реализация умножения на DSP блоках, отсутствие аппаратного делителя). Адреса векторов сброса Reset Vector и исключения Exception Vector будут настроены позже, после добавления модулей памяти и распределения адресов (формирования карты памяти). Обратите внимание на различия в функциональных характеристиках и быстродействии трех версий процессорного ядра.
На странице Caches and Memory Interfaces установите объем кэша команд, равный 4 кбайт. Поддержку пакетных передач (Enable Bursts) включать не требуется, так как в данной лабораторной работе память программ будет расположена в быстрой внешней статической памяти. При использовании динамической памяти включение пакетных передач желательно. Также задействуйте один порт тесно связанной памяти команд (tightly coupled instruction master port). Этот тип памяти используется для прямого доступа процессора к модулям оперативной памяти на кристалле. Это позволяет повысить производительность и избежать конфликтов, например, при одновременном доступе к общей внешней шине системы шин данных и инструкций процессорного ядра.
На странице JTAG Debug Module выберите опцию Level 3. Это включит в проект поддержку всех перечисленных отладочных функций.
Остальные настройки системы пока изменять не требуется.
Нажмите Finish для завершения конфигурации процессора и добавления его в состав системы.
5. Переименуйте процессор, вызвав контекстное меню Rename на его имени (или нажмите F2). Задайте имя срu и нажмите ввод.
Внимание!: Важно вводить имена всех добавляемых в SOPC Builder модулей в точном соответствии с инструкцией. Модули связаны с настройкой выводов, осуществленной из выполненного в п. 2 скрипта, а также с кодом на языке С, поэтому являются чувствительными к регистру. Так как код для данной лабораторной работы уже частично реализован, ошибка в названии может привести или к необходимости правки кода, или к необходимости исправления системы, ее повторной генерации и компиляции, что занимает значительное время!
6. Теперь добавим модули, реализующие интерфейс периферийными устройствами, установленными на плате. Добавьте мост шины с третьим состоянием Avalon-MM Tri-State Bridge из группы Bridges and Adapters->Memory Mapped. Убедитесь, что задана опция Registered. Нажмите Finish. Переименуйте модуль в ext_ssram_bus. Этот тип шины используется для доступа к внешним периферийным устройствам, использующим общую шину. В используемой макетной плате этот модуль нужен для обеспечения работы с микросхемой статической памяти по двунаправленной шине данных.
7. Добавьте интерфейс со статической памятью Cypress CY7C1380C-167 из группы Memories And Memory Controllers в проект. В группе Timing parameters значение параметра Read latency (cycles) выберите равным 2 (при чтении из памяти задержка равна двум тактам). В группе SSRAM size значение параметра Memory size (MBytes) выберите равным 2. Переименуйте модуль, задав имя ext_ram.
8. Присоедините добавленный интерфейс модуля памяти к шине с третьим состоянием ext_ssram_bus, соединив порт модуля памяти s1 с портом шины tristate_master. При наведении мыши на область коммутации соединений модулей Connections отображаются задействованные и возможные, но незадействованные связи модулей (Рис. 3).
9. Определите, какие линии интерфейса статической памяти являются общими. Для этого двойным щелчком откройте диалог настройки модуля ext_ssram_bus и на странице Shared Signals отметьте, что они используют общую шину адреса и шину данных (Ошибка! Источник ссылки не найден.).
Внимание!: Если столбец Connections не отображается, включите его отображение в меню View-> Show Connection Column.

Рис. 3 – соединение модуля памяти и контроллера шины
10. Добавьте еще один мост шины с третьим состоянием Avalon-MM Tri-State Bridge. Переименуйте модуль в ext_flash_enet_bus. Как уже было сказано выше, этот тип шины используется для доступа к внешним периферийным устройствам, использующим общую шину. В используемой макетной плате это флэш-память и контроллер Ethernet (в данной лабораторной работе последний не используется).
11. Добавьте интерфейс с флэш-памятью Flash Memory (CFI) из группы Memories And Memory Controllers в проект. Выберите предустановленные настройки для микросхемы AMD29LV128M123R_BYTE с разрядностью шины адреса 24 и шины данных 8. Переименуйте модуль, задав имя ext_flash.
12. Присоедините добавленный интерфейс модуля флэш-памяти к шине с третьим состоянием ext_flash_enet_bus, соединив порт модуля памяти s1 с портом шины tristate_master.
13. По аналогии со статической памятью определите, какие линии интерфейса флэш-памяти являются общими.

Рис. 4 – настройка общих линий на шине с третьим состоянием
14. Добавьте периферийный модуль JTAG UART из группы Interface Protocols ->Serial, не изменяя значений по умолчанию. Убедитесь, что на странице Simulation выбрано Create ModelSim alias to open a window showing output as ASCII text. Переименуйте модуль, задав имя jtag_uart. Данный модуль будет использоваться для вывода информации в консоль при отладке через загрузочный кабель JTAG.
15. Добавьте параллельную шину ввода/вывода PIO (Parallel I/O) из группы Peripherals->MicrocontroIIer Peripherals. Настройте разрядность Width 16 бит и направление только на вывод output ports only. Переименуйте модуль, задав имя seven_seg_pio. Данная шина используется для вывода данных на два семисегментных индикатора на плате.
16. Добавьте еще одну параллельную шину ввода/вывода PIO (Parallel I/O). Установите разрядность 8 бит и направление только на вывод output ports only. Задайте имя Ied_pio. Эта шина используется для вывода информации на 8 светодиодов, установленных на плате.
17. Добавьте еще одну параллельную шину ввода/вывода PIO (Parallel I/O). Установите разрядность 4 бита и направление только на ввод Input ports only. Задайте имя button_pio. Эта шина используется для ввода информации от четырех кнопок, установленных на плате.
18. Добавьте таймер Interval Timer из группы Peripherals->Microcontroller Peripherals. Не изменяйте настроек по умолчанию. Задайте имя sys_clk_timer. Этот таймер будет использоваться для генерации прерываний системного таймера с периодом, равным по умолчанию 1мс.
19. Добавьте еще один таймер Interval Timer. Измените период таймера, установив значений 1 мкс. Переименуйте таймер, задав имя high_res_timer. Этот таймер будет использоваться для точного измерения временных интервалов.
20. Добавьте модуль System ID Peripheral из группы Peripherals->Debug and Performance. Идентификатор обновляется при каждой генерации системы и позволяет контролировать соответствие сгенерированного программного кода реализованной системе на кристалле. Если значение идентификатора в программном обеспечении и в загруженной в ПЛИС системе не совпадает, при загрузке программного обеспечения будет выдана ошибка. Задайте имя модуля sysid, так как в противном случае функции системной библиотеки, проверяющие в процессе запуска ПО на системе на кристалле, не смогут обратиться к данному модулю, что приведет к ошибке в процессе загрузки.
21. Добавьте модуль PLL, задействующий ФАПЧ. В окне мастера нажмите кнопку Launch Altera's ALTPLL MegaWizard для запуска мастера настройки параметров мегафункции ФАПЧ. В мастере убедитесь, что выбрано семейство StratixII, задайте входную тактовую частоту 50МГц. На вкладке 3 Output Clocks задействуйте выходы с0 и c1 с выходной частотой 85 МГц (коэффициенты умножения и деления, равными 17 и 10 соответственно). На вкладке настроек выхода c1 (clk c1) задайте смещение фазы -120 градусов (параметр Clock phase shift на Рис. 5). Завершите работу мастера настройки мегафункции и мастера модуля PLL нажатиями Finish. Переименуйте модуль в pll.

Рис. 5 – настройка модуля PLL
22. В группе Clock Settings в SOPC Builder переименуйте тактовый импульс с выхода ФАПЧ pll_c0 в sys_clk и поменяйте в группе Clock тактовый импульс с clk_0 на sys_clk для всех компонент, кроме pll.
23. Для распределения базовых адресов периферийных модулей выберите System-> Auto-Assign Base Addresses. Для распределения номеров прерываний выберите System->Auto-Assign IRQs. Отредактируйте полученные номера векторов так, чтобы sys_clk_timer имел приоритет 0, high_res_timer – 1, a jtaguart – 2.

Рис. 6 – настройка модуля встроенного ОЗУ
24. После того, как выполнено распределение адресов периферийных модулей в карте памяти системы, вернемся к заданию адресов векторов сброса Reset Vector и исключения Exception Vector. Двойным щелчком на модуле cpu вызовите диалог его настройки. На первой странице Core Nios II выберите ext_flash в качестве Reset Address и ext_ram в качестве Exception Address.
25. Создайте и подключите к процессору тесно связанную память команд. Добавьте модуль On Chip Memory (RAM or ROM) из группы Memories and Memory Controllers > On-Chip. Включите поддержку двухпортового режима Dual-port access, убедитесь, что разрядность памяти равна 32 битам, а объем – 4096 байтам. Настойки должны соответствовать приведенным на Рис. 6.
Переименуйте модуль, назвав его tightly_coupled_instruction_memory. Используя кнопки Move Up / Move Down, поместите модуль непосредственно под процессором. Установите sys_clk как тактовый импульс модуля.
Соедините порт модуля s1 с портом процессора tightly_coupled_instruction_master_0, а порт s2 с портом процессора data_master (Рис. 7). Эти соединения позволят процессору иметь доступ к тесно связанной памяти по шине инструкций и отладочному модулю jtag_debug_module по шине данных.
Далее настройте базовый адрес модуля тесно связанной памяти так, чтобы он не пересекался с адресным пространством других модулей в системе. В окне сообщения должна быть рекомендация установить адрес не ниже 0x02401000, если были правильно выполнены все шаги при создании системы. Установите адрес 0x04000000 для обоих портов и нажмите символ блокировки адреса (замок) около значения адреса для предотвращения его изменения при последующих автоматических распределениях периферии в карте памяти.

Рис. 7 – соединение тесно связанной памяти и процессора
26. В результате выполненных шагов система должна выглядеть как на Рис. 8 (адреса могут отличаться в зависимости от порядка добавления функций в систему):
В окне сообщений может быть выведено сообщение об отсутствии значений на входах кнопок (желательно задать, если планируется использовать возможность моделирования системы на кристалле на Verilog или VHDL) и информация об объеме Flash памяти. Наличие других сообщений свидетельствует об ошибке при создании системы.
27. На странице System Generation выключите переключатель Simulation. Это ускорит генерацию системы. Сохраните созданную систему (File->Save) и нажмите Generate. Будет запущен процесс генерации, в результате чего должна быть создана функция системы на кристалле, которая будет использоваться в дальнейшем. Система будет сгенерирована на выбранном в п.3 языке VHDL. Исходные тексты процессорного ядра будут сгенерированы в зашифрованном виде.
28. По завершении генерации системы закройте SOPC Builder и откройте в Quartus II частично созданный файл lab1_project.bdf. Откройте окно ввода символа двойным щелчком в пустом месте файла и введите из списка модулей проекта символ niosII (Рис. 9). Нажмите OK и поместите символ в проект таким образом, чтобы символ точно соединялся с уже имеющимися в файле входами и выходами. Расположение выводов должно точно совпадать! Если расположение не совпадает, удалите символ, запустите SOPC Builder заново и проверьте конфигурацию и имена модулей.
29. Сохраните схему и запустите компиляцию в системе Quartus II, выбрав Start Compilation в меню Processing. Убедитесь, что проект был откомпилирован без ошибок. Изучите отчет компилятора – обратите внимание на используемый объем ресурсов и максимальную тактовую частоту.

Рис. 8 – проект системы на кристалле

Рис. 9 – символ системы на кристалле
2. Часть II. Процесс проектирования ПО
Цель: получение базовых навыков разработки программного обеспечения системы на кристалле на основе процессора NiosII. Загрузка и тестирование проекта на отладочной плате.
1. Откройте программатор Programmer САПР Quartus II, загрузите проект созданной системы на кристалле (файл niosII_lab.sof), созданный в первой части лабораторной работы. По окончании загрузки закройте окно программатора, так как он может препятствовать нормальной работе с JTAG в среде разработки ПО Nios II IDE.
2. Запустите Nios II IDE. Создайте новое рабочее пространство для данного проекта. Выберите пункт меню File->Switch Workspace... и укажите каталог Software в каталоге проекта, с которым осуществлялась работа в части I лабораторной работы. Nios II IDE закроется и повторно откроется. В данной лабораторной работе каталог Software уже создан и содержит готовые исходные фалы ПО системы на кристалле. При самостоятельном проектировании системы на кристалле с нуля удобно создавать такой же каталог и новое рабочее пространство для каждого аппаратного проекта системы на кристалле.
3. Создайте новый проект. Вызовите диалог создания проекта в меню File > New > Project. Выберите тип проекта NIOS II C/C++ Application.

Рис. 10 – создание нового проекта ПО системы на кристалле
4. Задайте имя проекта niosII_training_project. Выберите Specify Location и укажите каталог Software (если рабочее пространство было создано правильно, этот каталог уже должен быть указан). В поле SOPC Builder System задайте файл niosll. ptf из каталога проекта. Выберите шаблон Blank Project (Рис. 11).
Файл .ptf проекта системы на кристалле содержит описание модулей системы на кристалле, их имена, адреса, вектора прерываний и т. д. Файл создается при генерации системы. На его основе будет создана системная библиотека, обеспечивающая интерфейс со всеми модулями системы на кристалле.
5. Нажмите Next. Убедитесь, что выбрана настройка Create a new system library, для того, чтобы создать новую системную библиотеку для вашего приложения. Нажмите Finish.

Рис. 11 – настройка проекта ПО системы на кристалле
6. Проверьте настройку свойств системной библиотеки. Выберите список niosII_training_project_syslib. Из меню Project или контекстного меню на списке выберите Properties. В открывшемся диалоге настройки параметров проекта откройте настройки системной библиотеки System Library и убедитесь, что устройства stdout, stderr и stdin ассоциированы с выводом отладочного модуля на последовательный порт jtagjuart. Также убедитесь, что для System clock timer установлено значение sysclktimer и для полей Program memory, Read-only data memory и Read/write data memory установлено значение ext_ram (Рис. 12). Введенные настройки определили проект, код которого будет исполняться из внешней статической памяти на плате.

Рис. 12 – настройка системной библиотеки
В результате создания проекта были созданы два новых программных проекта в среде Nios II IDE – проект приложения C/C++ и проект системной библиотеки.
7. Добавьте файлы с исходными текстами программы в проект приложения C/C++. Для этого в навигаторе проекта Nios II C/C++ Projects откройте список niosII_training_project. Откройте проводник Windows, перейдите в папку Software проекта. Перетащите файл simple. c из этой папки в список niosII_training_project.
8. Откомпилируйте проект, выделив в навигаторе проект niosII_training_project и выбрав Project > Build Project.
9. Откройте файл simple. c и изучите текст программы. Обратите внимание на макросы, используемые для обращения к периферийным модулям. Из панели Outline (Рис. 13), содержащей список основных элементов текущего файла, откройте и изучите файл system. h. Этот файл сгенерирован из файла .ptf и содержит необходимую информацию о составе системы на кристалле (адреса, номера прерываний и т. д.).
Примечание: Если панель Outline закрыта, откройте ее в меню Window->Show View.

Рис. 13 – панель Outline
10. Загрузите проект в отладочную плату, выбрав список niosII_training_project и выбрав в контекстном меню Run as -> Nios II Hardware.
Примечание: Если загрузка будет прервана и будет выдано сообщение о проблемах с кабелем JTAG download cable, выберите в меню Run -> Run... и настройте загрузочный кабель на странице Target Connection. После этого нажмите Run.
В консольном окне, выведенном Nios II IDE, должно быть выведено сообщение функцией printf программы simplex. Нажмите одну из кнопок на плате для переключения светодиодов на одну позицию вправо.
11. Запустите отладчик, выбрав Debug As -> Nios II Hardware. Будет переустановлено соединение с платой и загружена программа для отладки, запущен отладчик (Рис. 14). При этом Nios II IDE автоматически переключится в режим отладчика Debug (будет выдан запрос на переключение в перспективу отладчика, подтвердите его).
Примечание: Если будет выведено сообщение брандмауэра о блокировке Nios gdb server, или любых других компонент среды разработки, дайте разрешение на его разблокировку.

Рис. 14 – отладчик Nios II IDE
12. Установите точки останова на строках 22 и 37. Для установки точки останова вызовите контекстное меню на серой полоске слева от исходного текста около соответствующей строки и выберите Toggle Breakpoint.
13. Нажмите на кнопку запуска resume
.
14. Обратите внимание на значение переменной buttons в окне Variables. Смените формат представления на шестнадцатеричный, выбрав из контекстного меню Format ->Hexadecimal. для переменной buttons.
15. Опять возобновите исполнение, нажав resume
. Так как условный оператор возвращает false (т. е. кнопки не нажаты), остановки на строке 37 не происходит, и программа опять останавливается на строке 22.
16. Нажмите кнопку на плате и опять нажмите resume
. Переменной buttons будет присвоено новое значение.
17. Удерживая кнопку на плате, нажмите resume
. Сработает точка останова на строке 37 и зажжется другой светодиод.
18. Находясь в точке останова на строке 22, сделайте двойной щелчок на переменной buttons в окне Variables. Смените значение на 0xE и нажмите OK. Нажмите resume
.
Примечание: Таким образом можно эмулировать события от внешних периферийных модулей, в том числе трудно реализуемых практически!
19. В меню Debug выберите проект, вызовите его контекстное меню и выберите Terminate and Remove (Рис. 15). Переключитесь обратно в перспективу редактирования кода Window -> Open perspective -> Nios II C\C++. Текущая перспектива отображается и также может быть переключена на закладке в правом верхнем углу.

Рис. 15 – завершение отладки
20. Закройте проект в Nios II IDE.


