291 lines
13 KiB
TeX
291 lines
13 KiB
TeX
|
\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}
|
|||
|
|