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

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

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

\makeReportTitle{лабораторной}{1}{Знакомство с интегрированной системой \\ проектирования Quartus Prime}{Проектирование цифровых устройств на \\ программируемых логических интегральных схемах}{}{С.В. Фёдоров}
\newpage
\thispagestyle{empty}
\tableofcontents
\newpage
\pagestyle{fancy}
\section{Цель}
Реализовать проект управления семафором на базе ПЛИС Intel PSG в САПР Quartus Prime. Получить практические навыки работы в САПР Quartus Prime. Получить представление о базовом маршруте проектирования ПЛИС. Ознакомиться со средствами ввода проекта, его компиляции, анализа и моделирования. Получить навыки применения языка описания аппаратного состава SystemVerilog для описания цифровых схем.

\section{Задачи}
Реализовать проект управления железнодорожным семафором на базе ПЛИС Intel PSG в САПР Quartus Prime.

Семафор работает следующим образом: после прохода поезда загорается красный свет (рис. \hrf{timing:semafor}). Через время $t_1$ красный свет гаснет и загорается желтый. После этого через время $t_2$ в дополнение к желтому загорается зеленый свет. После этого через время $t_3$ желтый свет гаснет и до следующего прохода поезда горит зеленый свет. Времена $t_1 - t_3$ регулируются с внешнего входа. Должно быть реализовано 3 набора времен $t_1 - t_3$. 4е время присутствует в системе, но оно ограничивается следующим проходом поезда через семафор.

