BMSTU/03-fpga-lab-01-report.tex

291 lines
13 KiB
TeX
Raw Permalink Normal View History

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