\documentclass[a4paper,fontsize=14bp]{article}

\input{settings/common-preamble}
\input{settings/fancy-listings-preamble}
\input{settings/bmstu-preamble}
\setcounter{secnumdepth}{4}
\numerationTop

\begin{document}
\thispagestyle{empty}
\makeBMSTUHeader

\makeReportTitle{лабораторной}{2}{Моделирование компонент систем на кристалле}{Проектирование цифровых устройств на \\ программируемых логических интегральных схемах (ПЛИС)}{}{С.В. Фёдоров}

\newpage
\pagestyle{fancy}
\section{Цель}
Изучить методики моделирования компонент систем на кристалле с интерфейсами 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}]
initial begin
    train = 0;
    wait (niosii_inst_reset_bfm_reset_reset);
    forever begin
        wait ({red,yellow,green}==3'b001);
        repeat (29000) @(posedge niosii_inst_clk_bfm_clk_clk);
        repeat(2) begin
            train = 1;
            repeat (10) @(posedge niosii_inst_clk_bfm_clk_clk);
            train = 0;
            wait ({red,yellow,green}==3'b001);
            repeat (200) @(posedge niosii_inst_clk_bfm_clk_clk);
        end
    end
end
\end{lstlisting}

В результате моделирования была получена диаграмма работы (waveform), представленная на рисунке \hrf{pic:modelsim-before}.
\begin{figure}[H]
  \centering
  \includegraphics[width=\textwidth]{03-fpga-lab-02-beforeindividual.png}
  \caption{Диаграмма Modelsim}
  \label{pic:modelsim-before}
\end{figure}

\section{Индивидуальное задание}
В качестве индивидуальных были даны следующие задания:
\begin{enumerate}
\item расширить разрядность памяти хранения до 32 бит и на запись и на чтение, чтобы изменения были видны на светодиодах.
\item добавить регистр (помимо \code{ctl} и \code{divider}). Если там 0, то схема должна работать без изменений, а если 1, должен подключаться режим мигающего жёлтого с длительностью, которая берётся из памяти (параметр зелёного цвета), то есть мигать циклически со следующей периодичностью:
  
  \begin{tikztimingtable}
    length & 5D{green} 5D{green} 5D{green} 5D{green} 5D{green} 5D{green}\\
    yellow & 5L        5H        5L        5H        5L        5H \\
  \end{tikztimingtable}
\end{enumerate}

Исходный код семафора из материалов методического пособия создавал семафор, работающий согласно временн\'{о}й диаграммы, представленной на рисунке \hrf{pic:timing-sem-before}. Из диаграммы очевидно, что при инициализации семафор загорается красным, а значит ни один поезд через него не сможет проехать никогда. Поскольку в схеме существуют комбинационные зависимости (указаны на рисунке синими стрелками), возможно регистровую логику переделать под конечный автомат, оставив комбинационную логику «как есть». В правой части видно, что в период горения зелёного цвета в семафор приходит сигнал смены строки памяти RAM, то есть переход к следующему пакету временн\'{ы}х диапазонов горения цветов семафора.

\begin{figure}[H]
  \centering
\begin{tikztimingtable}
    clk      & 6{C} ;[dotted] 4{C}; 7{C} ;[dotted] 11{C} c;\\
    clrn     & h cLc 4{H} ;[dotted] 21Hh h;\\
    train    & 4{L}l cH;[dotted] Hhc 20{L} l;\\
    countdiv & u 9d{0} D{};[dotted]2{D{}}; 3D{divider} D{0} 5{D{}};[dotted] 11D d{};\\
    enacnt   & x 11{l} ;[dotted] 8{l};L H 9{l} ;[dotted] 12L; \\
    contr    & u 11d ;[dotted] 8d; 3d{0} N(B1) 10d{1} ;[dotted] 12D{};\\
    colors   & u 8d{100} 3d ;[dotted] 8d; 2d{100} N(A1) 11d{010} ;[dotted] 12D{};\\
    divisor  & u 11d ;[dotted] 8d; 4d{red} N(C1) 9d{yellow};[dotted] 8D{yellow and green};4D{green}\\
    ram\_wr  & x 25L CC L \\
\extracode
\tableheader{Сигнал}{Значения}\tablerules
\draw[blue,->,thin](A1)to[out=0,in=180](B1);
\draw[blue,->,thin](B1)to[out=0,in=180](C1);
\begin{background}[gray, semitransparent, semithick]
    \vertlines{0.5, 4.5, 5, 11, 12, 24.5, 25.5}
\end{background}
\end{tikztimingtable}
  \caption{Примерная временн\'{а}я диаграмма работы семафора}
  \label{pic:timing-sem-before}
\end{figure}

Также индивидуальное задание предполагает мигание жёлтого цвета с периодичностью, указанной в памяти семафора о адресу «зелёного» цвета (то есть следующего за режимом «мигающего жёлтого»), следовательно, значение зелёного необходимо сохранить заранее, перед включением красного, но после изменения строки памяти (судя по тестовому стенду, строб смены строки памяти формируется в модуле через 10 тактовых импульсов после начала периода зелёного света). Значение задержки зелёного необходимо сохранить примерно в момент, указанный на обновлённой диаграмме синей линией. Временная диаграмма для решения поставленной задачи представлена на рисунке \hrf{pic:timing-sem-after}.

\begin{figure}[H]
  \centering
  \noindent
  \begin{tikztimingtable}
    clk      & 6{C} ;[dotted] 4{C}; 7{C} ;[dotted] 11{C} c;\\
    clrn     & h cLc 4{H} ;[dotted] 21Hh h;\\
    train    & 4{L}l cH;[dotted] Hhc 20{L} l;\\
    countdiv & u 9d{0} D{};[dotted]2{D{}}; 3D{divider} D{0} 5{D{}};[dotted] 11D d{};\\
    enacnt   & x 11{l} ;[dotted] 8{l};L H 9{l} ;[dotted] 12L; \\
    contr    & u 8d{3} 3d;[dotted] 8d; 3d{0} N(B1) 10d{1} ;[dotted] 12D{};\\
    colors   & u 8d{001} 3d ;[dotted] 8d; 2d{100} N(A1) 11d{010} ;[dotted] 12D{};\\
    divisor  & u 8d{green} 3d ;[dotted] 8d; 4d{red} N(C1) 9d{yellow};[dotted] 8D{blinking yellow};4D{green}\\
    ram\_wr  & x 25L CC L \\
    \extracode
    \tableheader{Signal}{Values}\tablerules
    \draw[blue,->,thin](A1)to[out=0,in=180](B1);
    \draw[blue,->,thin](B1)to[out=0,in=180](C1);
    \begin{background}[gray, semitransparent, semithick]
      \vertlines{0.5, 4.5, 5, 11, 12, 24.5, 25.5}
    \end{background}
    \begin{scope}[blue]
      \vertlines{3}
    \end{scope}
  \end{tikztimingtable}
  \caption{Обновлённая временн\'{а}я диаграмма работы семафора}
  \label{pic:timing-sem-after}
\end{figure}

В компонент семафора (файл \code{HDL/dec.sv}) была добавлена возможность изменения поведения без перекомпиляции компонента. Поведение с «мигающим жёлтым» активируется нечётным значением задержки из файла \code{sem.c} процессора niosII. Значения задержек семафора заданы достаточно маленькими 32-разрядными числами, чтобы возможно было отследить их в симуляции.

\begin{lstlisting}[language=C,style=CCodeStyle]
#define TIME_SETS	4
#define TIME_STATES	4
const alt_u32 divisors[TIME_SETS][TIME_STATES] = {
    {0x00000010, 0x00000010, 0x00000005, 0x00000010},
    {0x00000010, 0x00000020, 0x00000010, 0x00000010},
    {0x000000f1, 0x000000f1, 0x000000f1, 0x00000011},
    {0x000000d1, 0x000000f1, 0x000000f1, 0x00000011}
};
\end{lstlisting}


Поведение красного жёлтого, и зелёного сигналов в режиме «мигающего жёлтого» на третьем наборе задержек, записанном в регистр управления

\begin{lstlisting}[language=C,style=CCodeStyle]
IOWR_ALTERA_AVALON_SEM_DIVSET(SEM_CTL_SLAVE_BASE,0x02);
\end{lstlisting}

представлено на рисунке \hrf{pic:indi-model}, первый набор, записанный командой

\begin{lstlisting}[language=C,style=CCodeStyle]
IOWR_ALTERA_AVALON_SEM_DIVSET(SEM_CTL_SLAVE_BASE,0x00);
\end{lstlisting}

на рисунке \hrf{pic:indi-model2}.

\begin{figure}[H]
  \centering
  \begin{subfigure}[b]{0.98\textwidth}
    \centering
    \includegraphics[width=\textwidth]{03-fpga-lab-02-individual.png}
    \caption{Нечётное значение задержки}
    \label{pic:indi-model}
  \end{subfigure}

  \begin{subfigure}[b]{0.98\textwidth}
    \centering
    \includegraphics[width=\textwidth]{03-fpga-lab-02-individual2.png}
    \caption{Чётное значение задержки}
    \label{pic:indi-model2}
  \end{subfigure}
  \caption{Диаграмма поведения сигналов после выполнения задания}
\end{figure}


В процессе работы были модифицированы исходные коды (листинг \hrf{lst:dec}, в листинге приведена только изменённая часть, логика работы семафора) и коды тестов (листинг \hrf{lst:dec-tb}) для компонента семафора, а также тестовый стенд (листинг \hrf{lst:main-top-tb}) и прошивка процессора (листинг \hrf{lst:sem}) итогового проекта. 

\section{Выводы}
Подключение в систему собственного компонента, совместимого с шиной Avalon-MM является достаточно простой задачей, в которой одну из важнейших ролей играет понимание окружения. Компоненты желательно проектировать максимально гибкими и отлаживать на отдельных стендах, как это было сделано в данной лабораторной работе, поскольку интеграция обновлений компонента в целевую систему является достаточно долгим процессом, в котором легко ошибиться (обновление компонента, обновление системы, обновление пакета поддержки платы, перекомпиляции на всех этапах).

\newpage
\appendix
\setcounter{secnumdepth}{4}
\section{Приложения}
\subsection{Исходные коды проекта}
\label{appendix:src}

\lstinputlisting[language=Verilog,style=VerilogStyle,caption={Семафор},label={lst:dec}]{src/dec.sv}

\lstinputlisting[language=Verilog,style=VerilogStyle,caption={Тестовый стенд семафора},label={lst:dec-tb}]{src/dec_tb.sv}

\lstinputlisting[language=Verilog,style=VerilogStyle,caption={Тестовый стенд основного проекта},label={lst:main-top-tb}]{src/niosII_tb.v}

\lstinputlisting[language=C,style=CCodeStyle,caption={\code{sem.c}},label={lst:sem}]{src/sem.c}

\end{document}



