1. Любой программист время от времени обязан решать проблему нехватки оперативной памяти. Эту проблему можно решать по-разному: либо оптимизируя собственный код, либо наращивая оперативную память. Семейство чипов Cyclone, начиная с третьего, имеет определённое количество внутренней памяти, достаточное для функционирования несложного, или наоборот, уникального бюджетного проекта. Но даже если вы гениальный программист, ваши навыки не смогут заменить вам физическую память, а для бюджетного варианта подойдёт SRAM по цене 2 - 4 у.е. Для примера будем использовать память K6R4016V1D (256Kx16 Bit).
        2. Если вы уже делали проект "Загрузка программы из EPCS флеш памяти", то откройте его, если же нет, то его необходимо создать. Приложение под Nios II будет загружаться из EPCS флеш памяти и работать в оперативной SRAM памяти.
        3. Для подключения внешней SRAM памяти нам потребуются два дополнительных компонента: Avalon-MM Tristate Bridge и собственный компонент SRAM. Начнём с моста.
        4. Для создания нового компонента системы типа Avalon-MM Tristate Bridge в списке Library выберем Bridges and Adapters > Memory Mapped > Avalon-MM Tristate Bridge. Откроется окно (рис. 39), в котором оставим отметку Registered - регистрируемые входные сигналы (увеличение максимальной частоты, но увеличение задержек). Затем кликаем Finish. Модуль потребуется позже скорректировать после добавления компонента SRAM.
Переименовываем готовый модуль в "Bridge_to_SRAM"
        5. Для создания нового компонента SRAM выбираем Project > New Component. Затем в меню Templates выбираем Add Typical Avalon-MM Tristate Slave (рис. 40)
        6. Пропускаем вкладку HDL Files. А вкладку Signals приводим в соответствие с рис. 41. Естественно, если разрядность вашего чипа (чипов) памяти отличается от используемого в этом примере, то для вас не составит труда его адаптировать.
        7. Вкладка Interfaces потребует от нас обращение к технической документации на выбранную SRAM память. Нам необходимо будет выставить задержки для циклов чтения/ записи (страницы 6 - 9 в технической документации). В общем виде временные параметры интерфейса приведены на рис. 42.
        8. Немаловажно указать, что создаваемый компонент является устройством памяти, для этого на вкладке Interfaces ставим галочку напротив Memory Device.
        9. На вкладке Library Info снабжаем наш компонент необходимой информацией (рис. 44). Кликаем Finish.
        10. Созданный таким образом компонент теперь находится в папке Memories and Memory Controllers / SRAM рядом с уже имеющимися в составе пакета SOPC Builder компонентами SRAM. Выбираем компонент и добавляем его в систему (рис. 45).
        11. В настройках процессора указываем на то, что вектор исключений указывает на SRAM память (рис. 46) и кликаем Finish.
        12. Делаем процедуру автоматического назначения базовых адресов. В панели меню выберем System > Auto-Assign Base Addresses.
        13. Возвращаемся к редактированию Avalon-MM Tristate Bridge. Выбираем компонент "Bridge_to_SRAM" и кликаем на кнопку Edit. На вкладке Shared Signals отмечаем сигналы, выводимые наружу (рис. 47) и кликаем Finish.
        14. Выбранный чип SRAM имеет максимальное время доступа - 10 нс. Это означает, что наша система может работать на частоте 100 МГц. Ввиду того, что по проекту на вход Cyclone III поступает тактовый сигнал 25 МГц, его необходимо трансформировать в 100 МГц. Нам поможет ядро PLL.
        15. Для добавления ядра PLL в списке Library выберем PLL > Avalon ALTPLL. Открывается знакомый MegaWizard, в котором нам необходимы следующие настройки: входная и выходная частота, режим работы.
        16. Кликаем Finish.После этого необходимо установить для используемых ядер проекта новую рабочую частоту (рис. 50).
        17. Генерируем систему SOPC Builder.
        18. Я позволю себе пропустить описание обновление файлов Quartus II проекта, назначение выводов для чипа памяти и компиляцию Quartus II проекта. А также обновление BSP проекта в среде Eclipse. Все эти манипуляции достаточно подробно описаны в предыдущей статье.
        Остановимся на SDC файле для TimeQuest. Я привожу файл для своего проекта, конечно названия выводов в вашем проекте могут отличаться.
Более подробно о создании SDC файла можно прочитать здесь. Прекрасные статьи Дениса Шехалева о практических аспектах создания SDC файла можно
найти здесь или в его блоге. Примерный вид его будет следующим:
        19. Запускаем сборку проекта приложения. Правой клавишей мыши на проекте выбираем Build Project и наблюдаем за процессом в окне Console. После успешного завершения сборки проекта нам будет интересным знать объём кода программы. Он отображается в окне Console:
        Info: (Hello_word.elf) 5900 Bytes program size (code + initialized data).
        Info: 250 KBytes free for stack + heap.
        Таким образом, после сборки проекта у нас остаётся ещё 250 кБайт - что вполне достаточно для создания бюджетного проекта.
        20. Убедиться в работоспособности проекта можно, выполнив п.п. 24 - 34 из предыдущей статьи.
        Желаю удачи!