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

291 lines
13 KiB
TeX
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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