\begin{figure}[H]
  \begin{tikztimingtable}
    line   & LHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLH\\
    strobe & 3l N(A1)5h                         21Ll     5h 4L \\
    red    & 3h      5h 6H N(A2)                15Ll     5h 4H \\
    yellow & 3l      5l 6L      4H N(A3)3H N(A4)8Ll      5l 4L \\
    green  & 3l      5l 6L      4L              11Hh     5l 4L \\
    & 3s N(B1)5s 6S N(B2)4S N(B3)3S N(B4)8Ss      5s 4S \\
    \extracode
    \makeatletter
    \begin{pgfonlayer}{background}
      \node [anchor=south east,inner sep=0pt] at (6, -10) {$t_1$};
      \node [anchor=south east,inner sep=0pt] at (12, -10) {$t_2$};
      \node [anchor=south east,inner sep=0pt] at (16, -10) {$t_3$};
      \foreach \n in {1,...,4}
      \draw [help lines] (A\n) -- (B\n);
    \end{pgfonlayer}
  \end{tikztimingtable}
  \caption{Временн\'{а}я диаграмма работы семафора}
  \label{timing:semafor}
\end{figure}

Входы системы:
\begin{itemize}
\item \code{line} – тактовый импульс;
\item \code{strobe} – сигнал прохода поезда с активным высоким уровнем;
\item \code{divider[1..0]} – двухразрядное двоичное число выбора режима работы семафора. 
\end{itemize}

Выходы системы:
\begin{itemize}
\item \code{red} – красный;
\item \code{yellow} – желтый;
\item \code{green} – зеленый.
\end{itemize}

Структурная схема реализации приведена на рис. \hrf{pic:struct}. Модуль \code{dec} реализует двоичный счётчик до 3, который формирует номер состояния системы от 0 до 3. Значение 0 соответствует красному свету, 1 - желтому и так далее. Разрешение счёта (смены состояния) формируется дополнительным счётчиком-делителем, сравнивающим свое значение со значением, поступающим из модуля \code{periodrom}.

Модуль \code{periodrom} реализует ПЗУ, формирующее значения для счетчика-делителя, определяющего моменты переключения состояния. Два младших бита адреса формируются выходом модуля \code{dec}, на который выводится значение счетчика состояния. Два старших бита адреса задаются с входов ПЛИС и определяют выбор одного из четырех наборов времен t1-t3.

Модуль \code{comm} реализует специальный дешифратор двухразрядного двоичного кода, представляющего номер состояния системы в значения на выходных линиях. 

\begin{figure}[H]
  \centering
  \includesvg[width=100mm]{./pics/03-fpga-01-01-struct.svg}
  \caption{Структурная схема реализации}
  \label{pic:struct}
\end{figure}

\section{Выполнение работы}

По шагам из методического материала был создан проект в САПР Quartus Prime, схема верхнеуровневого модуля имеет вид, представленный на рис. \hrf{pic:top-scheme}

\begin{figure}[H]
  \centering
  \includegraphics[width=17cm]{03-fpga-01-01-scheme.png}
  \caption{Схема верхнего уровня проекта семафора}
  \label{pic:top-scheme}
\end{figure}

Далее был создан проект с верхнеуровневым модулем на языке Verilog, проведено моделирование, результаты которого показаны на рис. \hrf{pic:modelsim-first}.

\begin{figure}[H]
  \centering
  \includegraphics[width=23cm,angle=90]{03-fpga-01-02-first-modelsim.png}
  \caption{Результат моделирования базового проекта}
  \label{pic:modelsim-first}
\end{figure}

Technology Map Viewer (Post-Fitting) демонстрирует, почему зелёный сигнал срабатывает быстрее (его формирование не создержит дополнительной компбинационной логики, как следствие, временн\'{ы}х задержек).
\begin{figure}[H]
  \centering
  \includegraphics[width=17cm]{03-fpga-01-02-glitched-modelsim.png}
  \caption{Логика формирования выходных сигналов}
  \label{pic:comb-logic}
\end{figure}

\section{Индивидуальное задание}
В результате исправления кода модуля \code{dec} и объединения в нём всей логики работы семафора, в Technology Map Viewer (рис. \hrf{pic:tmv}) видно, что все выходы семафора формируются на регистрах.
\begin{figure}[H]
  \centering
  \includegraphics[width=17cm]{03-fpga-01-03-tmv.png}
  \caption{Формирование выходов семафора на регистрах}
  \label{pic:tmv}
\end{figure}

Индивидуальным заданием было создание временн\'{ы}х задержек семафора, представленных в таблице \hrf{table:miffile}.

\begin{table}[h!]
  \centering
  \begin{tabular}{|c|c|c|c|} 
    \hline
    100 & 100 & 30 & 10 \\
    \hline
    200 & 100 & 50 & 10 \\
    \hline
    150 & 100 & 30 & 10 \\
    \hline
    100 & 100 & 50 & 10 \\
    \hline
  \end{tabular}
  \caption{Данные для заполнения файла инициализации памяти}
  \label{table:miffile}
\end{table}

\section{Выводы}
В отчётах компилятора (рис. \hrf{pic:reports}) видно, что финальный проект (рис. \hrf{pic:rpt-fin}) задействует на 3 регистра и на 2 логических элемента меньше, чем стартовый (рис. \hrf{pic:rpt-start}).
\begin{figure}[H]
  \centering
  \begin{subfigure}[b]{0.48\textwidth}
    \centering
    \includegraphics[width=\textwidth]{03-fpga-01-03-rpt.png}
    \caption{Финальный проект}
    \label{pic:rpt-fin}
  \end{subfigure}
  \hfill
  \begin{subfigure}[b]{0.48\textwidth}
    \centering
    \includegraphics[width=\textwidth]{03-fpga-01-03-rpt1.png}
    \caption{Начальный проект}
    \label{pic:rpt-start}
  \end{subfigure}
  \caption{Отчёты компиляции}
  \label{pic:reports}
\end{figure}

Исходные коды проекта представлены в листингах \hrf{src:dec} и \hrf{src:tb} приложения \hrf{appendix:src}, а снимок экрана с результатами Gate-Level моделирования на рис. \hrf{pic:model-fin} приложения \hrf{appendix:modeling}

\newpage
\appendix
\setcounter{secnumdepth}{4}
\section*{Приложения}
\addcontentsline{toc}{section}{Приложения}
\renewcommand{\thesubsection}{\Asbuk{subsection}}

\subsection{Исходные коды проекта}
\label{appendix:src}

\begin{lstlisting}[language=Verilog,style=VerilogStyle,caption={Исходный код семафора},label={src:dec}]
module dec 
#(m = 8) 
(
    input logic clk, clr,
    input logic [1:0]divider,
    output logic red, yellow, green
);
    
    logic [m-1:0] cntdiv;
    logic enacnt;
    
    logic [m-1:0] divisor; // divisor interconnection
    logic [1:0] contr;  // new contr
    logic [2:0] colors; // new colors counter
    
    // colors out
    assign red = colors[2];
    assign yellow = colors[1];
    assign green = colors[0];

    //ROM from top-level
    periodrom b2v_inst2 
      ( .clock(clk),
        .address({divider, contr}),
        .q(divisor)
        );

    // count colors 
    always @ (posedge clk or posedge clr) begin
        if (clr) begin
            colors <= 3'b100;
        end else begin
            if (enacnt) begin
                case (colors)
                  3'b100: colors <= 3'b010;
                  3'b010: colors <= 3'b011;
                  3'b011: colors <= 3'b001;
                  default: colors <= 3'b100;
                endcase
            end
        end
    end
    
    always_ff @(posedge clk or posedge clr) begin
        if (clr) begin
            cntdiv <= 0;
        end else begin
            if (cntdiv == divisor)
                cntdiv <= 0;
            else
                cntdiv <= cntdiv + 1;
        end
    end

    // we don't enable counters, if color is green
    always_comb begin
        enacnt = ((cntdiv == divisor) && !(colors == 3'b001));
    end
    
    always_ff @(posedge clk or posedge clr) begin
        if (clr) begin 
          contr <= 0;
        end else begin
            if (enacnt) begin
                if (contr != 3) begin
                  contr <= contr + 1;
                end
            end
        end
    end
    
endmodule
\end{lstlisting}

\begin{lstlisting}[language=Verilog,style=VerilogStyle,caption={Исходный код тестового стенда},label={src:tb}]
`timescale 1 ns/1 ns

module semafor_tb();

    // Wires and variables to connect to UUT (unit under test)
    logic clk, train;
    logic [1:0] div;
    logic r, y, g;
    
    // Instantiate UUT
    dec my_sem(.clk(clk), .clr(train), .divider(div),
        .red(r), .yellow(y), .green(g));

    // Clock definition
    initial begin
        clk = 0;
        forever #10 clk = ~clk;
    end
    
    // Strob and divisor definition
    initial begin
        div = 0;
        train = 0;
        repeat (4)
        begin
            #200 train=1;
            #80 train=0;
            wait ({r,y,g}==3'b001);
            #80 div=div+1;
        end
        $stop;
    end
    
endmodule
\end{lstlisting}


\subsection{Моделирование финального проекта}
\label{appendix:modeling}
\begin{figure}[H]
  \centering
  \includegraphics[width=23cm,angle=90]{03-fpga-01-03-modelsim-final.png}
  \caption{Результат Gate-Level моделирования}
  \label{pic:model-fin}
\end{figure}



\end{document}

