\makeReportTitle{лабораторной}{2}{Моделирование компонент систем на кристалле}{Проектирование цифровых устройств на \\ программируемых логических интегральных схемах (ПЛИС)}{}{С.В. Фёдоров}
Изучить методики моделирования компонент систем на кристалле с интерфейсами Avalon-MM. Освоить методику интеграции компонент в системы на кристалле.
\section{Задачи}
Для достижения цели было описано несколько задач, каждая со своей целью.
\begin{enumerate}
\item\textbf{Создание простых тестбенчей.} Цель: получение навыков реализации тестбенчей, эмулирующих транзакции в соответствии со спецификацией Avalon-MM. Моделирование обмена с разрабатываемыми модулями систем на кристалле.
\item\textbf{Создание простой системы на кристалле и интеграция пользовательских модулей.} Цель: получение базовых навыков конфигурации системы на кристалле на основе процессора NiosII в средстве Platform Designer. Подготовка проекта системы на кристалле для использования в следующих лабораторных работах.
\item\textbf{Моделирование систем на кристалле в ModelSim.} Цель: Подготовка созданного проекта к моделированию. Изучение методики моделирования систем на кристалле в пакете ModelSim с процессором, исполняющим программный код из внутренней памяти SRAM.
\item\textbf{Самостоятельная работа.}
\end{enumerate}
\section{Выполнение работы}
По шагам из методического материала был создан проект в САПР Quartus Prime (доступен по \href{https://git.iovchinnikov.ru/ivan-igorevich/fpga-lab-2/commits/branch/simulation}{ссылке}). В начальном проекте «поезд проезжал через семафор» задолго до инициализации (переход сигнала \code{run} в высокий уровень), поэтому цикл прохода поезда в тестбенче всего проекта (\code{niosII_tb.sv}) был изменён и представлен в листинге \hrf{lst:main-train}.
\begin{lstlisting}[language=Verilog,style=VerilogStyle,caption={Изменённый основной цикл тестового стенда},label={lst:main-train}]
В качестве индивидуальных были даны следующие задания:
\begin{enumerate}
\item расширить разрядность памяти хранения до 32 бит и на запись и на чтение, чтобы изменения были видны на светодиодах.
\item добавить регистр (помимо \code{ctl} и \code{divider}). Если там 0, то схема должна работать без изменений, а если 1, должен подключаться режим мигающего жёлтого с длительностью, которая берётся из памяти (параметр зелёного цвета), то есть мигать циклически со следующей периодичностью:
Исходный код семафора из материалов методического пособия создавал семафор, работающий согласно временн\'{о}й диаграммы, представленной на рисунке \hrf{pic:timing-sem-before}. Из диаграммы очевидно, что при инициализации семафор загорается красным, а значит ни один поезд через него не сможет проехать никогда. Поскольку в схеме существуют комбинационные зависимости (указаны на рисунке синими стрелками), возможно регистровую логику переделать под конечный автомат, оставив комбинационную логику «как есть». В правой части видно, что в период горения зелёного цвета в семафор приходит сигнал смены строки памяти RAM, то есть переход к следующему пакету временн\'{ы}х диапазонов горения цветов семафора.
\caption{Примерная временн\'{а}я диаграмма работы семафора}
\label{pic:timing-sem-before}
\end{figure}
Также индивидуальное задание предполагает мигание жёлтого цвета с периодичностью, указанной в памяти семафора о адресу «зелёного» цвета (то есть следующего за режимом «мигающего жёлтого»), следовательно, значение зелёного необходимо сохранить заранее, перед включением красного, но после изменения строки памяти (судя по тестовому стенду, строб смены строки памяти формируется в модуле через 10 тактовых импульсов после начала периода зелёного света). Значение задержки зелёного необходимо сохранить примерно в момент, указанный на обновлённой диаграмме синей линией. Временная диаграмма для решения поставленной задачи представлена на рисунке \hrf{pic:timing-sem-after}.
В компонент семафора (файл \code{HDL/dec.sv}) была добавлена возможность изменения поведения без перекомпиляции компонента. Поведение с «мигающим жёлтым» активируется нечётным значением задержки из файла \code{sem.c} процессора niosII. Значения задержек семафора заданы достаточно маленькими 32-разрядными числами, чтобы возможно было отследить их в симуляции.
В процессе работы были модифицированы исходные коды (листинг \hrf{lst:dec}, в листинге приведена только изменённая часть, логика работы семафора) и коды тестов (листинг \hrf{lst:dec-tb}) для компонента семафора, а также тестовый стенд (листинг \hrf{lst:main-top-tb}) и прошивка процессора (листинг \hrf{lst:sem}) итогового проекта.
Подключение в систему собственного компонента, совместимого с шиной Avalon-MM является достаточно простой задачей, в которой одну из важнейших ролей играет понимание окружения. Компоненты желательно проектировать максимально гибкими и отлаживать на отдельных стендах, как это было сделано в данной лабораторной работе, поскольку интеграция обновлений компонента в целевую систему является достаточно долгим процессом, в котором легко ошибиться (обновление компонента, обновление системы, обновление пакета поддержки платы, перекомпиляции на всех этапах).