\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}