fpga lab3 lab4 reports wip
This commit is contained in:
parent
4343429f75
commit
8fc12247b5
|
@ -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,65 @@
|
||||||
|
\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{лабораторной}{№ 4}{Проектирование цифрового синтезатора}{Проектирование цифровых устройств на \\ программируемых логических интегральных схемах (ПЛИС)}{}{С.В. Фёдоров}
|
||||||
|
|
||||||
|
\newpage
|
||||||
|
\sloppy
|
||||||
|
\pagestyle{fancy}
|
||||||
|
\section{Цель}
|
||||||
|
Осуществить полный цикл проектирования цифрового устройства на ПЛИС на языке SystemVerilog. Реализовать генератор периодических функций на основе метода прямого цифрового синтеза на микросхеме семейства Cyclone IV E.
|
||||||
|
|
||||||
|
\section{Задачи}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Реализовать модули «Накопителя фазы», «Просмотровой таблицы», «Сигма-Дельта модулятора».
|
||||||
|
\item Реализовать синтезатор, используя разработанные модули.
|
||||||
|
\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{1}
|
||||||
|
\label{pic:1}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\begin{enumerate}
|
||||||
|
\item $x_n = 6, \varepsilon_n = 127$, уровень квантования 127;
|
||||||
|
\item $u_{n + 1} = x_n - \varepsilon_n = 6 – 127 = -121$, при этом $\varepsilon_n = -128-(-121)=-7$, а уровень квантования -128;
|
||||||
|
\item $u_{n + 2} = x_n - \varepsilon_n = 6 – (–7) = 13$, при этом $\varepsilon_n = 127 - 13 = 104$, а уровень квантования 127;
|
||||||
|
\item $u_{n + 3} = x_n - \varepsilon_n = 6 – 104 = -98$, при этом $\varepsilon_n= -128-(-98) = -30$, а уровень квантования -128;
|
||||||
|
\item $u_{n + 4} = x_n - \varepsilon_n = 26 – (–30) = 106$, при этом ξn= 127-106 = 11, а уровень квантования 127 F: Un+1=XN-ξn=26 – 11 = 15, при этом ξn= 127-15 = 112, а уровень квантования 127
|
||||||
|
G: Un+1=XN-ξn=26 – 112 = -86, при этом ξn= -128-(-86) = -42, а уровень квантования -128 H: Un+1=XN-varepsilonn=26 – (–42) = 88, при этом ξn= 127-88 = 39, а уровень квантования 127
|
||||||
|
\end{enumerate}
|
||||||
|
\subsection{Разработка модулей}
|
||||||
|
По шагам из методического материала был создан проект в САПР Quartus Prime (доступен по \href{https://git.iovchinnikov.ru/ivan-igorevich/fpga-lab-2/commits/branch/lab4}{ссылке}).
|
||||||
|
|
||||||
|
\section{Выводы}
|
||||||
|
|
||||||
|
\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,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 |
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue