Compare commits
5 Commits
4343429f75
...
4ba76dd3c0
Author | SHA1 | Date |
---|---|---|
Ivan I. Ovchinnikov | 4ba76dd3c0 | |
Ivan I. Ovchinnikov | 84277abd9d | |
Ivan I. Ovchinnikov | c6fe1cc19d | |
Ivan I. Ovchinnikov | 760de76d2a | |
Ivan I. Ovchinnikov | 8fc12247b5 |
|
@ -1,8 +1,8 @@
|
|||
\documentclass[a4paper,fontsize=14bp]{article}
|
||||
|
||||
\input{../common-preamble}
|
||||
\input{../fancy-listings-preamble}
|
||||
\input{../bmstu-preamble}
|
||||
\input{settings/common-preamble}
|
||||
\input{settings/fancy-listings-preamble}
|
||||
\input{settings/bmstu-preamble}
|
||||
\setcounter{secnumdepth}{4}
|
||||
\numerationTop
|
||||
|
||||
|
@ -33,10 +33,15 @@ initial begin
|
|||
train = 0;
|
||||
wait (niosii_inst_reset_bfm_reset_reset);
|
||||
forever begin
|
||||
repeat(22528) @(posedge niosii_inst_clk_bfm_clk_clk);
|
||||
train = 1;
|
||||
repeat(10) @(posedge niosii_inst_clk_bfm_clk_clk);
|
||||
train = 0;
|
||||
wait ({red,yellow,green}==3'b001);
|
||||
repeat (29000) @(posedge niosii_inst_clk_bfm_clk_clk);
|
||||
repeat(2) begin
|
||||
train = 1;
|
||||
repeat (10) @(posedge niosii_inst_clk_bfm_clk_clk);
|
||||
train = 0;
|
||||
wait ({red,yellow,green}==3'b001);
|
||||
repeat (200) @(posedge niosii_inst_clk_bfm_clk_clk);
|
||||
end
|
||||
end
|
||||
end
|
||||
\end{lstlisting}
|
||||
|
@ -117,15 +122,53 @@ end
|
|||
\label{pic:timing-sem-after}
|
||||
\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]
|
||||
\centering
|
||||
\includegraphics[width=12cm]{03-fpga-lab-02-individual.png}
|
||||
\begin{subfigure}[b]{0.98\textwidth}
|
||||
\centering
|
||||
\includegraphics[width=\textwidth]{03-fpga-lab-02-individual.png}
|
||||
\caption{Нечётное значение задержки}
|
||||
\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{Диаграмма поведения сигналов после выполнения задания}
|
||||
\label{pic:indi-model}
|
||||
\end{figure}
|
||||
|
||||
|
||||
В процессе работы были модифицированы исходные коды (листинг \hrf{lst:dec}, в листинге приведена только изменённая часть, логика работы семафора) и коды тестов (листинг \hrf{lst:dec-tb}) для компонента семафора, а также тестовый стенд (листинг \hrf{lst:main-top-tb}) и прошивка процессора (листинг \hrf{lst:sem}) итогового проекта.
|
||||
|
||||
\section{Выводы}
|
||||
|
|
|
@ -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}
|
||||
|
||||
|
||||
|
|
@ -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}
|
|
@ -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 |
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 8.8 KiB |
After Width: | Height: | Size: 8.7 KiB |
|
@ -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 |
|
@ -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 |
After Width: | Height: | Size: 34 KiB |
After Width: | Height: | Size: 83 KiB |
After Width: | Height: | Size: 38 KiB |
After Width: | Height: | Size: 40 KiB |
After Width: | Height: | Size: 5.5 KiB |
|
@ -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}
|
||||
Выполнили\\
|
||||
% cтудент группы ИУ3-11М \\
|
||||
% cтудент группы ИУ3-21М \\
|
||||
cтудент группы ИУ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}
|
|
@ -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}{}
|
|
@ -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={<@}{@>}}
|
After Width: | Height: | Size: 169 KiB |
|
@ -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
|
46
src/dec.sv
|
@ -2,19 +2,9 @@ module dec
|
|||
#(m = 32)
|
||||
(
|
||||
//clock and reset
|
||||
input logic clk, clrn,
|
||||
//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
|
||||
input logic ram_wr,
|
||||
input logic [3:0] ram_addr,
|
||||
input logic [31:0] ram_wrdata,
|
||||
//external ports
|
||||
input logic train,
|
||||
output logic red, yellow, green
|
||||
);
|
||||
|
||||
typedef enum logic [1:0] {RED, YELLOW, BLINK, GREEN} FSMStates;
|
||||
|
@ -25,29 +15,6 @@ module dec
|
|||
logic [31:0] greenSaved;
|
||||
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
|
||||
always_comb begin
|
||||
enacnt = ((cntdiv == divisor) && !(colors == 3'b001));
|
||||
|
@ -63,6 +30,7 @@ module dec
|
|||
colors <= 3'b001;
|
||||
state <= GREEN;
|
||||
end
|
||||
|
||||
if (train) begin
|
||||
colors <= 3'b100;
|
||||
state <= RED;
|
||||
|
@ -79,12 +47,14 @@ module dec
|
|||
end
|
||||
YELLOW: begin
|
||||
colors <= 3'b010;
|
||||
if (enacnt)
|
||||
if (enacnt) begin
|
||||
state <= state + 1'b1;
|
||||
end
|
||||
end
|
||||
BLINK: begin
|
||||
if (enacnt)
|
||||
state <= state + 1'b1;
|
||||
if (enacnt) begin
|
||||
state <= state + 1'b1;
|
||||
end
|
||||
if (greenSaved[0] == 0) begin
|
||||
colors <= 3'b011;
|
||||
end else begin
|
||||
|
@ -96,8 +66,9 @@ module dec
|
|||
end
|
||||
end
|
||||
GREEN: begin
|
||||
if (enacnt)
|
||||
if (enacnt) begin
|
||||
state <= state + 1'b1;
|
||||
end
|
||||
colors <= 3'b001;
|
||||
end
|
||||
default: colors <= 3'b100;
|
||||
|
@ -106,6 +77,7 @@ module dec
|
|||
end
|
||||
end
|
||||
assign contr = state;
|
||||
|
||||
assign red = colors[2];
|
||||
assign yellow = colors[1];
|
||||
assign green = colors[0];
|
||||
|
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -1,64 +1,55 @@
|
|||
// niosII_tb.v
|
||||
|
||||
// Generated using ACDS version 18.1 625
|
||||
|
||||
`timescale 1 ps / 1 ps
|
||||
module niosII_tb (
|
||||
);
|
||||
);
|
||||
|
||||
wire niosii_inst_clk_bfm_clk_clk; // niosII_inst_clk_bfm:clk -> [niosII_inst:clk_clk, niosII_inst_reset_bfm:clk]
|
||||
wire niosii_inst_reset_bfm_reset_reset; // niosII_inst_reset_bfm:reset -> niosII_inst:reset_reset_n
|
||||
wire niosii_inst_clk_bfm_clk_clk; // niosII_inst_clk_bfm:clk -> [niosII_inst:clk_clk, niosII_inst_reset_bfm:clk]
|
||||
wire niosii_inst_reset_bfm_reset_reset; // niosII_inst_reset_bfm:reset -> niosII_inst:reset_reset_n
|
||||
reg train;
|
||||
wire red, yellow, green;
|
||||
|
||||
niosII niosii_inst
|
||||
(
|
||||
.clk_clk (niosii_inst_clk_bfm_clk_clk), // clk.clk
|
||||
.reset_reset_n (niosii_inst_reset_bfm_reset_reset), // reset.reset_n
|
||||
.sem_export_train (train), // sem_export.train
|
||||
.sem_export_red (red), // .red
|
||||
.sem_export_yellow (yellow), // .yellow
|
||||
.sem_export_green (green) // .green
|
||||
);
|
||||
niosII niosii_inst (
|
||||
.clk_clk (niosii_inst_clk_bfm_clk_clk), // clk.clk
|
||||
.reset_reset_n (niosii_inst_reset_bfm_reset_reset), // reset.reset_n
|
||||
.sem_export_train (train), // sem_export.train
|
||||
.sem_export_red (red), // .red
|
||||
.sem_export_yellow (yellow), // .yellow
|
||||
.sem_export_green (green) // .green
|
||||
);
|
||||
|
||||
altera_avalon_clock_source
|
||||
#(
|
||||
.CLOCK_RATE (50000000),
|
||||
.CLOCK_UNIT (1)
|
||||
)
|
||||
niosii_inst_clk_bfm
|
||||
(
|
||||
.clk (niosii_inst_clk_bfm_clk_clk) // clk.clk
|
||||
);
|
||||
|
||||
altera_avalon_reset_source
|
||||
#(
|
||||
.ASSERT_HIGH_RESET (0),
|
||||
.INITIAL_RESET_CYCLES (50)
|
||||
)
|
||||
niosii_inst_reset_bfm
|
||||
(
|
||||
.reset (niosii_inst_reset_bfm_reset_reset), // reset.reset_n
|
||||
.clk (niosii_inst_clk_bfm_clk_clk) // clk.clk
|
||||
);
|
||||
altera_avalon_clock_source #(
|
||||
.CLOCK_RATE (50000000),
|
||||
.CLOCK_UNIT (1)
|
||||
) niosii_inst_clk_bfm (
|
||||
.clk (niosii_inst_clk_bfm_clk_clk) // clk.clk
|
||||
);
|
||||
|
||||
altera_avalon_reset_source #(
|
||||
.ASSERT_HIGH_RESET (0),
|
||||
.INITIAL_RESET_CYCLES (50)
|
||||
) niosii_inst_reset_bfm (
|
||||
.reset (niosii_inst_reset_bfm_reset_reset), // reset.reset_n
|
||||
.clk (niosii_inst_clk_bfm_clk_clk) // clk.clk
|
||||
);
|
||||
initial begin
|
||||
train = 0;
|
||||
wait (niosii_inst_reset_bfm_reset_reset);
|
||||
forever begin
|
||||
wait ({red,yellow,green}==3'b001);
|
||||
repeat (29000) @(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;
|
||||
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;
|
||||
repeat(8) begin
|
||||
train = 1;
|
||||
repeat (10) @(posedge niosii_inst_clk_bfm_clk_clk);
|
||||
train = 0;
|
||||
wait ({red,yellow,green}==3'b001);
|
||||
repeat (200) @(posedge niosii_inst_clk_bfm_clk_clk);
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
endmodule
|
||||
|
|
|
@ -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
|
|
@ -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
|
12
src/sem.c
|
@ -1,4 +1,3 @@
|
|||
#include <stdio.h>
|
||||
#include "altera_avalon_sem_regs.h"
|
||||
#include "alt_types.h"
|
||||
#include "system.h"
|
||||
|
@ -21,19 +20,18 @@ int main()
|
|||
//program divisors
|
||||
p = (alt_u32*) SEM_RAM_SLAVE_BASE;
|
||||
for (i = 0; i < TIME_SETS; i++) {
|
||||
tmp = 0;
|
||||
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,
|
||||
//and not direct i/o access with IOWR, we need to flush cache
|
||||
alt_dcache_flush();
|
||||
// alt_dcache_flush();
|
||||
|
||||
//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);
|
||||
|
||||
printf("Ready\n");
|
||||
|
|
|
@ -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
|
|
@ -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
|
||||
|