Compare commits

...

5 Commits

28 changed files with 3478 additions and 101 deletions

View File

@ -1,8 +1,8 @@
\documentclass[a4paper,fontsize=14bp]{article} \documentclass[a4paper,fontsize=14bp]{article}
\input{../common-preamble} \input{settings/common-preamble}
\input{../fancy-listings-preamble} \input{settings/fancy-listings-preamble}
\input{../bmstu-preamble} \input{settings/bmstu-preamble}
\setcounter{secnumdepth}{4} \setcounter{secnumdepth}{4}
\numerationTop \numerationTop
@ -33,10 +33,15 @@ initial begin
train = 0; train = 0;
wait (niosii_inst_reset_bfm_reset_reset); wait (niosii_inst_reset_bfm_reset_reset);
forever begin forever begin
repeat(22528) @(posedge niosii_inst_clk_bfm_clk_clk); wait ({red,yellow,green}==3'b001);
repeat (29000) @(posedge niosii_inst_clk_bfm_clk_clk);
repeat(2) begin
train = 1; train = 1;
repeat(10) @(posedge niosii_inst_clk_bfm_clk_clk); repeat (10) @(posedge niosii_inst_clk_bfm_clk_clk);
train = 0; train = 0;
wait ({red,yellow,green}==3'b001);
repeat (200) @(posedge niosii_inst_clk_bfm_clk_clk);
end
end end
end end
\end{lstlisting} \end{lstlisting}
@ -117,15 +122,53 @@ end
\label{pic:timing-sem-after} \label{pic:timing-sem-after}
\end{figure} \end{figure}
В компонент семафора была добавлена возможность изменения поведения без перекомпиляции компонента. Поведение с «мигающим жёлтым» активируется нечётным значением задержки из файла \code{sem.c} процессора niosII. Поведение красного жёлтого, и зелёного сигналов в режиме «мигающего жёлтого» представлено на рисунке \hrf{pic:indi-model}. В компонент семафора (файл \code{HDL/dec.sv}) была добавлена возможность изменения поведения без перекомпиляции компонента. Поведение с «мигающим жёлтым» активируется нечётным значением задержки из файла \code{sem.c} процессора niosII. Значения задержек семафора заданы достаточно маленькими 32-разрядными числами, чтобы возможно было отследить их в симуляции.
\begin{lstlisting}[language=C,style=CCodeStyle]
#define TIME_SETS 4
#define TIME_STATES 4
const alt_u32 divisors[TIME_SETS][TIME_STATES] = {
{0x00000010, 0x00000010, 0x00000005, 0x00000010},
{0x00000010, 0x00000020, 0x00000010, 0x00000010},
{0x000000f1, 0x000000f1, 0x000000f1, 0x00000011},
{0x000000d1, 0x000000f1, 0x000000f1, 0x00000011}
};
\end{lstlisting}
Поведение красного жёлтого, и зелёного сигналов в режиме «мигающего жёлтого» на третьем наборе задержек, записанном в регистр управления
\begin{lstlisting}[language=C,style=CCodeStyle]
IOWR_ALTERA_AVALON_SEM_DIVSET(SEM_CTL_SLAVE_BASE,0x02);
\end{lstlisting}
представлено на рисунке \hrf{pic:indi-model}, первый набор, записанный командой
\begin{lstlisting}[language=C,style=CCodeStyle]
IOWR_ALTERA_AVALON_SEM_DIVSET(SEM_CTL_SLAVE_BASE,0x00);
\end{lstlisting}
на рисунке \hrf{pic:indi-model2}.
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\includegraphics[width=12cm]{03-fpga-lab-02-individual.png} \begin{subfigure}[b]{0.98\textwidth}
\caption{Диаграмма поведения сигналов после выполнения задания} \centering
\includegraphics[width=\textwidth]{03-fpga-lab-02-individual.png}
\caption{Нечётное значение задержки}
\label{pic:indi-model} \label{pic:indi-model}
\end{subfigure}
\begin{subfigure}[b]{0.98\textwidth}
\centering
\includegraphics[width=\textwidth]{03-fpga-lab-02-individual2.png}
\caption{Чётное значение задержки}
\label{pic:indi-model2}
\end{subfigure}
\caption{Диаграмма поведения сигналов после выполнения задания}
\end{figure} \end{figure}
В процессе работы были модифицированы исходные коды (листинг \hrf{lst:dec}, в листинге приведена только изменённая часть, логика работы семафора) и коды тестов (листинг \hrf{lst:dec-tb}) для компонента семафора, а также тестовый стенд (листинг \hrf{lst:main-top-tb}) и прошивка процессора (листинг \hrf{lst:sem}) итогового проекта. В процессе работы были модифицированы исходные коды (листинг \hrf{lst:dec}, в листинге приведена только изменённая часть, логика работы семафора) и коды тестов (листинг \hrf{lst:dec-tb}) для компонента семафора, а также тестовый стенд (листинг \hrf{lst:main-top-tb}) и прошивка процессора (листинг \hrf{lst:sem}) итогового проекта.
\section{Выводы} \section{Выводы}

231
03-fpga-lab-03-report.tex Normal file
View File

@ -0,0 +1,231 @@
\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{лабораторной}{№ 3}{Разработка и интеграция пользовательских инструкций в состав ядра Nios II}{Проектирование цифровых устройств на \\ программируемых логических интегральных схемах (ПЛИС)}{}{С.В. Фёдоров}
\newpage
\pagestyle{fancy}
\section{Цель}
Освоить методику использования в составе системы на кристалле пользовательских периферийных модулей и пользовательских инструкций. Реализовать и отладить программное обеспечение системы на кристалле.
\section{Задачи}
\begin{itemize}
\item Изучить методики расширения набора команд процессора пользовательскими инструкциями.
\item Реализовать программное обеспечение, использующее пользовательские инструкции на примере инструкции вычисления количества единиц в двоичном числе.
\item Сравнить быстродействие с программной реализацией на базовом наборе команд.
\item Выполнить индивидуальное задание.
\end{itemize}
\section{Выполнение работы}
По шагам из методического материала был создан проект в САПР Quartus Prime (доступен по \href{https://git.iovchinnikov.ru/ivan-igorevich/fpga-lab-2/commits/branch/lab3}{ссылке}).
Созданная пользовательская инструкция доступна для обращения из программного кода в прикладном проекте.
\section{Индивидуальное задание}
В качестве индивидуального было дано следующее задание: описать пользовательскую инструкцию, принимающую на вход два 32-разрядных значения и возвращающая минимальное, максимальное, верхнее медианное и нижнее медианное значения. Схема получения данных на рис. \hrf{pic:indi-scheme}. Исходные данные представляют собой два 32-разрядных слова, каждое из которых необходимо разделить на четыре 8-разрядных слова, отсортировать все восемь 8-разрядных слов по возрастанию и взять их минимум (1), максимум (4) и медианы (2, 3).
\begin{figure}[H]
\centering
\fontsize{12}{1}\selectfont
\includesvg[scale=1.01]{pics/03-fpga-03-lab-indi-scheme.svg}
\caption{Схема обработки данных}
\label{pic:indi-scheme}
\end{figure}
Поскольку сложность самой быстрой сортировки $O(N*\lg_2(N))$, принято решение опираться на то, что значений в искомом множестве всегда фиксированное число. Сложность задания состоит в том, чтобы получить медианы не отсортированного множества за время меньшее, чем $O(N*\lg_2(N))$. Отсутствие необходимости разработки для множеств не фиксированной длины позволяет воспользоваться несколькими способами получения медианных значений.
\subsection{Описание схемотехнического решения}
Дан исходный числовой ряд (восемь байт, полученных из двух 32-разрядных переменных), например
\[ [31, 44, 216, 0, 132, 68, 18, 100]. \]
Алгоритм выполняется в несколько шагов:
\begin{enumerate}
\item сравнение соседних значений в ряду парами;
\item меньшие значения сравнить с меньшими значениями пар, а большие с большими;
\item взять меньшую из больших полученных пар и б\'{о}льшую из меньших, также сравнить меньшие с меньшими и б\'{о}льшие с б\'{о}льшими;
\item выявить меньшее из меньшей пары, полученной в п. 2 и большее из большей.
\end{enumerate}
\begin{equation*}
\begin{gathered}
[31, 44, 216, 0, 132, 68, 18, 100]
\to
\begin{bmatrix}
31, 44 \\ 0, 216 \\ 68, 132 \\ 18, 100
\end{bmatrix}
\to
\begin{bmatrix}
0, 31 \\ 18, 68 \\ 44, 216 \\ 100, 132
\end{bmatrix}
\\ \to
\begin{bmatrix}
44, 100 \\ 31, 68
\end{bmatrix}
\\ \to [31, 44, 68, 100] \to 44, 68;
\\ \to [0, 18], [132, 216] \to 0, 216.
\end{gathered}
\end{equation*}
Из приведённых вычислений очевидно, что исходное множество содержит:
\begin{itemize}
\item минимум = 0;
\item максимум = 216;
\item нижняя медиана = 44
\item верхняя медиана = 68.
\end{itemize}
Для реализации данного алгоритма был описан вспомогательный модуль на языке Verilog, возвращающий меньшее и большее из двух входящих чисел.
\begin{lstlisting}[language=Verilog,style=VerilogStyle]
module lessmore (
input [7:0] in1,
input [7:0] in2,
output logic [7:0] less,
output logic [7:0] more
);
always_comb begin
if (in1 < in2) begin
less = in1;
more = in2;
end else begin
less = in2;
more = in1;
end
end
endmodule
\end{lstlisting}
Сам же алгоритм реализован в несколько «шагов», представляющих собой слои комбинационной логики
\begin{lstlisting}[language=Verilog,style=VerilogStyle]
module minmelhmax (
input clk,
input reset,
input [31:0] in1,
input [31:0] in2,
output logic [31:0] result
);
logic [7:0] step1less [0:3];
logic [7:0] step1more [0:3];
logic [7:0] step2less [0:3];
logic [7:0] step2more [0:3];
logic [7:0] median [0:3];
logic [7:0] temp [0:3];
// 1: compare pairs
lessmore s01 (in1[7:0], in1[15:8], step1less[0], step1more[0]);
lessmore s02 (in1[23:16], in1[31:24], step1less[1], step1more[1]);
lessmore s03 (in2[7:0], in2[15:8], step1less[2], step1more[2]);
lessmore s04 (in2[23:16], in2[31:24], step1less[3], step1more[3]);
// 2: 1st step mins to mins, maxes to maxes
lessmore s11 (step1less[0], step1less[1], step2less[0], step2more[0]);
lessmore s12 (step1less[2], step1less[3], step2less[1], step2more[1]);
lessmore s13 (step1more[0], step1more[1], step2less[2], step2more[2]);
lessmore s14 (step1more[2], step1more[3], step2less[3], step2more[3]);
// 3: 2nd step less-maxes, more-mins
lessmore s21 (step2less[2], step2less[3], median[0], median[1]);
lessmore s22 (step2more[0], step2more[1], median[2], median[3]);
// 4: median of four
lessmore s31 (median[0], median[1], temp[1], result[1]);
lessmore s32 (median[2], median[3], result[2], temp[2]);
// 5: max and min of input
lessmore s41 (step2less[0], step2less[1], result[0], temp[0]);
lessmore s42 (step2more[2], step2more[3], temp[3], result[3]);
endmodule
\end{lstlisting}
Работа модуля была проверена на тестовом стенде
\subsection{Описание программного решения}
Два входящих слова записываются во временный указатель и интерпретируются, как указатель на восемь 8-разрядных переменных \code{alt_u8}, далее цикл работает с ними как с массивом данных. На каждом шаге цикла ищется минимальный и максимальный элемент. Найденные элементы меняются местами с теми числами, которые находятся на месте действительно минимального и максимального элемента соответственно. Алгоритм являет собой совмещение \textit{сортировки выбором} и \textit{шейкерной сортировки}. Таким образом за четыре итерации получается сортированное множество, в котором необходимые значения берутся по индексу.
\begin{equation*}
\begin{gathered}
[31, 44, 216, 0, 132, 68, 18, 100] \to \\
[0, 44, 100, 31, 132, 68, 18, 216] \to \\
[0, 18, 100, 31, 44, 68, 132, 216] \to \\
[0, 18, 31, 68, 44, 100, 132, 216] \to \\
[0, 18, 31, 44, 68, 100, 132, 216]
\end{gathered}
\end{equation*}
Программная реализация алгоритма копирует исходные значения функцией \code{memset(dst, src, size)} и обрабатывает ситуацию, в которой найденный максимум равен найденному минимуму.
\begin{lstlisting}[language=C,style=CCodeStyle]
alt_u32 ones_sw (
alt_u32* data_block_a,
alt_u32* data_block_b,
alt_u32 words) {
alt_u32 result;
int word;
for (word = 0; word < words; ++word) {
alt_u8 tmp[8];
memset(tmp, data_block_a[word], 4);
memset((tmp + 4), data_block_b[word], 4);
for (int k = 0; k < 4; ++k) {
int min = tmp[k];
int max = min;
for (int i = k; i < 8 - k; ++i) {
if (min >= tmp[i]) {
min = tmp[i];
tmp[i] = tmp[k];
tmp[k] = min;
}
if ((max <= tmp[i]) && (max != min)) {
max = tmp[i];
tmp[i] = tmp[8 - k - 1];
tmp[8 - k - 1] = max;
}
}
}
result += tmp[0];
result += (tmp[3] << 8);
result += (tmp[4] << 16);
result += (tmp[7] << 24);
}
return result;
}
\end{lstlisting}
\section{Результат и выводы}
После запуска приложения были получены результаты, представленные на рис. \hrf{:}.
\begin{figure}[H]
\centering
% \includegraphics[width=12cm]{.}
\caption{}
\label{pic:}
\end{figure}
Пользовательская инструкция для процессора Nios II -- это эффективный инструмент ускорения работы программы и выноса некоторых алгоритмов поточной обработки данных в аппаратную часть.
\newpage
\appendix
\setcounter{secnumdepth}{4}
\section{Приложения}
\subsection{Исходные коды проекта}
\label{appendix:src}
\lstinputlisting[language=C,style=CCodeStyle,caption={\code{sem.c}},label={lst:sem}]{src/sem.c}
\end{document}

211
03-fpga-lab-04-report.tex Normal file
View File

@ -0,0 +1,211 @@
\documentclass[a4paper,fontsize=14bp]{article}
\input{settings/common-preamble}
\input{settings/fancy-listings-preamble}
\input{settings/bmstu-preamble}
\setcounter{secnumdepth}{4}
\numerationTop
\begin{document}
\thispagestyle{empty}
\makeBMSTUHeader
\makeReportTitle{лабораторной}{4}{Проектирование цифрового синтезатора}{Проектирование цифровых устройств на \\ программируемых логических интегральных схемах (ПЛИС)}{}{С.В. Фёдоров}
\newpage
\pagestyle{fancy}
\section{Цель}
Осуществить полный цикл проектирования цифрового устройства на ПЛИС на языке SystemVerilog. Реализовать генератор периодических функций на основе метода прямого цифрового синтеза на микросхеме семейства Cyclone IV E.
\section{Задачи}
\begin{itemize}
\item Реализовать модули «Накопителя фазы», «Просмотровой таблицы», «Сигма-Дельта модулятора».
\item Реализовать синтезатор по схеме (рис. \hrf{pic:synth-scheme}), используя разработанные модули.
\begin{figure}[H]
\centering
\fontsize{14}{1}\selectfont
\includesvg[scale=1.01]{pics/03-fpga-lab-04-01-synth.svg}
\caption{Схема цифрового синтезатора}
\label{pic:synth-scheme}
\end{figure}
\item Осуществить моделирование каждого этапа разработки.
\item В рамках самостоятельной подготовки провести расчёт значений $u_n$,$x_n$,$y'_n$ и $\varepsilon_n$ для 5 тактов работы дельта-сигма модулятора. Приведите значения для каждого такта и график выходного сигнала $y_n$.
\end{itemize}
\section{Выполнение работы}
\subsection{Самостоятельная подготовка}
Вариант 9 для первой группы $x_n = 9 * 3 - 21 = 6$.
\begin{figure}[H]
\centering
\resizebox{\textwidth}{!}{\input{pics/03-fpga-04-sigdel.pgf}}
\caption{Пошаговая иллюстрация работы сигма-дельта модулятора}
\label{pic:sig-del-handjob}
\end{figure}
Регистр $u_{-1}$ по низкому уровню сигнала сброса инициализируется нулём, поэтому значение $y_{-1}$ становится равным 127, как следствие, $\varepsilon_{-1} = 0$. Далее, значения изменяются по следующим формулам:
\begin{equation*}
\begin{gathered}
x = 6;\\
u_n = x - y'_{n-1}\\
\varepsilon_n = y'_n - u_n
\end{gathered}
\end{equation*}
Несколько шагов алгоритма приведены в расчётах ниже. Из ручного прохождения алгоритма (и графика на рис \hrf{pic:sig-del-handjob}) очевидно, что постоянное малое значение на входе модулятора формирует переходы $y$ от -128 до 127 на каждом такте линии задержки, как если бы это было при входящем значении нуля, и изредка удерживает $y$ в значении 127 (примерно, один раз в 20 отсчётов).
\begin{enumerate}
\item $x = 6, u_{1} = 6, y'_{0} = 127, \varepsilon_{1} = 121$
\item $x = 6, u_{2} = -115, y'_{1} = 127, \varepsilon_{2} = -13$
\item $x = 6, u_{3} = 19, y'_{2} = -128, \varepsilon_{3} = 108$
\item $x = 6, u_{4} = -102, y'_{3} = 127, \varepsilon_{4} = -26$
\item $x = 6, u_{5} = 32, y'_{4} = -128, \varepsilon_{5} = 95$
\item $x = 6, u_{6} = -89, y'_{5} = 127, \varepsilon_{6} = -39$
\item $x = 6, u_{7} = 45, y'_{6} = -128, \varepsilon_{7} = 82$
\item $x = 6, u_{8} = -76, y'_{7} = 127, \varepsilon_{8} = -52$
\item $x = 6, u_{9} = 58, y'_{8} = -128, \varepsilon_{9} = 69$
\item $x = 6, u_{10} = -63, y'_{9} = 127, \varepsilon_{10} = -65$
\item $x = 6, u_{11} = 71, y'_{10} = -128, \varepsilon_{11} = 56$
\item $x = 6, u_{12} = -50, y'_{11} = 127, \varepsilon_{12} = -78$
\item $x = 6, u_{13} = 84, y'_{12} = -128, \varepsilon_{13} = 43$
\item $x = 6, u_{14} = -37, y'_{13} = 127, \varepsilon_{14} = -91$
\item $x = 6, u_{15} = 97, y'_{14} = -128, \varepsilon_{15} = 30$
\item $x = 6, u_{16} = -24, y'_{15} = 127, \varepsilon_{16} = -104$
\item $x = 6, u_{17} = 110, y'_{16} = -128, \varepsilon_{17} = 17$
\item $x = 6, u_{18} = -11, y'_{17} = 127, \varepsilon_{18} = -117$
\item $x = 6, u_{19} = 123, y'_{18} = -128, \varepsilon_{19} = 4$
\item $x = 6, u_{20} = 2, y'_{19} = 127, \varepsilon_{20} = 125$
\item $x = 6, u_{21} = -119, y'_{20} = 127, \varepsilon_{21} = -9$
\item $x = 6, u_{22} = 15, y'_{21} = -128, \varepsilon_{22} = 112$
\end{enumerate}
\subsection{Разработка модулей}
\subsubsection{Накопитель фазы}
\textbf{Интерфейс модуля}
\begin{frm} \begin{itemize}
\item [] \textbf{Входы:}
\item [] \code{phinc[7:0]} -- величина приращения фазы за один период тактового сигнала;
\item [] \code{clk} -- тактовый сигнал;
\item [] \code{clr_n} -- вход асинхронного сброса;
\item [] \textbf{Выходы:}
\item [] \code{phase[7:0]} -- 8 старших значащих битов выхода накопителя;
\item [] \textbf{Параметры:}
\item [] \code{WIDTH} -- разрядность накопителя фазы (значение по умолчанию -- 14).
\end{itemize} \end{frm}
\textbf{Принцип действия}
Накопитель фазы -- это классический аккумулятор, который сохраняет накопленную сумму в регистре и использует её в качестве одного из операндов сумматора на каждом такте. Второй операнд поступает с входа и определяет величину приращения фазы. Разрядность аккумулятора должна быть параметризирована. Входные значения складываются с младшими битами регистра аккумулятора, а на выход поступают старшие 8 разрядов аккумулятора, поэтому при разрядности аккумулятора M и значении N на входе приращения фазы выход фазы будет увеличиваться на единицу один раз в $2^{(M-8)}/N$ тактов.
\lstinputlisting[language=Verilog,style=VerilogStyle,caption={Накопитель фазы},label={lst:phacc}]{src/phacc.sv}
\lstinputlisting[language=Verilog,style=VerilogStyle,caption={Тестовый стенд накопителя фазы},label={lst:inc_lut}]{src/inc_lut_tb.sv}
\subsubsection{Просмотровая таблица}
Просмотровая таблица реализована на ПЗУ, шина адреса которого управляется входным значением фазы сигнала, а ячейки содержат соответствующие значения сигнала. Для реализации использован модуль ROM: 1-PORT с файлом инициализации памяти sine256.mif прилагавшемся в исходных файлах для лабораторной работы.
\begin{figure}[H]
\centering
\includegraphics[width=0.9\textwidth]{03-fpga-lab-04-02-phacc.png}
\caption{Результат симуляции работы накопителя фазы и просмотровой таблицы}
\label{pic:phacc-lut}
\end{figure}
\subsubsection{Дельта-сигма модулятор}
\textbf{Интерфейс модуля}
\begin{frm} \begin{itemize}
\item [] \textbf{Входы:}
\item [] \code{val[7:0]} - входные данные модулятора;
\item [] \code{clk} тактовый сигнал;
\item [] \code{clr_n} вход асинхронного сброса.
\item [] \textbf{Выход:}
\item [] \code{daco} - однобитная выходная последовательность.
\end{itemize}
\end{frm}
\textbf{Принцип действия}
На вход поступают 8-разрядные отсчеты $x_n$ (рис. \hrf{pic:sigdel-1}). Выход $y_n$ -- двухуровневый дискретизированный с большой частотой. Частота изменения отсчетов сигнала, выбираемых из памяти, ниже частоты работы модулятора. Это обеспечивает передискретизацию и возможность представления сигнала в аналоговом виде после НЧ фильтрации последовательности нулей и единиц.
\begin{figure}[H]
\centering
\fontsize{12}{1}\selectfont
\includesvg[scale=1.01]{pics/03-fpga-lab-04-01-sigdel.svg}
\caption{Схема дельта-сигма модулятора первого порядка}
\label{pic:sigdel-1}
\end{figure}
Если в работе модулятора использовать 8-разрядный регистр $u_n$ периодически в работе модулятора будут появляться переполнения и будет наблюдаться некорректное поведение, проявляющееся в смене фазы выходного сигнала (рис. \hrf{pic:unoverflow}). Переполнение регистра возможно наблюдать при моделировании достаточно большого числа шагов алгоритма (рис. \hrf{pic:unover-model}).
\begin{figure}[H]
\centering
\begin{subfigure}[b]{0.48\textwidth}
\centering
\includegraphics[width=\textwidth]{03-fpga-lab-04-02-unoverflow.png}
\caption{ }
\end{subfigure}
\begin{subfigure}[b]{0.9\textwidth}
\centering
\includegraphics[width=\textwidth]{03-fpga-lab-04-02-phase-sin.png}
\caption{ }
\end{subfigure}
\caption{Смена фазы выходного сигнала}
\label{pic:unoverflow}
\end{figure}
\begin{figure}[H]
\centering
\includegraphics[width=0.9\textwidth]{03-fpga-lab-04-02-unover-model.png}
\caption{Моделирование переполнения значения регистра}
\label{pic:unover-model}
\end{figure}
\lstinputlisting[language=Verilog,style=VerilogStyle,caption={Код дельта-сигма модулятора},label={lst:phacc}]{src/sdmod.sv}
\lstinputlisting[language=Verilog,style=VerilogStyle,caption={Тестовый стенд дельта-сигма модулятора},label={lst:inc_lut}]{src/lut_mod_tb.sv}
\subsubsection{Реализация синтезатора}
\lstinputlisting[language=Verilog,style=VerilogStyle,caption={Код дельта-сигма синтезатора},label={lst:phacc}]{src/sigdel.sv}
\begin{figure}[H]
\centering
\includegraphics[width=0.9\textwidth]{03-fpga-lab-04-02-correct.png}
\caption{Моделирование работы синтезатора}
\label{pic:synth-model}
\end{figure}
\subsection{Контрольные вопросы}
\begin{itemize}
\item Почему именно за это время из памяти выбирается один период синуса?
Столько тратит времени 14-разрядный регистр накапливающий значения в 8 нижних разрядах так, чтобы изменилось значение в 8 верхних, отдаваемых аккумулятором.
\item Какая разрядность накопителя фазы требуется для формирования синусоидального сигнала в диапазоне частот от единиц до сотен Герц при изменении инкремента фазы от 1 до 255 (период синуса содержит 256 отсчетов, частота тактового импульса -- 50МГЦ)?
В данной работе использовался коэффициент накопления 16 при той же частоте ТИ, то есть на каждом такте значение в аккумуляторе менялось на 1 в 5м разряде. Это тоже самое, что если коэфициент будет равен единице, а разрядность снижена на 5. Один период синуса проходил за 20мкс. Таким образом можно сделать вывод, что при коэффициенте 16 и разрядности накопителя 20 период одного синуса будет составлять около 760мс, при разрядности 21 -- около 1,5сек.
\item Дельта-сигма модулятор первого порядка.
Позволяет снизить шум квантования относительно ШИМ, за счёт увеличения частоты выходного сигнала.
\item Конфигурация ПЛИС Altera на основе статической памяти.
Конфигурация ПЛИС хранится ячейках статической памяти, изготовленной по стандартной технологии. Достоинство этой технологии -- возможность многократного перепрограммирования ПЛИС. Недостатки -- не самое высокое быстродействие, поскольку после включения питания прошивку нужно вновь загружать из памяти. На плате необходимо дополнительно устанавливать загрузчик, специальная микросхема FLASH или микроконтроллер.
\item Язык SystemVerilog.
Языки описания схемотехники (HDL -- hardware design language) позволяют значительно сократить время описания схемотехнических решений и значительно повысить качество за счёт переиспользования кода, б\'{о}льших возможностей по моделированию и тестированию готовых схем. Также повышается переносимость решений. Язык SystemVerilog отличается от VHDL (Very High Speed Integrated Circuit HDL) лаконичностью описания, а от Verilog расширенными возможностями работы с абстракциями более верхнего уровня (не только сигналы, регистры и шины, но и знаковые переменные, матрицы и прочие).
\end{itemize}
\section{Выводы}
\newpage
\appendix
\setcounter{secnumdepth}{4}
\section{Приложения}
\subsection{Исходные коды проекта}
\label{appendix:src}
\end{document}

View File

@ -0,0 +1,200 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg5"
inkscape:version="1.2.1 (9c6d41e4, 2022-07-14)"
sodipodi:docname="03-fpga-03-lab-indi-scheme.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
showgrid="true"
inkscape:zoom="3.4498027"
inkscape:cx="445.96753"
inkscape:cy="294.21973"
inkscape:window-width="1534"
inkscape:window-height="876"
inkscape:window-x="0"
inkscape:window-y="25"
inkscape:window-maximized="0"
inkscape:current-layer="layer1">
<inkscape:grid
type="xygrid"
id="grid1049" />
</sodipodi:namedview>
<defs
id="defs2" />
<g
inkscape:label="Слой 1"
inkscape:groupmode="layer"
id="layer1">
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93889px;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';fill:#000000;stroke-width:0.264999;stroke-linecap:square"
x="54.239582"
y="67.46875"
id="text1468"><tspan
sodipodi:role="line"
id="tspan1466"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93889px;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';stroke-width:0.265"
x="54.239582"
y="67.46875">Исходные данные</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.9389px;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';fill:#000000;stroke-width:0.264999;stroke-linecap:square"
x="54.239582"
y="75.40625"
id="text1522"><tspan
sodipodi:role="line"
id="tspan1520"
style="stroke-width:0.265"
x="54.239582"
y="75.40625">Искомые значения</tspan></text>
<path
style="fill:none;stroke-width:0.264999;stroke-linecap:square;stroke:#000000;stroke-opacity:1"
d="m 97.895832,63.499999 v 5.291667 H 119.0625 v -5.291667"
id="path1740" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;stroke-opacity:1"
d="m 121.70833,63.499999 v 5.291667 H 142.875 v -5.291667"
id="path1742" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;stroke-opacity:1"
d="m 99.218753,71.4375 v 5.291667 H 141.55208 V 71.4375"
id="path1744" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;stroke-opacity:1"
d="m 108.47917,66.145832 v 2.645834"
id="path1746" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;stroke-opacity:1"
d="m 103.1875,64.822916 v 3.96875"
id="path1748" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;stroke-opacity:1"
d="m 113.77083,63.499999 v 5.291667"
id="path1750" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;stroke-opacity:1"
d="m 127,63.499999 v 5.291667"
id="path1752" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;stroke-opacity:1"
d="m 132.29166,67.468749 v 1.322917"
id="path1754" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;stroke-opacity:1"
d="m 137.58333,64.822916 v 3.96875"
id="path1756" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;stroke-opacity:1"
d="m 97.895832,64.822916 h 5.291668 v 1.322916 h 5.29167 v -2.645833 h 10.58333"
id="path1762" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;stroke-opacity:1"
d="M 121.70833,63.499999 H 127 v 3.96875 h 5.29166 v -2.645833 h 5.29167 v -1.322917 h 5.29167"
id="path1764" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;stroke-opacity:1"
d="m 99.218749,75.406249 h 5.291671 v -1.322917 h 5.29166 v -1.322916 h 5.29167 5.29167 v -1.322917 h 21.16666"
id="path1766" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;stroke-opacity:1"
d="m 104.51042,75.406249 v 1.322917"
id="path1768" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;stroke-opacity:1"
d="m 109.80208,74.083332 v 2.645834"
id="path1770" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;stroke-opacity:1"
d="m 115.09375,72.760416 v 3.96875"
id="path1772" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;stroke-opacity:1"
d="m 120.38542,72.760416 v 3.96875"
id="path1774" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;stroke-opacity:1"
d="m 125.67708,71.437499 v 5.291667"
id="path1776" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;stroke-opacity:1"
d="m 130.96875,71.437499 v 5.291667"
id="path1778" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;stroke-opacity:1"
d="m 136.26041,71.437499 v 5.291667"
id="path1780" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.9389px;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';fill:#000000;stroke:none;stroke-width:0.264999;stroke-linecap:square;stroke-opacity:1;fill-opacity:1"
x="99.21875"
y="82.020836"
id="text1792"><tspan
sodipodi:role="line"
id="tspan1790"
style="stroke-width:0.265;stroke:none;fill:#000000;fill-opacity:1"
x="99.21875"
y="82.020836" /></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.9389px;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264999;stroke-linecap:square;stroke-opacity:1"
x="99.21875"
y="82.020836"
id="text1856"><tspan
sodipodi:role="line"
id="tspan1854"
style="stroke-width:0.265"
x="99.21875"
y="82.020836">\circled{1}</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.9389px;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264999;stroke-linecap:square;stroke-opacity:1"
x="136.26042"
y="82.020836"
id="text1856-7"><tspan
sodipodi:role="line"
id="tspan1854-1"
style="stroke-width:0.265"
x="136.26042"
y="82.020836">\circled{4}</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.9389px;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264999;stroke-linecap:square;stroke-opacity:1"
x="120.38541"
y="82.020836"
id="text1856-9"><tspan
sodipodi:role="line"
id="tspan1854-3"
style="stroke-width:0.265"
x="120.38541"
y="82.020836">\circled{3}</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.9389px;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264999;stroke-linecap:square;stroke-opacity:1"
x="115.09375"
y="82.020836"
id="text1856-1"><tspan
sodipodi:role="line"
id="tspan1854-14"
style="stroke-width:0.265"
x="115.09375"
y="82.020836">\circled{2}</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.8 KiB

1511
pics/03-fpga-04-sigdel.pgf Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

View File

@ -0,0 +1,185 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg8"
inkscape:version="1.0.2 (e86c870879, 2021-01-15)"
sodipodi:docname="03-fpga-lab-04-01-sigdel.svg">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.9195959"
inkscape:cx="382.92847"
inkscape:cy="355.83023"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
inkscape:document-rotation="0"
showgrid="true"
inkscape:snap-global="true"
inkscape:object-paths="true"
inkscape:snap-bbox="true"
inkscape:bbox-nodes="false"
inkscape:window-width="1533"
inkscape:window-height="1205"
inkscape:window-x="45"
inkscape:window-y="72"
inkscape:window-maximized="0"
inkscape:bbox-paths="false"
inkscape:snap-bbox-edge-midpoints="false">
<inkscape:grid
type="xygrid"
id="grid833" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';stroke-width:0.264583"
x="88.619423"
y="89.942841"
id="text837"><tspan
sodipodi:role="line"
id="tspan835"
x="88.619423"
y="89.942841"
style="stroke-width:0.264583">$Z^{-1}$</tspan></text>
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';stroke-width:0.264583"
x="103.17359"
y="84.649567"
id="text841"><tspan
sodipodi:role="line"
id="tspan839"
x="103.17359"
y="84.649567"
style="stroke-width:0.264583">$u_n$</tspan></text>
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';stroke-width:0.264583"
x="116.41666"
y="89.958336"
id="text845"><tspan
sodipodi:role="line"
id="tspan843"
x="116.41666"
y="89.958336"
style="stroke-width:0.264583">Q</tspan></text>
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';stroke-width:0.264583"
x="129.64583"
y="84.666664"
id="text849"><tspan
sodipodi:role="line"
id="tspan847"
x="129.64583"
y="84.666664"
style="stroke-width:0.264583">$y_n$</tspan></text>
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';stroke-width:0.264583"
x="129.64583"
y="97.895836"
id="text853"><tspan
sodipodi:role="line"
id="tspan851"
x="129.64583"
y="97.895836"
style="stroke-width:0.264583">$\varepsilon_n$</tspan></text>
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';stroke-width:0.264583"
x="54.239582"
y="85.989586"
id="text857"><tspan
sodipodi:role="line"
id="tspan855"
x="54.239582"
y="85.989586"
style="stroke-width:0.264583">$x_n$</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 52.916666,88.635416 h 15.875"
id="path859" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.265;stroke-miterlimit:4;stroke-dasharray:none"
id="rect861"
width="11.90625"
height="9.2604113"
x="87.3125"
y="84.666664" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none"
id="rect863"
width="10.583333"
height="9.260417"
x="113.77083"
y="84.666664" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 99.218749,88.635416 H 113.77083"
id="path865" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 124.35417,87.312499 h 23.81249"
id="path867" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 124.35417,91.281249 h 3.96875 V 103.1875 l -54.239587,0 v -9.260417"
id="path869"
sodipodi:nodetypes="ccccc" />
<circle
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none"
id="path871"
cx="74.215836"
cy="88.502914"
r="5.2916665" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 79.374999,88.635416 7.937501,10e-7"
id="path873"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 74.083332,85.989582 v 5.291667"
id="path875" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 71.437499,88.635416 h 5.291667"
id="path877" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 75.406249,96.572915 h 2.645833"
id="path879" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.6 KiB

View File

@ -0,0 +1,239 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg8"
inkscape:version="1.0.2 (e86c870879, 2021-01-15)"
sodipodi:docname="03-fpga-lab-04-01-synth.svg">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.4"
inkscape:cx="348.3892"
inkscape:cy="386.19683"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
inkscape:document-rotation="0"
showgrid="true"
inkscape:snap-global="true"
inkscape:snap-text-baseline="true"
inkscape:window-width="2560"
inkscape:window-height="1376"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1">
<inkscape:grid
type="xygrid"
id="grid10" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';stroke-width:0.264583"
x="30.427084"
y="67.46875"
id="text14"><tspan
sodipodi:role="line"
id="tspan12"
x="30.427084"
y="67.46875"
style="stroke-width:0.264583">Инкремент</tspan><tspan
sodipodi:role="line"
x="30.427084"
y="73.642372"
style="stroke-width:0.264583"
id="tspan16">фазы</tspan></text>
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';stroke-width:0.264583"
x="63.5"
y="74.083336"
id="text20"><tspan
sodipodi:role="line"
id="tspan18"
x="63.5"
y="74.083336"
style="stroke-width:0.264583">Накопитель</tspan><tspan
sodipodi:role="line"
x="63.5"
y="80.256958"
style="stroke-width:0.264583"
id="tspan22">фазы</tspan></text>
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';stroke-width:0.264583"
x="99.218742"
y="74.083336"
id="text26"><tspan
sodipodi:role="line"
id="tspan24"
x="99.218742"
y="74.083336"
style="stroke-width:0.264583">ПЗУ</tspan><tspan
sodipodi:role="line"
x="99.218742"
y="80.256958"
style="stroke-width:0.264583"
id="tspan28">sin</tspan></text>
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';stroke-width:0.264583"
x="117.73958"
y="74.083336"
id="text32"><tspan
sodipodi:role="line"
id="tspan30"
x="117.73958"
y="74.083336"
style="stroke-width:0.264583">Дельта-сигма</tspan><tspan
sodipodi:role="line"
x="117.73958"
y="80.256958"
style="stroke-width:0.264583"
id="tspan34">модулятор</tspan></text>
<rect
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583;stroke-opacity:1"
id="rect36"
width="31.749998"
height="15.875"
x="60.854168"
y="67.46875" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.264583;stroke-opacity:1"
id="rect861"
width="15.875003"
height="15.875"
x="96.572914"
y="67.46875" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.264583;stroke-opacity:1"
id="rect863"
width="33.072926"
height="15.875"
x="116.41666"
y="67.46875" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 43.656249,75.406249 H 60.854166"
id="path865" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 92.604166,75.406249 h 3.968749"
id="path867" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 112.44792,75.406249 h 3.96875"
id="path869" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.264583;stroke-opacity:1"
id="rect871"
width="14.552083"
height="5.2916665"
x="134.9375"
y="91.28125" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 149.48958,75.406249 h 5.29167 v 18.520833 h -5.29167"
id="path873" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 134.9375,93.927082 h -15.875"
id="path875" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.264583;stroke-opacity:1"
id="rect877"
width="5.2916665"
height="5.2916665"
x="113.77083"
y="91.28125" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 127,93.927082 v 6.614588"
id="path879" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 123.03125,100.54167 h 7.9375"
id="path881" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 123.03125,101.86458 h 7.9375"
id="path883" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 127,101.86458 v 6.61459"
id="path885" />
<path
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="m 124.35417,108.47917 h 5.29166"
id="path887" />
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';stroke-width:0.264583"
x="132.29167"
y="105.83333"
id="text891"><tspan
sodipodi:role="line"
id="tspan889"
x="132.29167"
y="105.83333"
style="stroke-width:0.264583">C</tspan></text>
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';stroke-width:0.264583"
x="146.84375"
y="89.958336"
id="text895"><tspan
sodipodi:role="line"
id="tspan893"
x="146.84375"
y="89.958336"
style="stroke-width:0.264583">R</tspan></text>
<circle
id="path897"
style="fill:#000000;stroke:none;stroke-width:0.264583"
cx="127"
cy="93.927086"
r="0.39687499" />
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';stroke-width:0.264583"
x="84.666664"
y="100.54166"
id="text901"><tspan
sodipodi:role="line"
id="tspan899"
x="84.666664"
y="100.54166"
style="stroke-width:0.264583">к осциллографу</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

187
settings/bmstu-preamble.tex Normal file
View File

@ -0,0 +1,187 @@
\usepackage{pgfplots}
\usepackage{pgf}
\usepackage{graphicx}
\usepackage{wrapfig}
\usepackage{scrextend}
\usepackage{enumitem}
\usepackage{caption}
\usepackage{subcaption}
\usepackage{afterpage}
\usepackage{array}
\bibliographystyle{gost-numeric.bbx}
\usepackage[parentracker=true, backend=biber,
%hyperref=false,
bibencoding=utf8, style=numeric-comp, language=auto,
autolang=other, citestyle=gost-numeric,
defernumbers=true, bibstyle=gost-numeric,
sorting=ntvy,
]{biblatex}
\bibliography{../refs}
\usepackage{pgf-umlsd}
\usepackage{pdfpages}
\usepackage{svg}
\usepackage[toc,page,header]{appendix}
\usepackage{tikz-timing}
\renewcommand\appendixtocname{Приложения}
\usepackage{icomma}
\makeatletter
\providecommand\text\mbox
\newenvironment{arithmetic}[1][]{\begin{tabular}[#1]{Al}}{\end{tabular}}
\newcolumntype{A}{>{\bgroup\def~{\phantom{0}}$\@testOptor}r<{\@gobble\\$\egroup}}
\def\@testOptor\ignorespaces#1#2\\{%
\ifx#1\times
\@OperatorRow{#1}{#2}\@tempa%
\else\ifx#1+
\@OperatorRow+{#2}\@tempa%
\else\ifx#1\discretionary% detects the soft hyphen, \-
\@ShortSubtractRow{#2}\@tempa%
\else\ifx#1-
\@OperatorRow-{#2}\@tempa%
\else
\@NormalRow{#1#2}\@tempa%
\fi\fi\fi\fi
\@tempa}
\def\@OperatorRow#1#2#3{%
\@IfEndRow#2\@gobble\\{%
\def#3{\underline{{}#1 #2}\\}%
}{%
\def#3{\underline{{}#1 #2{}}}%
}}
\def\@NormalRow#1#2{%
\@IfEndRow#1\@gobble\\{%
\def#2{#1\\}%
}{%
\def#2{#1{}}%
}}
\def\@IfEndRow#1\@gobble#2\\#3#4{%
\ifx#2\@gobble
#4%
\else
#3%
\fi}
\makeatother
\makeatletter
\AddEnumerateCounter{\asbuk}{\russian@alph}{щ}
\makeatother
\geometry{
left=22mm,
right=15mm,
top=20mm,
bottom=20mm
}
\setlength\parindent{5ex} %GOST-2.105-2019 5.1.4 Абзацы в тексте начинают отступом, равным пяти знакам используемой гарнитуры шрифта (12.5— 17 мм).
\addto\captionsrussian{\renewcommand*{\contentsname}{\hfill Содержание \hfill}}
\renewcommand{\cfttoctitlefont}{\bfseries\Large}
\renewcommand{\cftaftertoctitle}{\hfill}
% приложений, примечаний, таблиц, сносок и примеров — на 1—2 пт меньше.
\renewcommand{\appendixpagename}{\centering Приложения}
\graphicspath{ {./pics/} }
\pgfplotsset{compat=newest}
\pgfplotsset{model/.style = {black, samples = 100}}
\usetikzlibrary{calc,intersections,backgrounds}
\usetikzlibrary{patterns}
\usetikzlibrary{decorations.pathreplacing,calligraphy}
\usetikzlibrary{shapes}
\usetikzlibrary{arrows,automata}
\usetikzlibrary{circuits.logic.IEC}
\newcommand{\approval}[2]{
\begin{tabular}{c}
УТВЕРЖДАЮ \\
#1\\
\underline{\hspace{2.7cm}}#2\\
«\underline{\hspace{0.6cm}}»\underline{\hspace{2.1cm}}2021 г.
\end{tabular}
}
\renewcommand\labelitemi{\textendash}
\renewcommand\thesubfigure{\asbuk{subfigure}}
\setlist{nosep}
\setlist[itemize]{leftmargin=2\parindent}
\setlist[enumerate]{leftmargin=2\parindent}
\newcommand{\makeBMSTUHeader}{
\noindent\begin{minipage}{0.05\textwidth}
\includegraphics[scale=0.2]{settings/logo_bmstu.png}
\end{minipage}
\hfill
\begin{minipage}{0.85\textwidth}\raggedleft
\begin{center}
\fontsize{13pt}{0.3\baselineskip}\selectfont
\textbf{Министерство науки и высшего образования
Российской Федерации \\
Федеральное государственное бюджетное образовательное \\
учреждение высшего образования \\
«Московский государственный технический университет \\
имени Н. Э. Баумана \\
(национальный исследовательский университет)» \\
(МГТУ им. Н. Э. Баумана)
}
\end{center}
\end{minipage}
\begin{center}
\fontsize{12pt}{0.1\baselineskip}\selectfont
\noindent\makebox[\linewidth]{\rule{\textwidth}{2pt}}
\makebox[\linewidth]{\rule{\textwidth}{1pt}}
\end{center}
\begin{flushleft}
\fontsize{12pt}{14pt}\selectfont
\textbf{ФАКУЛЬТЕТ \tabto{3cm} «Информатика и системы управления» (ИУ)\\
КАФЕДРА \tabto{3cm} «Информационные системы и телекоммуникации» (ИУ3)
}
\end{flushleft}
}
\newcommand{\makeReportTitle}[6]{
\vspace*{3em}
\thispagestyle{titlepage}
\begin{center}
\Large{\textbf{Отчет \\
по #1 работе #2\\
«#3»\\
по курсу\\
«#4»
}}
\end{center}
\vspace*{4em}
\begin{flushright}
Выполнили\\
%удент группы ИУ3-11М \\
%удент группы ИУ3-21М \\
удент группы ИУ3-31М \\
Овчинников И.И. \\
\vspace*{0.5em}
Проверил#5\\
#6
\end{flushright}
}
\newcommand{\defineHatch}{
\makeatletter
\pgfdeclarepatternformonly[7pt,0.5pt]{hatch}
{\pgfqpoint{0pt}{0pt}}
{\pgfqpoint{7pt}{7pt}} {\pgfpoint{6pt}{6pt}}%
{
\pgfsetcolor{gray} \pgfsetlinewidth{0.5pt}
\pgfpathmoveto{\pgfqpoint{0pt}{0pt}} \pgfpathlineto{\pgfqpoint{7pt}{7pt}}
\pgfusepath{stroke}
}
\makeatother
}
\newcommand{\tkzblk}[3]{ \node [#1] at ($ (#2) $) {#3}; }
\newcommand{\tkzdarr}[2]{ \draw [->, very thick] ($ (#1) + (0,15) $) -- ($ (#2) - (0,15) $); }
\newcommand{\tkzuarr}[2]{ \draw [<-, very thick] ($ (#1) + (0,15) $) -- ($ (#2) - (0,15) $); }
\newcommand{\crd}[2]{\coordinate (#1) at ($ #2 $);}
\newcommand{\ts}[1]{\textsubscript{#1}}
\newcolumntype{R}{>{\tiny{}}r}
\newcolumntype{L}{>{\tiny{}}l}
\newcolumntype{C}{>{\tiny{}}c}

View File

@ -0,0 +1,97 @@
\usepackage{tikz}
\usepackage{import}
\usepackage{xcolor,transparent}
\usepackage{bookmark}
\usepackage{multicol,multirow,colortbl}
\usepackage{longtable}
\usepackage{setspace}
\usepackage{titlesec}
\usepackage{indentfirst}
\usepackage{amsmath,amsfonts,amssymb,amsthm,mathtools}
\usepackage{layout,lscape}
\usepackage{hyperref}
\usepackage{geometry}
\usepackage[russian]{babel}
\usepackage{nomencl}
\usepackage{imakeidx}
\usepackage{fancyhdr}
\usepackage{tabularx,adjustbox}
\usepackage{float,makecell}
\usepackage{anyfontsize,tabto}
\usepackage{tocloft}
\usepackage{yfonts}
\makeindex
\makenomenclature
\babelfont{rm}{PT Astra Serif}
\babelfont{sf}{PT Astra Serif}
\babelfont{tt}{PT Mono}
\onehalfspacing
\hypersetup{
colorlinks=false,
linktoc=all
}
\fancypagestyle{plain}{ % для автосгенерированых
\fancyhf{}
\renewcommand{\headrulewidth}{0pt}
}
\fancypagestyle{titlepage}{
\fancyhf{}
% \cfoot{\small{\textbf{Москва, 2021г.}}}
\cfoot{\small{\textbf{Москва, \the\year{}г.}}}
}
\fancyhf{}
\renewcommand{\headrulewidth}{0pt}
\newcommand{\numerationTop}{
\fancyhead[C]{\thepage}
}
\newcommand{\numerationBottom}{
\fancyfoot[C]{\thepage}
}
\newcommand{\code}[1]{{\texttt{\detokenize{#1}}}}
\renewcommand{\nomname}{ }
\newcommand*{\nom}[2]{#1\nomenclature{#1}{#2}}
\newcolumntype{P}[1]{>{\centering\arraybackslash}p{#1}}
\newcommand\blankpage{%
\null
\thispagestyle{empty}%
\addtocounter{page}{-1}%
\newpage
}
\newenvironment{frm}
{\begin{center}
\begin{tabular}{|P{0.9\textwidth}|}
\hline\\
}
{
\\\\\hline
\end{tabular}
\end{center}
}
\newcommand{\quotebox}[1]{\begin{center}\begin{minipage}{0.9\linewidth}\vspace{10pt}\center\begin{minipage}{0.8\linewidth}{\space\Huge«}{#1}
\end{minipage}\smallbreak\end{minipage}\end{center}}
\makeatletter
\newcommand{\setword}[2]{%
\phantomsection
#1\def\@currentlabel{\unexpanded{#1}}\label{#2}%
}
\makeatother
\newcommand\lh[2]{\texttt{\textcolor{#1}{#2}}}
\newcommand\hrf[1]{\hyperref[#1]{\ref{#1}}}
\newcommand\hRf[1]{\hyperref[#1]{\nameref{#1}}}
\newcommand*\circled[1]{\tikz[baseline=(char.base)]{\node[shape=circle,draw,inner sep=2pt] (char) {#1};}}
\renewcommand{\cftsecleader}{\cftdotfill{\cftdotsep}}
\renewcommand{\cftsubsecnumwidth}{2em}
\renewcommand{\cftsecnumwidth}{2em}
\titleformat{\paragraph}[runin]{\normalfont\fontsize{14}{18}\bfseries}{\theparagraph}{1em}{}

View File

@ -0,0 +1,135 @@
\usepackage{listings}
\definecolor{codekeywords}{rgb}{0.1,0.4,0.4}
\definecolor{codecomments}{rgb}{0,0.6,0}
\definecolor{codenumbers}{rgb}{0.4,0.4,0.4}
\definecolor{codestring}{rgb}{0.85,0.2,0.1}
\definecolor{backcolour}{rgb}{0.95,0.95,0.92}
\definecolor{codefine}{rgb}{0.7,0.5,0.3}
\definecolor{dkgreen}{rgb}{0,0.6,0}
\definecolor{gray}{rgb}{0.5,0.5,0.5}
\definecolor{mauve}{rgb}{0.58,0,0.82}
\definecolor{golden}{rgb}{1,0.7,0.0}
\definecolor{red}{rgb}{0.8,0.0,0.0}
\lstdefinestyle{JCodeStyle}{
frame=single,
language=Java,
aboveskip=3mm,
belowskip=3mm,
showstringspaces=false,
columns=flexible,
basicstyle=\scriptsize\ttfamily,
numbers=left,
numberstyle=\tiny\color{gray},
keywordstyle=\color{blue},
commentstyle=\color{dkgreen},
stringstyle=\color{mauve},
breaklines=true,
breakatwhitespace=true,
tabsize=4,
escapeinside={<@}{@>}
}
\lstdefinestyle{PyCodeStyle}{
frame=single,
commentstyle=\color{codecomments},
numberstyle=\tiny\color{codenumbers},
stringstyle=\color{codestring},
basicstyle=\ttfamily\footnotesize,
keywordstyle=\color{codekeywords},
breakatwhitespace=false,
breaklines=true,
captionpos=b,
keepspaces=true,
numbers=left,
numbersep=5pt,
showspaces=false,
showstringspaces=false,
showtabs=false,
tabsize=4,
escapeinside={<@}{@>}
}
% \DeclareCaptionFormat{listing}{
% \parbox{\textwidth}{\centering#1 - #3}
% }
% \captionsetup[lstlisting]{ format=listing, singlelinecheck=false, margin=0pt }
\lstdefinestyle{CCodeStyle}{
frame=single,
commentstyle=\color{codecomments},
morecomment=[l][\color{codefine}]{\#},
numberstyle=\tiny\color{codenumbers},
stringstyle=\color{codestring},
basicstyle=\ttfamily\footnotesize,
keywordstyle=\color{codekeywords},
emph={int,char,double,float,unsigned,void,bool},
emphstyle={\color{blue}},
breakatwhitespace=false,
breaklines=true,
captionpos=t,
keepspaces=true,
numbers=left,
numbersep=5pt,
showspaces=false,
showstringspaces=false,
showtabs=false,
tabsize=4,
escapeinside={<@}{@>}
}
\lstdefinestyle{ASMStyle}{
frame=single,
numberstyle=\tiny\color{codenumbers},
commentstyle=\color{codecomments},
keywordstyle=\color{codekeywords},
morecomment=[l]{;}, % l is for line comment
morecomment=[s]{/*}{*/}, % s is for start and end delimiter
basicstyle={\ttfamily\footnotesize},
morekeywords={
bset, macr,
add,addi,and,andi,
bge,beq,bne,br,
cmpeqi,cmpgei,cmplti,cmpnei,
ldhu,ldw,ldwio,
mov,movi,movhi,muli,
nop,nor,
ret,
slli,srai,srli,stw,stwio},
breakatwhitespace=false,
breaklines=true,
captionpos=t,
keepspaces=true,
numbers=left,
numbersep=5pt,
showspaces=false,
showtabs=false,
tabsize=4,
escapeinside={<@}{@>}
}
\lstdefinestyle{VerilogStyle}{
frame=single,
numberstyle=\tiny\color{codenumbers},
commentstyle=\color{codecomments},
keywordstyle=\color{codekeywords},
morecomment=[l]{//}, % l is for line comment
morecomment=[s]{/*}{*/}, % s is for start and end delimiter
basicstyle={\ttfamily\footnotesize},
morekeywords={
logic, always_ff, always_comb
},
breakatwhitespace=false,
breaklines=true,
captionpos=b,
keepspaces=true,
numbers=left,
numbersep=5pt,
showspaces=false,
showtabs=false,
tabsize=2,
escapeinside={<@}{@>}
}
\lstset{escapeinside={<@}{@>}}

BIN
settings/logo_bmstu.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 KiB

View File

@ -0,0 +1,116 @@
\usepackage{fancyhdr}
\usepackage{graphicx}
\usepackage{xcolor,colortbl}% http://ctan.org/pkg/xcolor
\usepackage{titlesec}
\usepackage{indentfirst}
\usepackage{datetime2}
\usepackage{geometry,lscape}
\usepackage{enumitem}
\usepackage{caption,subcaption}
\usepackage{multicol,multirow}
\usepackage{float,adjustbox}
\usepackage{fontawesome}
\usepackage{longtable}
\usepackage{tikz}
\usepackage{hyperref}
\usepackage{forest}
\usepackage{nomencl,imakeidx}
\usetikzlibrary{mindmap,trees}
\usepackage{booktabs}% http://ctan.org/pkg/booktabs
\usepackage{setspace,fontspec}
\usepackage{amsmath}
\usepackage{spreadtab}
\usepackage{svg}
\newcommand{\tabitem}{~~\llap{\textbullet}~~}
\spacing{1.15}
\babelfont{rm}{IBM Plex Sans}
\babelfont{tt}{PT Mono}
\titlelabel{\thetitle. \quad}
\setcounter{tocdepth}{2}
\renewcommand{\nomname}{Термины, определения и сокращения}
\makeindex
\makenomenclature
\newcommand\lh[2]{\texttt{\textcolor{#1}{#2}}}
\newcommand\hrf[1]{\hyperref[#1]{\ref{#1}}}
\newcommand\hRf[1]{\hyperref[#1]{\nameref{#1}}}
\newcommand{\wordcount}{\input{/tmp/wordcount.tex}}
\newcommand{\code}[1]{{\texttt{\detokenize{#1}}}}
\newcommand*{\nom}[2]{#1\nomenclature{#1}{#2}}
\renewcommand\labelitemi{\textemdash}
\newenvironment{frm}
{ \begin{center} \renewcommand*{\arraystretch}{2} \begin{tabular}{|p{0.9\textwidth}|} \hline }
{ \\\hline \end{tabular} \end{center} }
\newcommand{\info}{\cellcolor{green!20}{\Huge \faInfoCircle \quad}}
\newcommand{\excl}{\cellcolor{red!20}{\Huge \faExclamationTriangle \quad}}
\makeatletter
\newcommand{\setword}[2]{%
\phantomsection
#1\def\@currentlabel{\unexpanded{#1}}\label{#2}%
}
\makeatother
\fancypagestyle{plain}{
\setlength{\headheight}{33pt}
\fancyhf{}
\lhead{\includegraphics[height=5mm]{logo.png}}
\rhead{И.И. Овчинников \\ \href{https://t.me/ivanigorevichfeed}{Telegram: ivanigorevichfeed}}
\chead{\thepage}
\cfoot{\faRocket}
% \rfoot{Всего слов: \wordcount}
}
\geometry{
left=2cm,
right=1cm,
top=2cm,
bottom=2cm
}
\setlist{nolistsep}
\setlist[itemize]{leftmargin=10mm}
\setlist[enumerate]{leftmargin=10mm}
\makeatletter
\providecommand\text\mbox
\newenvironment{arithmetic}[1][]{\begin{tabular}[#1]{Al}}{\end{tabular}}
\newcolumntype{A}{>{\bgroup\def~{\phantom{0}}$\@testOptor}r<{\@gobble\\$\egroup}}
\def\@testOptor\ignorespaces#1#2\\{%
\ifx#1\times
\@OperatorRow{#1}{#2}\@tempa%
\else\ifx#1+
\@OperatorRow+{#2}\@tempa%
\else\ifx#1\discretionary% detects the soft hyphen, \-
\@ShortSubtractRow{#2}\@tempa%
\else\ifx#1-
\@OperatorRow-{#2}\@tempa%
\else
\@NormalRow{#1#2}\@tempa%
\fi\fi\fi\fi
\@tempa}
\def\@OperatorRow#1#2#3{%
\@IfEndRow#2\@gobble\\{%
\def#3{\underline{{}#1 #2}\\}%
}{%
\def#3{\underline{{}#1 #2{}}}%
}}
\def\@NormalRow#1#2{%
\@IfEndRow#1\@gobble\\{%
\def#2{#1\\}%
}{%
\def#2{#1{}}%
}}
\def\@IfEndRow#1\@gobble#2\\#3#4{%
\ifx#2\@gobble
#4%
\else
#3%
\fi}
\makeatother

View File

@ -2,19 +2,9 @@ module dec
#(m = 32) #(m = 32)
( (
//clock and reset //clock and reset
input logic clk, clrn,
//control slave //control slave
input logic ctl_wr, ctl_rd,
input logic ctl_addr,
input logic [31:0] ctl_wrdata,
output logic [31:0] ctl_rddata,
//memory slave //memory slave
input logic ram_wr,
input logic [3:0] ram_addr,
input logic [31:0] ram_wrdata,
//external ports //external ports
input logic train,
output logic red, yellow, green
); );
typedef enum logic [1:0] {RED, YELLOW, BLINK, GREEN} FSMStates; typedef enum logic [1:0] {RED, YELLOW, BLINK, GREEN} FSMStates;
@ -25,29 +15,6 @@ module dec
logic [31:0] greenSaved; logic [31:0] greenSaved;
logic [31:0] greenCount; logic [31:0] greenCount;
logic [m-1:0] divisor;
logic [1:0] contr;
logic [2:0] colors;
logic [m-1:0] cntdiv;
logic enacnt;
//control slave logic
// ...
//semaphore logic
always_ff @ (posedge clk or negedge clrn) begin
if (!clrn)
cntdiv <= 0;
else begin
if (train | ~run)
cntdiv<=0;
else begin
if (enacnt) cntdiv<=0;
else cntdiv<=cntdiv+1;
end
end
end
// we don't enable counters, if color is green // we don't enable counters, if color is green
always_comb begin always_comb begin
enacnt = ((cntdiv == divisor) && !(colors == 3'b001)); enacnt = ((cntdiv == divisor) && !(colors == 3'b001));
@ -63,6 +30,7 @@ module dec
colors <= 3'b001; colors <= 3'b001;
state <= GREEN; state <= GREEN;
end end
if (train) begin if (train) begin
colors <= 3'b100; colors <= 3'b100;
state <= RED; state <= RED;
@ -79,12 +47,14 @@ module dec
end end
YELLOW: begin YELLOW: begin
colors <= 3'b010; colors <= 3'b010;
if (enacnt) if (enacnt) begin
state <= state + 1'b1; state <= state + 1'b1;
end end
end
BLINK: begin BLINK: begin
if (enacnt) if (enacnt) begin
state <= state + 1'b1; state <= state + 1'b1;
end
if (greenSaved[0] == 0) begin if (greenSaved[0] == 0) begin
colors <= 3'b011; colors <= 3'b011;
end else begin end else begin
@ -96,8 +66,9 @@ module dec
end end
end end
GREEN: begin GREEN: begin
if (enacnt) if (enacnt) begin
state <= state + 1'b1; state <= state + 1'b1;
end
colors <= 3'b001; colors <= 3'b001;
end end
default: colors <= 3'b100; default: colors <= 3'b100;
@ -106,6 +77,7 @@ module dec
end end
end end
assign contr = state; assign contr = state;
assign red = colors[2]; assign red = colors[2];
assign yellow = colors[1]; assign yellow = colors[1];
assign green = colors[0]; assign green = colors[0];

47
src/inc_lut_tb.sv Normal file
View File

@ -0,0 +1,47 @@
`timescale 1 ns/1 ns
module inc_lut_tb();
// Parameters
localparam CLK_PRD = 20;
localparam PHACC_WIDTH = 14;
logic clk, clr_n, wr_n;
logic [7:0] phinc_val, phase, sine;
// Instantiate UUT and connect used ports
phacc phacc(.phinc(phinc_val), .clk(clk), .reset(clr_n), .phase(phase));
defparam phacc.WIDTH = PHACC_WIDTH;
sinelut sinelut_inst (
.address (phase), .clock (clk), .q(sine)
);
// Clock definition
initial begin
clk = 0;
forever #(CLK_PRD/2) clk = ~clk;
end
// Reset and initial values definition
initial begin
clr_n = 0;
#(CLK_PRD*5) clr_n = 1;
end
// Bus write transaction simulation
initial begin
// Wait until system is out of reset
@(posedge clr_n);
phinc_val=(2**(PHACC_WIDTH - 8));
if ((phinc_val <= 255) && (phinc_val != 0)) begin
#(CLK_PRD * 256 * 5) $stop;
end else begin
$display("Error: value of phase increment is out of range! Stopped simulation.");
#1 $stop;
end
end
endmodule

55
src/lut_mod_tb.sv Executable file
View File

@ -0,0 +1,55 @@
`timescale 1 ns/1 ns
module lut_mod_tb();
// Parameters
localparam CLK_PRD = 20;
localparam PHACC_WIDTH = 14;
logic clk, clr_n, wr_n, daco;
logic [7:0] phinc_val, phase, sine;
// Instantiate UUT and connect used ports
phacc phacc (
.phinc(phinc_val), .clk(clk), .reset(clr_n), .phase(phase)
);
defparam phacc.WIDTH = PHACC_WIDTH;
sinelut sinelut_inst (
.address(phase), .clock(clk), .q(sine)
);
sdmod sdmod_inst (
.val(sine), .clk(clk), .reset(clr_n), .daco(daco)
// .val(8'd0), .clk(clk), .reset(clr_n), .daco(daco)
// .val(8'd255), .clk(clk), .reset(clr_n), .daco(daco)
);
// Clock definition
initial begin
clk = 0;
forever #(CLK_PRD/2) clk = ~clk;
end
// Reset and initial values definition
initial begin
clr_n = 0;
#(CLK_PRD*5) clr_n = 1;
end
// Bus write transaction simulation
initial begin
// Wait until system is out of reset
@(posedge clr_n);
phinc_val=(2**(PHACC_WIDTH - 8));
if ((phinc_val <= 255) && (phinc_val != 0)) begin
#(CLK_PRD * 256 * 10) $stop;
end else begin
$display("Error: value of phase increment is out of range! Stopped simulation.");
#1 $stop;
end
end
endmodule

View File

@ -1,3 +1,7 @@
// niosII_tb.v
// Generated using ACDS version 18.1 625
`timescale 1 ps / 1 ps `timescale 1 ps / 1 ps
module niosII_tb ( module niosII_tb (
); );
@ -7,8 +11,7 @@ module niosII_tb (
reg train; reg train;
wire red, yellow, green; wire red, yellow, green;
niosII niosii_inst niosII niosii_inst (
(
.clk_clk (niosii_inst_clk_bfm_clk_clk), // clk.clk .clk_clk (niosii_inst_clk_bfm_clk_clk), // clk.clk
.reset_reset_n (niosii_inst_reset_bfm_reset_reset), // reset.reset_n .reset_reset_n (niosii_inst_reset_bfm_reset_reset), // reset.reset_n
.sem_export_train (train), // sem_export.train .sem_export_train (train), // sem_export.train
@ -17,48 +20,36 @@ module niosII_tb (
.sem_export_green (green) // .green .sem_export_green (green) // .green
); );
altera_avalon_clock_source altera_avalon_clock_source #(
#(
.CLOCK_RATE (50000000), .CLOCK_RATE (50000000),
.CLOCK_UNIT (1) .CLOCK_UNIT (1)
) ) niosii_inst_clk_bfm (
niosii_inst_clk_bfm
(
.clk (niosii_inst_clk_bfm_clk_clk) // clk.clk .clk (niosii_inst_clk_bfm_clk_clk) // clk.clk
); );
altera_avalon_reset_source altera_avalon_reset_source #(
#(
.ASSERT_HIGH_RESET (0), .ASSERT_HIGH_RESET (0),
.INITIAL_RESET_CYCLES (50) .INITIAL_RESET_CYCLES (50)
) ) niosii_inst_reset_bfm (
niosii_inst_reset_bfm
(
.reset (niosii_inst_reset_bfm_reset_reset), // reset.reset_n .reset (niosii_inst_reset_bfm_reset_reset), // reset.reset_n
.clk (niosii_inst_clk_bfm_clk_clk) // clk.clk .clk (niosii_inst_clk_bfm_clk_clk) // clk.clk
); );
initial begin initial begin
train = 0; train = 0;
wait (niosii_inst_reset_bfm_reset_reset); wait (niosii_inst_reset_bfm_reset_reset);
forever begin forever begin
wait ({red,yellow,green}==3'b001);
repeat (29000) @(posedge niosii_inst_clk_bfm_clk_clk); repeat (29000) @(posedge niosii_inst_clk_bfm_clk_clk);
repeat(8) begin
train = 1; train = 1;
repeat (10) @(posedge niosii_inst_clk_bfm_clk_clk); repeat (10) @(posedge niosii_inst_clk_bfm_clk_clk);
train = 0; train = 0;
repeat (900) @(posedge niosii_inst_clk_bfm_clk_clk); wait ({red,yellow,green}==3'b001);
train = 1; repeat (200) @(posedge niosii_inst_clk_bfm_clk_clk);
repeat (10) @(posedge niosii_inst_clk_bfm_clk_clk); end
train = 0;
repeat (900) @(posedge niosii_inst_clk_bfm_clk_clk);
train = 1;
repeat (10) @(posedge niosii_inst_clk_bfm_clk_clk);
train = 0;
repeat (900) @(posedge niosii_inst_clk_bfm_clk_clk);
train = 1;
repeat (10) @(posedge niosii_inst_clk_bfm_clk_clk);
train = 0;
end end
end end
endmodule endmodule

23
src/phacc.sv Normal file
View File

@ -0,0 +1,23 @@
module phacc
#(
parameter unsigned WIDTH = 14
) (
input logic [7:0] phinc,
input clk,
input reset,
output [7:0] phase
);
logic [WIDTH - 1 : 0] sum;
always_ff @(posedge clk, negedge reset) begin
if (~reset) begin
sum <= 0;
end else begin
sum <= sum + phinc;
end
end
assign phase = sum[WIDTH - 1 : WIDTH - 8];
endmodule

23
src/sdmod.sv Executable file
View File

@ -0,0 +1,23 @@
module sdmod (
input signed [7:0] val,
input clk,
input reset,
output daco
);
logic out;
logic signed [7:0] eps;
logic signed [8:0] un;
always_ff @(posedge clk, negedge reset) begin
if (~reset) begin
un <= 9'd0;
end else begin
un <= val - eps;
end
end
assign out = (un >= $signed(9'd0)) ? 1'd1 : 1'd0;
assign eps = (un >= $signed(9'd0)) ? $signed(9'd127) - un : $signed(-9'd128) - un;
assign daco = out;
endmodule

View File

@ -1,4 +1,3 @@
#include <stdio.h>
#include "altera_avalon_sem_regs.h" #include "altera_avalon_sem_regs.h"
#include "alt_types.h" #include "alt_types.h"
#include "system.h" #include "system.h"
@ -21,19 +20,18 @@ int main()
//program divisors //program divisors
p = (alt_u32*) SEM_RAM_SLAVE_BASE; p = (alt_u32*) SEM_RAM_SLAVE_BASE;
for (i = 0; i < TIME_SETS; i++) { for (i = 0; i < TIME_SETS; i++) {
tmp = 0;
for (j = TIME_STATES; j > 0; j--) { for (j = TIME_STATES; j > 0; j--) {
tmp = (tmp << 32) | divisors[i][j - 1]; *p = divisors[i][j - 1];
alt_dcache_flush();
++p;
} }
*p = tmp;
p++;
} }
//since we use pointers (cached data access) to write divisor RAM, //since we use pointers (cached data access) to write divisor RAM,
//and not direct i/o access with IOWR, we need to flush cache //and not direct i/o access with IOWR, we need to flush cache
alt_dcache_flush(); // alt_dcache_flush();
//select timeset and run semafor //select timeset and run semafor
IOWR_ALTERA_AVALON_SEM_DIVSET(SEM_CTL_SLAVE_BASE,0x00); IOWR_ALTERA_AVALON_SEM_DIVSET(SEM_CTL_SLAVE_BASE,0x02);
IOWR_ALTERA_AVALON_SEM_CTL(SEM_CTL_SLAVE_BASE,0x01); IOWR_ALTERA_AVALON_SEM_CTL(SEM_CTL_SLAVE_BASE,0x01);
printf("Ready\n"); printf("Ready\n");

37
src/sigdel.sv Executable file
View File

@ -0,0 +1,37 @@
//top-level module
module sigdel
#(
PHACC_WIDTH = 14
) (
//clock and reset
input logic clk, clr_n,
//control slave
input logic [31:0] wr_data,
input logic wr_n,
output logic fout
);
logic [7:0] phinc_val;
//control slave logic
always_ff @ (posedge clk or negedge clr_n) begin
if (!clr_n) begin
phinc_val[7:0] <= 8'd0;
end else begin
if (!wr_n) begin
phinc_val[7:0] <= wr_data[31:0];
end
end
end
phacc phacc_inst (.phinc(phinc_val), .clk(clk), .reset(clr_n), .phase(phase));
defparam phacc_inst.WIDTH = PHACC_WIDTH;
sinelut sinelut_inst (
.address (phase), .clock (clk), .q(sine)
);
sdmod sdmod_inst (
.val(sine), .clk(clk), .reset(clr_n), .daco(fout)
);
endmodule

76
src/sigdel_tb.sv Executable file
View File

@ -0,0 +1,76 @@
`timescale 1 ns/1 ns
module sigdel_tb();
// Parameters
localparam CLK_PRD = 20;
localparam SAMPLES_PRD = 256;
localparam OVERSAMPLING = 4;
localparam PHACC_WIDTH = 14;
// Wires and variables to connect to UUT (unit under test)
logic clk, clr_n, wr_n;
logic [31:0] wr_data;
logic [31:0] phinc_val;
logic fout;
// Instantiate UUT and connect used ports
sigdel dut(.clk(clk), .clr_n(clr_n), .wr_n(wr_n), .wr_data(wr_data), .fout(fout));
defparam dut.PHACC_WIDTH = PHACC_WIDTH;
// Clock definition
initial begin
clk = 0;
forever #(CLK_PRD/2) clk = ~clk;
end
// Reset and initial values definition
initial begin
clr_n = 0;
wr_n = 1;
wr_data = 'bx;
#(CLK_PRD*5) clr_n = 1;
end
// Bus write transaction simulation
initial begin
// Wait until system is out of reset
@(posedge clr_n);
// Check if phase increment for required accumulator width
// and oversamlpling ratio will fit in 8 bits
phinc_val=(2**(PHACC_WIDTH-8))/OVERSAMPLING;
if ((phinc_val <= 255) && (phinc_val != 0)) begin
// Write phase increment several clock cycles after reset
#(CLK_PRD*3) write_transaction(phinc_val);
// Wait for one sine period (for 14-bit phase accumulator case)
#(CLK_PRD*SAMPLES_PRD*OVERSAMPLING)
#(CLK_PRD*3) write_transaction(phinc_val*5);
#(CLK_PRD*SAMPLES_PRD*OVERSAMPLING)
$stop;
end else begin
//Output simulation error
$display("Error: value of phase increment is out of range! Stopped simulation.");
//Stop simulation (small delay needed for $display to work)
#1 $stop;
end
end
//Single write transaction task
task write_transaction;
//input signals
input [31:0] val;
//transaction implementation
begin
@(posedge clk);
//assert signals for one clock cycle
wr_n = 0;
wr_data = val;
@(posedge clk);
//deassert signals
wr_n = 1;
wr_data = 'bx;
end
endtask
endmodule