diff --git a/03-FPGA.tex b/03-FPGA.tex index f3f9382..782d649 100644 --- a/03-FPGA.tex +++ b/03-FPGA.tex @@ -244,27 +244,91 @@ Gated Clock - ТИ, который модифицируется на логик \end{itemize} \item signal race например, когда одним сигналом разрешается и формируется выходной сигнал. \item Asynchronous clock domains. определяет правила передачи данных между разными доменами ТИ. Домен ТИ - это тригеры и связанная с ними комбинационная логика, которая тактируется одним ТИ. - двойной триггер не спасёт. есть вариант реализовать протокол обмена (фронт детектор) + \begin{itemize} + \item двойной триггер не спасёт. есть вариант реализовать протокол обмена (фронт детектор) - СХЕМА 2 у ВИКИ + СХЕМА 2 у ВИКИ - нужно формировать однобитный строб. данные не должны меняться на 3 и 4 фронте. строб и данные меняются как показано на диаграмме, и когда мы их защёлкиваем на 3 или 4 такте, они будут точно неизменные. -\begin{lstlisting}[style=VerilogStyle] - input logic stb; - input logic [7:0] din; - input logic c2; - - logic[2:0] stb_z; - logic ena; + нужно формировать однобитный строб. данные не должны меняться на 3 и 4 фронте. строб и данные меняются как показано на диаграмме, и когда мы их защёлкиваем на 3 или 4 такте, они будут точно неизменные. + \begin{lstlisting}[style=VerilogStyle] + input logic stb; + input logic [7:0] din; + input logic c2; + + logic[2:0] stb_z; + logic ena; - always_ff @(posedge c2) stb_z < {stb_z[1:0], stb}; - assign ena = ~stb_z[2] & stb_z[1]; - always_ff @(posedge c2) if (ena) dreg < din; + always_ff @(posedge c2) stb_z < {stb_z[1:0], stb}; + assign ena = ~stb_z[2] & stb_z[1]; + always_ff @(posedge c2) if (ena) dreg < din; + \end{lstlisting} + \item Если синхронны - правильно формировать ena для защёлкивания на более высокой частоте и задать настройки multicycle. Если асинхронны - передача по стробу. Недостаток в том, что приёмная сторона всегда должна быть готова принимать данные и не имеет права пропускать строб. Значит в обратную сторону должен быть сигнал, говорящий о неготовности приёмника (или обмен с квитированием -- устанавливается запрос в одну сторону, в ответ выставляется подтверждение, когда система видит подтверждение -- снимается запрос, после снятия запроса снимается подтверждение). Фактически обмен вспомогательными сигналами задерживает обмен на 6 тактов с каждой стороны. +\begin{figure}[H] + \centering +% \includesvg[scale=1.01]{pics/03-fpga-00-quitir.svg} + \caption{Обмен с квитированием} + \label{pic:quitir} +\end{figure} + +\item Обмен с использованием буфера FIFO. Удобно, когда нужно читать только одно значение. как выход из ситуации возможно использовать (более сложные схемы будут иметь блок управления, управление будет осуществляться каким-то одним клоковым доменом, синхронизируемся двумя триггерами) В обоих случаях нужно будет информаировать о переключении буферов: + \begin{enumerate} + \item схема ping-pong (управление старшим битом адреса логикой управления через инвертор (области памяти разбиваются на две области)) неудобство в том, что фактически становится невозможно одновременно читать и писать -\end{lstlisting} +СХЕМА у меня в телефоне + + \item FIFO буферов. тоже самое, только логика управления манипулирует не одним старшим битом, а несколькими. они не выставляются как инверсия, а следуют иной логике (память разбивается на 4 области). В каждый момент времени мы работаем только с двумя буферами, а остальные простаивают. + \end{enumerate} +\end{itemize} + +Логика с квитированием хороша когда небольшие редкие передачи или малые частоты (для обращения к регистрам периферийных модулей). фифо нужна когда происходит работа, например, бёрстами с ПДП. в платформ дизайнере есть interconnect requirements, где можно указать какого типа будет синхронизация. Avalon-MM clock crossing bridge определяет глубину ФИФо, размер пакетной передачи, и другие настройки. Глубина буфера команд должна быть равна или больше размера пакета передачи. +\end{enumerate} +\section{Конфигурация и программирование ПЛИС} +Термин программирование обычно используется для энергонезависимых ПЛИС и ПЗУ. К статическому ОЗУ (cyclone, stratix, arria...) применяют термин конфигурирование. + +MSEL - режим конфигурации ПЛИС при включении питания. + +Режимы: +\begin{enumerate} +\item JTAG + \begin{enumerate} + \item отладочный кабель (usb-blaster) \lh{dkgreen}{V} + \item МК \lh{golden}{?} + \end{enumerate} + \begin{itemize} + \item Работа с Nios/ARM + \item встроенный логический анализатор SignalTap + \item In-System Sources and Probes (возможно завести в проект внешние сигналы) + \item In-system memory editor + \item отладка интерфейсов внешней памяти (DDRxSDRAM) + \item отладка высокоскоростных интерфейсов (мультигигабитных) + \end{itemize} +\item Active + \begin{enumerate} + \item Parallel \lh{red}{X} + \item Serial \lh{dkgreen}{V} (SPI x1, x4). Но как именно нужно программировать память? + \end{enumerate} + \begin{itemize} + \item \lh{red}{X} Программатор может работать в режиме ActiveSerial. он не нужен так как у нас всё равно почти всегда есть разъём JTAG. + \item \lh{dkgreen}{V} JTAG генерирует файл .jic, который используется FlashLoader для передачи файла .sof через ПЛИС в память. jic-файл создаётся через Convert Programming files. + \end{itemize} +\item Passive (в зависимости от размера ПЛИС и новизны) + \begin{enumerate} + \item Parallel + \item Serial + \end{enumerate} + \begin{itemize} + \item USB-Blaster \lh{red}{X} + \item МК/Процессор/ПЛИС \lh{dkgreen}{V} Любое устройство, которое сможет сформировать нужную временную диаграмму + \begin{tikztimingtable} + nconfig & HLLHHHHHHHHHHHH\\ + nstatus & HHLLHHHHHHHHHHH\\ + confdone & HHLLLLLLLLLLLLH\\ + dclk & LLLLLCCCCCCCCCC\\ + data & UUUU2D{0}2D{1}2D{2}2D{...}2D{N}U\\ + \end{tikztimingtable} + \end{itemize} + И в активном и в пассивном режиме можно прошивать сжатой прошивкой. \end{enumerate} -1. расширить разрядность памяти хранения до 32 бит и на запись и на чтение, чтобы на лампочках было видно. -2. добавить регистр (помимо ктл и дивайдер) если там 0 то пусть работает как работало, а если 1, подключается режим моргающего жёлтого с длительностью которая берётся из грин ((грин+1)-0-(грин-1)-0) \newpage \appendix \setcounter{secnumdepth}{2} diff --git a/03-fpga-lab-02-report.tex b/03-fpga-lab-02-report.tex index 75c5a40..19fe469 100644 --- a/03-fpga-lab-02-report.tex +++ b/03-fpga-lab-02-report.tex @@ -10,10 +10,8 @@ \thispagestyle{empty} \makeBMSTUHeader -\makeReportTitle{лабораторной}{1}{Моделирование компонент систем на кристалле}{Проектирование цифровых устройств на \\ программируемых логических интегральных схемах (ПЛИС)}{}{С.В. Фёдоров} -\newpage -\thispagestyle{empty} -\tableofcontents +\makeReportTitle{лабораторной}{2}{Моделирование компонент систем на кристалле}{Проектирование цифровых устройств на \\ программируемых логических интегральных схемах (ПЛИС)}{}{С.В. Фёдоров} + \newpage \pagestyle{fancy} \section{Цель} @@ -62,19 +60,91 @@ end yellow & 5L 5H 5L 5H 5L 5H \\ \end{tikztimingtable} \end{enumerate} + +Исходный код семафора из материалов методического пособия создавал семафор, работающий согласно временн\'{о}й диаграммы, представленной на рисунке \hrf{pic:timing-sem-before}. Из диаграммы очевидно, что при инициализации семафор загорается красным, а значит ни один поезд через него не сможет проехать никогда. Поскольку в схеме существуют комбинационные зависимости (указаны на рисунке синими стрелками), возможно регистровую логику переделать под конечный автомат, оставив комбинационную логику «как есть». В правой части видно, что в период горения зелёного цвета в семафор приходит сигнал смены строки памяти RAM, то есть переход к следующему пакету временн\'{ы}х диапазонов горения цветов семафора. + +\begin{figure}[H] + \centering +\begin{tikztimingtable} + clk & 6{C} ;[dotted] 4{C}; 7{C} ;[dotted] 11{C} c;\\ + clrn & h cLc 4{H} ;[dotted] 21Hh h;\\ + train & 4{L}l cH;[dotted] Hhc 20{L} l;\\ + countdiv & u 9d{0} D{};[dotted]2{D{}}; 3D{divider} D{0} 5{D{}};[dotted] 11D d{};\\ + enacnt & x 11{l} ;[dotted] 8{l};L H 9{l} ;[dotted] 12L; \\ + contr & u 11d ;[dotted] 8d; 3d{0} N(B1) 10d{1} ;[dotted] 12D{};\\ + colors & u 8d{100} 3d ;[dotted] 8d; 2d{100} N(A1) 11d{010} ;[dotted] 12D{};\\ + divisor & u 11d ;[dotted] 8d; 4d{red} N(C1) 9d{yellow};[dotted] 8D{yellow and green};4D{green}\\ + ram\_wr & x 25L CC L \\ +\extracode +\tableheader{Сигнал}{Значения}\tablerules +\draw[blue,->,thin](A1)to[out=0,in=180](B1); +\draw[blue,->,thin](B1)to[out=0,in=180](C1); +\begin{background}[gray, semitransparent, semithick] + \vertlines{0.5, 4.5, 5, 11, 12, 24.5, 25.5} +\end{background} +\end{tikztimingtable} + \caption{Примерная временн\'{а}я диаграмма работы семафора} + \label{pic:timing-sem-before} +\end{figure} + +Также индивидуальное задание предполагает мигание жёлтого цвета с периодичностью, указанной в памяти семафора о адресу «зелёного» цвета (то есть следующего за режимом «мигающего жёлтого»), следовательно, значение зелёного необходимо сохранить заранее, перед включением красного, но после изменения строки памяти (судя по тестовому стенду, строб смены строки памяти формируется в модуле через 10 тактовых импульсов после начала периода зелёного света). Значение задержки зелёного необходимо сохранить примерно в момент, указанный на обновлённой диаграмме синей линией. Временная диаграмма для решения поставленной задачи представлена на рисунке \hrf{pic:timing-sem-after}. + +\begin{figure}[H] + \centering + \noindent + \begin{tikztimingtable} + clk & 6{C} ;[dotted] 4{C}; 7{C} ;[dotted] 11{C} c;\\ + clrn & h cLc 4{H} ;[dotted] 21Hh h;\\ + train & 4{L}l cH;[dotted] Hhc 20{L} l;\\ + countdiv & u 9d{0} D{};[dotted]2{D{}}; 3D{divider} D{0} 5{D{}};[dotted] 11D d{};\\ + enacnt & x 11{l} ;[dotted] 8{l};L H 9{l} ;[dotted] 12L; \\ + contr & u 8d{3} 3d;[dotted] 8d; 3d{0} N(B1) 10d{1} ;[dotted] 12D{};\\ + colors & u 8d{001} 3d ;[dotted] 8d; 2d{100} N(A1) 11d{010} ;[dotted] 12D{};\\ + divisor & u 8d{green} 3d ;[dotted] 8d; 4d{red} N(C1) 9d{yellow};[dotted] 8D{blinking yellow};4D{green}\\ + ram\_wr & x 25L CC L \\ + \extracode + \tableheader{Signal}{Values}\tablerules + \draw[blue,->,thin](A1)to[out=0,in=180](B1); + \draw[blue,->,thin](B1)to[out=0,in=180](C1); + \begin{background}[gray, semitransparent, semithick] + \vertlines{0.5, 4.5, 5, 11, 12, 24.5, 25.5} + \end{background} + \begin{scope}[blue] + \vertlines{3} + \end{scope} + \end{tikztimingtable} + \caption{Обновлённая временн\'{а}я диаграмма работы семафора} + \label{pic:timing-sem-after} +\end{figure} + +В компонент семафора была добавлена возможность изменения поведения без перекомпиляции компонента. Поведение с «мигающим жёлтым» активируется нечётным значением задержки из файла \code{sem.c} процессора niosII. Поведение красного жёлтого, и зелёного сигналов в режиме «мигающего жёлтого» представлено на рисунке \hrf{pic:indi-model}. + +\begin{figure}[H] + \centering + \includegraphics[width=12cm]{03-fpga-lab-02-individual.png} + \caption{Диаграмма поведения сигналов после выполнения задания} + \label{pic:indi-model} +\end{figure} + +В процессе работы были модифицированы исходные коды (листинг \hrf{lst:dec}, в листинге приведена только изменённая часть, логика работы семафора) и коды тестов (листинг \hrf{lst:dec-tb}) для компонента семафора, а также тестовый стенд (листинг \hrf{lst:main-top-tb}) и прошивка процессора (листинг \hrf{lst:sem}) итогового проекта. + \section{Выводы} +Подключение в систему собственного компонента, совместимого с шиной Avalon-MM является достаточно простой задачей, в которой одну из важнейших ролей играет понимание окружения. Компоненты желательно проектировать максимально гибкими и отлаживать на отдельных стендах, как это было сделано в данной лабораторной работе, поскольку интеграция обновлений компонента в целевую систему является достаточно долгим процессом, в котором легко ошибиться (обновление компонента, обновление системы, обновление пакета поддержки платы, перекомпиляции на всех этапах). \newpage \appendix \setcounter{secnumdepth}{4} \section{Приложения} -\renewcommand{\thesubsection}{\Asbuk{subsection}} - \subsection{Исходные коды проекта} \label{appendix:src} +\lstinputlisting[language=Verilog,style=VerilogStyle,caption={Семафор},label={lst:dec}]{src/dec.sv} +\lstinputlisting[language=Verilog,style=VerilogStyle,caption={Тестовый стенд семафора},label={lst:dec-tb}]{src/dec_tb.sv} +\lstinputlisting[language=Verilog,style=VerilogStyle,caption={Тестовый стенд основного проекта},label={lst:main-top-tb}]{src/niosII_tb.v} + +\lstinputlisting[language=C,style=CCodeStyle,caption={\code{sem.c}},label={lst:sem}]{src/sem.c} \end{document} diff --git a/03-mmt-lab-04-report.tex b/03-mmt-lab-04-report.tex index 361122d..ab02d9d 100644 --- a/03-mmt-lab-04-report.tex +++ b/03-mmt-lab-04-report.tex @@ -11,7 +11,7 @@ \thispagestyle{empty} \makeBMSTUHeader -\makeReportTitle{лабораторной}{3}{Разработка мультимедийного приложения}{Мультимедиа технологии}{}{Д.А. Видьманов} +\makeReportTitle{лабораторной}{4}{Разработка мультимедийного веб-приложения}{Мультимедиа технологии}{}{Д.А. Видьманов} \newpage \thispagestyle{empty} \tableofcontents @@ -35,7 +35,7 @@ \begin{figure}[H] \centering - \includegraphics[width=12cm]{03-mmt-lab-04-hierarchy.png} + \includegraphics[width=100mm]{03-mmt-lab-04-hierarchy.png} \caption{Иерархия проекта} \label{pic:hierarchy} \end{figure} diff --git a/03-wtis-lab-01-report.tex b/03-wtis-lab-01-report.tex index b85ed80..536324b 100644 --- a/03-wtis-lab-01-report.tex +++ b/03-wtis-lab-01-report.tex @@ -93,6 +93,109 @@ Поскольку $G=\frac{N_{TX}}{T_s}*\tau$, где $\tau=\frac{8*L_{phy}}{R}$, а $L_{phy} = L_{app} + 63$, то $T_s= \frac{N_{TX}\tau}{G}$. Для $G = 0,05; T_s \approx 361,6$ мсек, а для $G = 1; T_s \approx 18,08$ мсек. Для моделирования был выбран диапазон $T_s = [10; 400]$ мсек с шагом 20. +Настройки моделируемой системы для индивидуального задания приведены в приложении \hrf{app:inifile}. + +Результаты моделирования по заданиям 2 и 3 представлены на рисунках \hrf{pic:collision-probability}, \hrf{pic:packet-delay}, \hrf{pic:packet-throughput}. + +\begin{figure}[H] + \begin{subfigure}[b]{0.49\textwidth} + \centering + \includegraphics[width=\textwidth]{pics/03-wtis-Lab-1-50-CollisionProbability.pdf} + \caption{Вероятность коллизии с $L_{app} = 50, R = 1,5Mbps$} + \label{pic:collision-probability50} + \end{subfigure} + \hfill + \begin{subfigure}[b]{0.49\textwidth} + \includegraphics[width=\textwidth]{pics/03-wtis-Lab-1-100-CollisionProbability.pdf} + \caption{Вероятность коллизии с $L_{app} = 100, R = 3Mbps$} + \label{pic:collision-probability100} + \end{subfigure} + \caption{Вероятность коллизии} + \label{pic:collision-probability} +\end{figure} + +\begin{figure}[H] + \begin{subfigure}[b]{0.49\textwidth} + \centering + \includegraphics[width=\textwidth]{pics/03-wtis-Lab-1-50-Delay.pdf} + \caption{Задержка пакета с $L_{app} = 50, R = 1,5Mbps$} + \label{pic:packet-delay50} + \end{subfigure} + \hfill + \begin{subfigure}[b]{0.49\textwidth} + \includegraphics[width=\textwidth]{pics/03-wtis-Lab-1-100-Delay.pdf} + \caption{Задержка передачи с $L_{app} = 100, R = 3Mbps$} + \label{pic:packet-delay100} + \end{subfigure} + \caption{Задержка передачи пакета} + \label{pic:packet-delay} +\end{figure} + +\begin{figure}[H] + \begin{subfigure}[b]{0.49\textwidth} + \centering + \includegraphics[width=\textwidth]{pics/03-wtis-Lab-1-50-Throughput.pdf} + \caption{Пропускная способность сети с $L_{app} = 50, R = 1,5Mbps$} + \label{pic:packet-throughput50} + \end{subfigure} + \hfill + \begin{subfigure}[b]{0.49\textwidth} + \includegraphics[width=\textwidth]{pics/03-wtis-Lab-1-100-Throughput.pdf} + \caption{Пропускная способность сети с $L_{app} = 100, R = 3Mbps$} + \label{pic:packet-throughput100} + \end{subfigure} + \caption{Пропускная способность сети} + \label{pic:packet-throughput} +\end{figure} + +С помощью имитационного моделирования и аналитических расчетов решите следующую задачу: +\begin{itemize} +\item Беспроводная система с топологией «звезда» состоит из $N_{TX}$ устройств, которые в случайные моменты времени передают пакеты данных одной базовой станции. При этом условия распространения радиосигналов таковы, что все устройства находятся в радиусе связи друг друга, т.е. находятся в одном домене коллизий. +\item Объем полезной нагрузки (размер пакета на прикладном уровне) каждого из пакетов является случайной величиной, равномерно распределенной в диапазоне от 1 до $kL_{app}$ байт. +\item Определите диапазон средней интенсивности трафика $\lambda$ (пакетов/с) каждого из устройств, при котором вероятность успешного приема пакетов базовой станцией будет не менее 90\%. Рассмотрите использование протоколов Aloha и CSMA, не учитывая затухание радиосигналов и воздействие шумов или помех. +\end{itemize} + +В связи с невозможностью проведения теоретических расчётов с использованием распределения, оно было заменено на математическое ожидание, вычисленное по формуле + +\[ \frac{\max(L)^2}{(2 * (\max(L) - \min(L)))} - \frac{\min(L)^2}{(2 * (\max(L) - \min(L)))}. \] + +Из-за значительного изменения длины пакетов изменятся параметры $\lambda$ и $\tau$, поэтому, для моделирования системы необходимо изменить время моделирования. Для Aloha $G \leq 0,052, \tau = \frac{L}{R}, \lambda\tau = G, \lambda = 11,9; T_s = 357\text{мсек}$, Для CSMA $G \leq 0,35, \lambda\tau = G, \lambda = 80,71, T_s \approx 2421\text{мсек}$. Моделирование было проведено с 10 до 2500мс. + +Результат моделирования представлен на рисунках \hrf{pic:indi-collision}, \hrf{pic:indi-delay}, \hrf{pic:indi-throughput}. +\begin{figure}[H] + \centering + \includegraphics[width=12cm]{03-wtis-Lab-1-unif-CollisionProbability.pdf} + \caption{Вероятность коллизии} + \label{pic:indi-collision} +\end{figure} + +\begin{figure}[H] + \centering + \includegraphics[width=12cm]{03-wtis-Lab-1-unif-Delay.pdf} + \caption{Задержка передачи пакета} + \label{pic:indi-delay} +\end{figure} + +\begin{figure}[H] + \centering + \includegraphics[width=12cm]{03-wtis-Lab-1-unif-Throughput.pdf} + \caption{Пропускная способность сети} + \label{pic:indi-throughput} +\end{figure} + +Для поддержания уровня успешного приёма пакетов на уровне не менее 90\% с применением протокола Aloha интенсивность трафика не должна превышать $\lambda \leq 11,9$, с применением протокола 1-настойчивый CSMA $\lambda \leq 80,71$. + \section{Выводы} +В исходной имитационной модели системы были заменены количество передатчиков $N_{TX}$, размер пакета $L_{app}$ и скорость передачи данных $R$ в соответствии с индивидуальным вариантом, проведён имитационный эксперимент с модифицированной моделью системы для исследования пропускной способности и вероятности коллизий. Построить графики, произведено сравнение теоретических значений с результатами моделирования, полученные значения корректны. + +В результате выполнения работы были закреплены навыки работы с системой имитационного моделирования OMNeT++, построены имитационные модели беспроводной системы сбора данных и исследование ее характеристик при множественном доступе к среде, передачи данных в условиях наличия коллизий. + +\newpage +\appendix +\setcounter{secnumdepth}{0} +\renewcommand{\thesubsection}{\Asbuk{subsection}} +\section{Файл настроек по заданию\code{omnetpp.ini}} +\label{app:inifile} +\lstinputlisting[style=JCodeStyle]{src/lab1-omnetpp.ini} \end{document} diff --git a/03-wtis-lab-02-report.tex b/03-wtis-lab-02-report.tex new file mode 100644 index 0000000..dc29404 --- /dev/null +++ b/03-wtis-lab-02-report.tex @@ -0,0 +1,255 @@ +\documentclass[a4paper]{article} + +\input{../common-preamble} +\input{../bmstu-preamble} +\input{../fancy-listings-preamble} + +\numerationTop + +\begin{document} +\fontsize{14pt}{14pt}\selectfont % Вполне очевидно, что мы хотим 14й шрифт, все его хотят +\thispagestyle{empty} +\makeBMSTUHeader + +\makeReportTitle{лабораторной}{2}{Исследование беспроводной системы передачи информации при +ненадежных каналах связи}{Беспроводные технологии в информационных системах}{}{C.С. Баскаков} +\newpage +\thispagestyle{empty} +\tableofcontents +\newpage +\pagestyle{fancy} +\sloppy +\section{Цель} +Закрепление навыков работы с системой имитационного моделирования OMNeT++, построение имитационной модели беспроводной системы сбора данных и исследование ее характеристик при наличии потерь пакетов в условиях ненадежных каналов связи. + +\section{Задачи} +\begin{enumerate} +\item Рассмотреть беспроводную систему с заданными параметрами; +\item В соответствии с индивидуальным вариантом из таблицы 3 вычислите требуемые значения параметров; +\item Внести все необходимые изменения в конфигурационный файл; +\item Выполнить моделирование и анализ модифицированной имитационной модели системы. На основе проведенного исследования сформулировать выводы. +\end{enumerate} + +Отчёт должен включать +\begin{itemize} +\item расчеты параметров модифицированной системы согласно индивидуальному варианту; +\item описание модифицированной имитационной модели в виде «omnetpp.ini» файла; +\item результаты моделирования в виде обработанных графиков; +\item выводы. +\end{itemize} +\newpage +\section{Выполнение работы} +\subsection{Повторение моделирования} +В результате моделирования системы с исходными параметрами из методического материала были получены графики полностью совпадающие с графиками из методического материала, что говорит о полной повторяемости эксперимента. Графики приведены на рис. \hrf{pic:rpt-queue}, \hrf{pic:rpt-аrrival}, \hrf{pic:rpt-delay}, \hrf{pic:rpt-energy}. +\begin{figure}[H] + \centering \begin{subfigure}[b]{0.32\textwidth} + \centering \includegraphics[width=\textwidth]{03-wtis-Lab-2-noack-Queue.pdf} + \caption{No Ack} \end{subfigure} + \hfill \begin{subfigure}[b]{0.32\textwidth} + \centering \includegraphics[width=\textwidth]{03-wtis-Lab-2-ack-5-Queue.pdf} + \caption{With Ack R=5} \end{subfigure} + \hfill \begin{subfigure}[b]{0.32\textwidth} + \centering \includegraphics[width=\textwidth]{03-wtis-Lab-2-ack-20-Queue.pdf} + \caption{With Ack R=20} \end{subfigure} + \caption{Уровень наполнения очереди} \label{pic:rpt-queue} +\end{figure} + +\begin{figure}[H] + \centering \begin{subfigure}[b]{0.32\textwidth} + \centering \includegraphics[width=\textwidth]{03-wtis-Lab-2-noack-ArrivalRate.pdf} + \caption{No Ack} \end{subfigure} + \hfill \begin{subfigure}[b]{0.32\textwidth} + \centering \includegraphics[width=\textwidth]{03-wtis-Lab-2-ack-5-ArrivalRate.pdf} + \caption{With Ack R=5} \end{subfigure} + \hfill \begin{subfigure}[b]{0.32\textwidth} + \centering \includegraphics[width=\textwidth]{03-wtis-Lab-2-ack-20-ArrivalRate.pdf} + \caption{With Ack R=20} \end{subfigure} + \caption{Интентивность передачи пакетов} \label{pic:rpt-аrrival} +\end{figure} + +\begin{figure}[H] + \centering \begin{subfigure}[b]{0.32\textwidth} + \centering \includegraphics[width=\textwidth]{03-wtis-Lab-2-noack-Delay.pdf} + \caption{No Ack} \end{subfigure} + \hfill \begin{subfigure}[b]{0.32\textwidth} + \centering \includegraphics[width=\textwidth]{03-wtis-Lab-2-ack-5-Delay.pdf} + \caption{With Ack R=5} \end{subfigure} + \hfill \begin{subfigure}[b]{0.32\textwidth} + \centering \includegraphics[width=\textwidth]{03-wtis-Lab-2-ack-20-Delay.pdf} + \caption{With Ack R=20} \end{subfigure} + \caption{Задержка передачи пакета} \label{pic:rpt-delay} +\end{figure} + +\begin{figure}[H] + \centering \begin{subfigure}[b]{0.32\textwidth} + \centering \includegraphics[width=\textwidth]{03-wtis-Lab-2-noack-Energy.pdf} + \caption{No Ack} \end{subfigure} + \hfill \begin{subfigure}[b]{0.32\textwidth} + \centering \includegraphics[width=\textwidth]{03-wtis-Lab-2-ack-5-Energy.pdf} + \caption{With Ack R=5} \end{subfigure} + \hfill \begin{subfigure}[b]{0.32\textwidth} + \centering \includegraphics[width=\textwidth]{03-wtis-Lab-2-ack-20-Energy.pdf} + \caption{With Ack R=20} \end{subfigure} + \caption{Затраты энергии передатчика} \label{pic:rpt-energy} +\end{figure} + +\subsection{Индивидуальное задание} +В индивидуальном задании применялись следующие параметры моделирования: +\begin{table}[h!] + \centering + \begin{tabular}{|c|c|c|c|c|c|c|c|} + \hline + $L_{app}$ байт & $T_s$ мс & $P_t$ мВт & $f_c$ МГц & $R$ кбит/с & $W$ кГц & $P_n$ дБм & $V$ м/с \\ [0.5ex] + \hline + 1000 & 25 & 90 & 3000 & 1500 & 300 & -69 & 2 \\ + \hline + \end{tabular} +\end{table} +Для выполнения индивидуального задания необходимо осуществить перевод мВт в дБ по формуле: +\[10\lg_{10}(mW) = 10 \cdot \lg(90) = 19,54\text{dB}\] + +\begin{figure}[H] + \centering + \includegraphics[width=8cm]{03-wtis-Lab-2-ind-error.pdf} + \caption{Вероятность успешного приёма пакета, $\Psi$} +\end{figure} + +В качестве начального расстояния было взято значение 10м (по графику вероятности успешного приёма очевидно, что на этом расстоянии связь устойчива, без ошибок), а для конечного 160м (также видно, что вероятность успешного приёма пакета на этом расстоянии однозначно равна нулю). Подсчёт радиуса окружности движения передатчика, а также расстояния между передатчиком и приёмником осуществляется по формулам +\[ d_0 = 10\text{м}; r = \frac{160 - d_0}{2} = 75\text{м}\] + +Координаты центра окружности по которой будет перемещаться приёмник. +\[ c_x = 100 + d_0 + r = 185\text{м}\] + +Время симуляции вычисляется по формуле и округляется в б\'{о}льшую сторону так, чтобы передатчик не только полностью завершил обход окружности, но и немного зашёл «на второй круг». +\[t_{sim} \geq \frac{2\pi r}{V} = 235,6 \approx 250, \text{сек} \] + +Размер временн\'{о}го интервала для передачи пакетов также округляется до целого числа в б\'{о}льшую сторону. +\[ T_{slot} = 20Tb = \frac{20}{R} = 13,3 \approx 14 \text{мкс}\] + +В симуляции также был заменён пороговый уровень ($P_{ED}$ = -64 дБм), поскольку он должен быть хотя бы на 5 дБм больше, чем $P_n$. + +\begin{figure}[H] + \centering + \includegraphics[width=80mm]{03-wtis-Lab-2-ind-r=5-Prx.pdf} + \caption{Мощность принятого сигнала} +\end{figure} + +Система с заданными параметрами моделировалась для очереди с бесконечным размером и размером 5 пакетов. Результаты моделирования представлены на графиках рис. + +\begin{figure}[H] + \centering \hfill \begin{subfigure}[b]{0.32\textwidth} + \centering \includegraphics[width=\textwidth]{03-wtis-Lab-2-ind-q-1-r5-Queue.pdf} + \caption{Retries = 5} \end{subfigure} + \hfill \begin{subfigure}[b]{0.32\textwidth} + \centering \includegraphics[width=\textwidth]{03-wtis-Lab-2-ind-q-1-r20-Queue.pdf} + \caption{Retries = 20} \end{subfigure} \hfill + \caption{Уровень наполнения очереди, бесконечная очередь} \label{pic:ind-queue-qi} +\end{figure} + +\begin{figure}[H] + \centering \hfill \begin{subfigure}[b]{0.32\textwidth} + \centering \includegraphics[width=\textwidth]{03-wtis-Lab-2-ind-q5-r5-Queue.pdf} + \caption{Retries = 5} \end{subfigure} + \hfill \begin{subfigure}[b]{0.32\textwidth} + \centering \includegraphics[width=\textwidth]{03-wtis-Lab-2-ind-q5-r20-Queue.pdf} + \caption{Retries = 20} \end{subfigure} \hfill + \caption{Уровень наполнения очереди, очередь из 5 пакетов} \label{pic:ind-queue-q5} +\end{figure} + +\begin{figure}[H] + \centering \hfill \begin{subfigure}[b]{0.32\textwidth} + \centering \includegraphics[width=\textwidth]{03-wtis-Lab-2-ind-q-1-r5-ArrivalRate.pdf} + \caption{Retries = 5} \end{subfigure} + \hfill \begin{subfigure}[b]{0.32\textwidth} + \centering \includegraphics[width=\textwidth]{03-wtis-Lab-2-ind-q-1-r20-ArrivalRate.pdf} + \caption{Retries = 20} \end{subfigure} \hfill + \caption{Интентивность передачи пакетов, бесконечная очередь} \label{pic:ind-arrival-qi} +\end{figure} + +\begin{figure}[H] + \centering \hfill \begin{subfigure}[b]{0.32\textwidth} + \centering \includegraphics[width=\textwidth]{03-wtis-Lab-2-ind-q5-r5-ArrivalRate.pdf} + \caption{Retries = 5} \end{subfigure} + \hfill \begin{subfigure}[b]{0.32\textwidth} + \centering \includegraphics[width=\textwidth]{03-wtis-Lab-2-ind-q5-r20-ArrivalRate.pdf} + \caption{Retries = 20} \end{subfigure} \hfill + \caption{Интентивность передачи пакетов, очередь из 5 пакетов} \label{pic:ind-arrival-q5} +\end{figure} + +\begin{figure}[H] + \centering \hfill \begin{subfigure}[b]{0.32\textwidth} + \centering \includegraphics[width=\textwidth]{03-wtis-Lab-2-ind-q-1-r5-Delay.pdf} + \caption{Retries = 5} \end{subfigure} + \hfill \begin{subfigure}[b]{0.32\textwidth} + \centering \includegraphics[width=\textwidth]{03-wtis-Lab-2-ind-q-1-r20-Delay.pdf} + \caption{Retries = 20} \end{subfigure} \hfill + \caption{Задержка передачи пакета, бесконечная очередь} \label{pic:ind-delay-qi} +\end{figure} + +\begin{figure}[H] + \centering \hfill \begin{subfigure}[b]{0.32\textwidth} + \centering \includegraphics[width=\textwidth]{03-wtis-Lab-2-ind-q5-r5-Delay.pdf} + \caption{Retries = 5} \end{subfigure} + \hfill \begin{subfigure}[b]{0.32\textwidth} + \centering \includegraphics[width=\textwidth]{03-wtis-Lab-2-ind-q5-r20-Delay.pdf} + \caption{Retries = 20} \end{subfigure} \hfill + \caption{Задержка передачи пакета, очередь из 5 пакетов} \label{pic:ind-delay-q5} +\end{figure} + +\begin{figure}[H] + \centering \hfill \begin{subfigure}[b]{0.32\textwidth} + \centering \includegraphics[width=\textwidth]{03-wtis-Lab-2-ind-q-1-r5-Energy.pdf} + \caption{Retries = 5} \end{subfigure} + \hfill \begin{subfigure}[b]{0.32\textwidth} + \centering \includegraphics[width=\textwidth]{03-wtis-Lab-2-ind-q-1-r20-Energy.pdf} + \caption{Retries = 20} \end{subfigure} \hfill + \caption{Затраты энергии передатчика, бесконечная очередь} \label{pic:ind-energy-qi} +\end{figure} + +\begin{figure}[H] + \centering \hfill \begin{subfigure}[b]{0.32\textwidth} + \centering \includegraphics[width=\textwidth]{03-wtis-Lab-2-ind-q5-r5-Energy.pdf} + \caption{Retries = 5} \end{subfigure} + \hfill \begin{subfigure}[b]{0.32\textwidth} + \centering \includegraphics[width=\textwidth]{03-wtis-Lab-2-ind-q5-r20-Energy.pdf} + \caption{Retries = 20} \end{subfigure} \hfill + \caption{Затраты энергии передатчика, очередь из 5 пакетов} \label{pic:ind-energy-q5} +\end{figure} + +По результатам моделирования возможно составить сравнительную таблицу. +\begin{table}[H] + \centering + \begin{tabular}{|c|p{40mm}|p{40mm}|p{40mm}|} + \hline + Конфигурация & Число успешно полученных пакетов & Число полученных пакетов с ошибками & Затраты энергии передатчика (Дж) \\ [0.5ex] + \hline + No ack & 6489 & 4850 & $-4,841$ \\ + \hline + Ack, $N_{max} = 5$, $Q = \infty$ & 6292 & 27420 & $-14,359$ \\ + \hline + Ack, $N_{max} = 20$, $Q = \infty$ & 10889 & 10400 & $-9,068$ \\ + \hline + Ack, $N_{max} = 5$, $Q = 5$ & 6922 & 13883 & $-8,861$ \\ + \hline + Ack, $N_{max} = 20$, $Q = 5$ & 6809 & 10083 & $-7,195$ \\ + \hline + \end{tabular} + \caption{Результаты моделирования} +\end{table} + +\section{Выводы} +Если сравнить вариант системы без использования механизма передачи и вариант с подтверждением успешного приема и с ним при $N_{max} = 5$, то применение подтверждения уменьшило количество полученных пакетов, и энергозатраты выросли почти в 3 раза, из-за того, что значительная часть пакетов (первоначальных и повторных) было передано (соответственно, энергия потрачена), но не получено приемником в период отсутствия радиосвязи. + +Если же сравнить варианты $N_{max} = 5$ и $N_{max} = 20$ при $Q = \infty$, то увеличение допустимого числа попыток позволило на 67\% повысить объем полученных данных и незначительно снизить энергозатраты. + +Очевидно, система с бесконечной емкостью очереди нереализуема на практике, поэтому более корректно сравнивать при $Q = 5$. В этом случае, количество полученных пакетов увеличилось незначительно (всего на 6,5\%), но затраты энергии увеличились почти в 2 раза. + +\newpage +\appendix +\setcounter{secnumdepth}{0} +\renewcommand{\thesubsection}{\Asbuk{subsection}} +\section{Файл настроек по заданию \code{omnetpp.ini}} +\label{app:inifile} +\lstinputlisting[style=JCodeStyle]{src/lab2-omnetpp.ini} + +\end{document} diff --git a/pics/03-fpga-00-quitir.svg b/pics/03-fpga-00-quitir.svg new file mode 100644 index 0000000..dfbe94c --- /dev/null +++ b/pics/03-fpga-00-quitir.svg @@ -0,0 +1,322 @@ + + + + + + + + + + + + + + + управлениеобменом + DQ + req + ack + управлениеобменом + + + + + DQ + + + DQ + + + DQ + + + DQ + + + DQ + + + + + + + + + + + + + + diff --git a/pics/03-fpga-lab-02-individual.png b/pics/03-fpga-lab-02-individual.png new file mode 100644 index 0000000..7331520 Binary files /dev/null and b/pics/03-fpga-lab-02-individual.png differ diff --git a/src/dec.sv b/src/dec.sv new file mode 100644 index 0000000..91f2073 --- /dev/null +++ b/src/dec.sv @@ -0,0 +1,124 @@ +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; + + logic run; + logic [1:0] divider; + logic [1:0] state; + 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)); + end + + always_ff @ (posedge clk or negedge clrn) begin + if (!clrn) begin + colors <= 3'b001; + state <= GREEN; + greenCount <= 32'd0; + end else begin + if (~run) begin + colors <= 3'b001; + state <= GREEN; + end + if (train) begin + colors <= 3'b100; + state <= RED; + greenSaved <= divisor; + greenCount <= divisor; + end else begin + case (state) + RED: begin + colors <= 3'b100; + if (enacnt) begin + state <= state + 1'b1; + greenSaved <= divisor; + end + end + YELLOW: begin + colors <= 3'b010; + if (enacnt) + state <= state + 1'b1; + end + BLINK: begin + if (enacnt) + state <= state + 1'b1; + if (greenSaved[0] == 0) begin + colors <= 3'b011; + end else begin + greenCount <= greenCount - 1'b1; + if (greenCount == 32'd0) begin + colors[1] <= ~colors[1]; + greenCount <= greenSaved; + end + end + end + GREEN: begin + if (enacnt) + state <= state + 1'b1; + colors <= 3'b001; + end + default: colors <= 3'b100; + endcase + end + end + end + assign contr = state; + assign red = colors[2]; + assign yellow = colors[1]; + assign green = colors[0]; + + periodram b2v_inst3 + ( + .clock(clk), + .data (ram_wrdata), + .wraddress (ram_addr), + .wren (ram_wr), + .rdaddress({divider,contr}), + .q(divisor) + ); + +endmodule + diff --git a/src/dec_tb.sv b/src/dec_tb.sv new file mode 100644 index 0000000..67c04c3 --- /dev/null +++ b/src/dec_tb.sv @@ -0,0 +1,128 @@ +`timescale 1 ns/1 ns + +module dec_tb(); + + // Wires and variables to connect to UUT (unit under test) + logic clk, clrn, train; + logic r, y, g; + logic [1:0] div; + logic ctl_wr, ctl_rd; + logic ctl_addr; + logic [31:0] ctl_wrdata; + logic [31:0] ctl_rddata; + logic ram_wr; + logic [1:0] ram_addr; + logic [31:0] ram_wrdata; + + logic [31:0] divisor[3:0] = { + {8'd11, 8'd71, 8'd51, 8'd21}, + {8'd11, 8'd31, 8'd41, 8'd31}, + {8'd11, 8'd31, 8'd11, 8'd101}, + {8'd11, 8'd61, 8'd81, 8'd51} + }; + + // Instantiate UUT + dec my_sem( + .clk(clk), .clrn(clrn), + .ctl_wr(ctl_wr), .ctl_rd(ctl_rd), + .ctl_addr(ctl_addr), .ctl_wrdata(ctl_wrdata), .ctl_rddata(ctl_rddata), + .ram_wr(ram_wr), + .ram_addr(ram_addr), .ram_wrdata(ram_wrdata), + .train(train), .red(r), .yellow(y), .green(g) + ); + + // Clock definition + initial begin + clk = 0; + forever #10 clk = ~clk; + end + + // Divisor and train definition + initial begin + //initial reset + clrn = 0; + div = 0; + train = 0; + //take reset off + @(negedge clk) clrn = 1; + //configure semaphore + for (int i=0; i<4; i++) write_ram_transaction(i,divisor[i]); //write divisor RAM + write_reg_transaction(1,div); //write initial divisor + write_reg_transaction(0,1); //enable semaphore + //run trains + repeat (4) + begin + repeat (10) @(posedge clk); + train=1; + repeat (4) @(posedge clk); + train=0; + wait ({r,y,g}==3'b001); + repeat (10) @(posedge clk); + write_reg_transaction(1,div); + div=div+1; + end + //wait a little + repeat (10) @(posedge clk); + $stop; + end + + //Single register write transaction task + task write_reg_transaction; + //input signals + input [1:0] offs; + input [31:0] val; + //transaction implementation + begin + @(posedge clk); + //assert signals for one clock cycle + ctl_wr = 1; + ctl_addr = offs; + ctl_wrdata = val; + @(posedge clk); + //deassert signals + ctl_wr = 0; + ctl_addr = 'bx; + ctl_wrdata = 'bx; + end + endtask + + //Single register read transaction task + task read_reg_transaction; + //input signals + input [1:0] offs; + output [31:0] val; + //transaction implementation + begin + @(posedge clk); + //assert signals for one clock cycle + ctl_rd = 1; + ctl_addr = offs; + @(posedge clk); + val = ctl_rddata; + //deassert signals + ctl_rd = 0; + ctl_addr = 'bx; + end + endtask + + //RAM write transaction task + task write_ram_transaction; + //input signals + input [1:0] offs; + input [31:0] val; + //transaction implementation + begin + @(posedge clk); + //assert signals for one clock cycle + ram_wr = 1; + ram_addr = offs; + ram_wrdata = val; + @(posedge clk); + //deassert signals + ram_wr = 0; + ram_addr = 'bx; + ram_wrdata = 'bx; + end + endtask + +endmodule diff --git a/src/lab1-omnetpp.ini b/src/lab1-omnetpp.ini new file mode 100644 index 0000000..1397e16 --- /dev/null +++ b/src/lab1-omnetpp.ini @@ -0,0 +1,103 @@ +#----------------------------------------------------------------------------- +[Config Lab_1] +network = WTIS_Lab_1_Network +sim-time-limit = 100s + +*.host*.ipv4.arp.typename = "GlobalArp" + +*.hostTX*.numApps = 1 +*.hostTX*.app[0].typename = "UdpBasicApp" +*.hostTX*.app[0].destAddresses = "hostRX" +*.hostTX*.app[0].destPort = 5000 +*.hostTX*.app[0].messageLength = intuniform(1B, 1500B) +*.hostTX*.app[0].packetName = "UDPData" +*.hostTX*.*.**.vector-recording = false + +*.hostRX.numApps = 1 +*.hostRX.app[0].typename = "UdpSink" +*.hostRX.app[0].localPort = 5000 +*.hostRX.app[0].endToEndDelay:vector.vector-recording = true +*.hostRX.app[0].endToEndDelay.result-recording-modes = -vector,-histogram,+mean,+max +*.hostRX.*.**.vector-recording = false + +*.host*.wlan[0].typename = "AckingWirelessInterface" +*.host*.wlan[0].mac.useAck = false +*.host*.wlan[0].mac.fullDuplex = false +*.host*.wlan[0].mac.headerLength = 63B +#*.host*.wlan[0].mac.queue.packetCapacity = 5 + +*.host*.**.bitrate = 1.5Mbps + +*.host*.wlan[0].radio.typename = "UnitDiskRadio" +*.host*.wlan[0].radio.transmitter.communicationRange = 250m +*.host*.wlan[0].radio.transmitter.interferenceRange = 250m + +*.host*.wlan[0].radio.receiver.ignoreInterference = true + +*.host*.wlan[0].radio.displayCommunicationRange = true +*.host*.wlan[0].radio.displayInterferenceRange = true + +*.host*.wlan[0].radio.energyConsumer.typename = "StateBasedEpEnergyConsumer" +*.host*.wlan[0].radio.energyConsumer.offPowerConsumption = 0mW +*.host*.wlan[0].radio.energyConsumer.sleepPowerConsumption = 0.005mW +*.host*.wlan[0].radio.energyConsumer.switchingPowerConsumption = 5mW +#*.host*.wlan[0].radio.energyConsumer.receiverReceivingPowerConsumption = 25mW +*.host*.wlan[0].radio.energyConsumer.receiverReceivingPowerConsumption = 0mW +*.host*.wlan[0].radio.energyConsumer.receiverIdlePowerConsumption = receiverReceivingPowerConsumption +*.host*.wlan[0].radio.energyConsumer.receiverBusyPowerConsumption = receiverReceivingPowerConsumption +*.host*.wlan[0].radio.energyConsumer.transmitterTransmittingPowerConsumption = 75mW +*.host*.wlan[0].radio.energyConsumer.transmitterIdlePowerConsumption = transmitterTransmittingPowerConsumption + +*.host*.energyStorage.typename = "IdealEpEnergyStorage" + +*.radioMedium.mediumLimitCache.maxTransmissionDuration = 1s + +#----------------------------------------------------------------------------- +[Config Ideal] +extends = Lab_1 + +*.host*.wlan[0].radio.receiver.ignoreInterference = true + +*.numTxNodes = 30 + +*.hostTX*.app[0].sendInterval = exponential(${Ts=10..2500 step 50}ms) + +#----------------------------------------------------------------------------- +[Config Aloha] +extends = Ideal + +*.host*.wlan[0].radio.receiver.ignoreInterference = false + +#----------------------------------------------------------------------------- +[Config CSMA] +extends = Aloha + +*.host*.wlan[0].typename = "WirelessInterface" +*.host*.wlan[0].radio.typename = "UnitDiskRadio" +*.host*.wlan[0].mac.typename = "CsmaCaMac" +*.host*.wlan[0].mac.mtu = 10000 +*.host*.wlan[0].mac.cwMin = 0 +*.host*.wlan[0].mac.cwMax = cwMin + +#----------------------------------------------------------------------------- +[Config Aloha_Throughput] +extends = Lab_1 + +*.host*.wlan[0].radio.receiver.ignoreInterference = false + +*.numTxNodes = 30 +*.hostTX*.app[0].messageLength = intuniform(1B, 1500B) +#*.hostTX*.app[0].messageLength = 100B + +*.hostTX*.app[0].sendInterval = exponential(${Ts=10..2500 step 50}ms) + +#----------------------------------------------------------------------------- +[Config CSMA_Throughput] +extends = Aloha_Throughput + +*.host*.wlan[0].typename = "WirelessInterface" +*.host*.wlan[0].radio.typename = "UnitDiskRadio" +*.host*.wlan[0].mac.typename = "CsmaCaMac" +*.host*.wlan[0].mac.mtu = 10000 +*.host*.wlan[0].mac.cwMin = 0 +*.host*.wlan[0].mac.cwMax = cwMin \ No newline at end of file diff --git a/src/lab2-omnetpp.ini b/src/lab2-omnetpp.ini new file mode 100755 index 0000000..682c4f4 --- /dev/null +++ b/src/lab2-omnetpp.ini @@ -0,0 +1,102 @@ +#----------------------------------------------------------------------------- +[Config Lab_2] +network = WTIS_Lab_2_Network +sim-time-limit = 250s + +*.numTxNodes = 1 + +*.host*.ipv4.arp.typename = "GlobalArp" + +*.hostTX*.numApps = 1 +*.hostTX*.app[0].typename = "UdpBasicApp" +*.hostTX*.app[0].destAddresses = "hostRX" +*.hostTX*.app[0].destPort = 5000 +*.hostTX*.app[0].messageLength = 1000B +*.hostTX*.app[0].sendInterval = exponential(25ms) +*.hostTX*.app[0].packetName = "UDPData" + +*.hostRX.numApps = 1 +*.hostRX.app[0].typename = "UdpSink" +*.hostRX.app[0].localPort = 5000 + +*.host*.wlan[0].typename = "WirelessInterface" +*.host*.wlan[0].mac.typename = "CsmaCaMac" +*.host*.wlan[0].mac.cwMin = 31 +*.host*.wlan[0].mac.cwMax = 1023 +*.host*.wlan[0].mac.slotTime = 14us +*.host*.wlan[0].mac.ackTimeout = 300us +*.host*.wlan[0].mac.headerLength = 23B +*.host*.wlan[0].mac.queue.packetCapacity = -1 # infinite capacity #retries N = 5,20 +#*.host*.wlan[0].mac.queue.packetCapacity = 5 # repeat with 5,20 retries + +*.host*.**.bitrate = 1.5Mbps + +*.host*.wlan[0].radio.typename = "ApskScalarRadio" +*.host*.wlan[0].radio.centerFrequency = 3GHz +*.host*.wlan[0].radio.bandwidth = 3MHz +*.host*.wlan[0].radio.transmitter.power = 90mW +*.host*.wlan[0].radio.transmitter.preambleDuration = 10us +*.host*.wlan[0].radio.transmitter.headerLength = 8B +#*.host*.wlan[0].radio.receiver.sensitivity = -85dBm +*.host*.wlan[0].radio.receiver.sensitivity = -120dBm # not used +*.host*.wlan[0].radio.receiver.energyDetection = -64dBm +*.host*.wlan[0].radio.receiver.snirThreshold = 0dB # not used + +*.hostRX.wlan[*].radio.minSnir.result-recording-modes = default,+vector +*.hostRX.wlan[*].radio.bitErrorRate.result-recording-modes = default,+vector +*.hostRX.wlan[*].radio.packetErrorRate.result-recording-modes = default,+vector + +*.host*.wlan[0].radio.energyConsumer.typename = "StateBasedEpEnergyConsumer" +*.host*.wlan[0].radio.energyConsumer.offPowerConsumption = 0mW +*.host*.wlan[0].radio.energyConsumer.sleepPowerConsumption = 0.005mW +*.host*.wlan[0].radio.energyConsumer.switchingPowerConsumption = 5mW +*.host*.wlan[0].radio.energyConsumer.receiverReceivingPowerConsumption = 0mW +*.host*.wlan[0].radio.energyConsumer.receiverIdlePowerConsumption = receiverReceivingPowerConsumption +*.host*.wlan[0].radio.energyConsumer.receiverBusyPowerConsumption = receiverReceivingPowerConsumption +*.host*.wlan[0].radio.energyConsumer.transmitterTransmittingPowerConsumption = 75mW +*.host*.wlan[0].radio.energyConsumer.transmitterIdlePowerConsumption = transmitterTransmittingPowerConsumption + +*.host*.energyStorage.typename = "IdealEpEnergyStorage" + +*.hostTX*.mobility.typename = "CircleMobility" +*.hostTX*.mobility.speed = 2mps +*.hostTX*.mobility.cx = 185m +*.hostTX*.mobility.cy = 250m +*.hostTX*.mobility.cz = 0m +*.hostTX*.mobility.r = 75m +*.hostTX*.mobility.startAngle = 180deg + +*.visualizer.mobilityVisualizer.displayVelocities = true +*.visualizer.mobilityVisualizer.displayMovementTrails = true + +*.radioMedium.typename = "ApskScalarRadioMedium" +*.radioMedium.pathLoss.typename = "LogNormalShadowing" +*.radioMedium.pathLoss.alpha = 2 +*.radioMedium.pathLoss.sigma = 0 +*.radioMedium.backgroundNoise.power = -69dBm +*.radioMedium.mediumLimitCache.centerFrequency = 3GHz +*.radioMedium.mediumLimitCache.maxTransmissionDuration = 1s + +*.hostTX*.wlan[0].mac.queue.queueLength:vector.vector-recording = true +*.hostTX*.wlan[0].mac.queue.queueingTime:vector.vector-recording = true +*.hostTX*.wlan[0].radio.radioMode:vector.vector-recording = true +*.hostTX*.energyStorage.residualEnergyCapacity:vector.vector-recording = true +*.hostTX*.*.**.vector-recording = false + +*.hostRX.app[0].endToEndDelay:vector.vector-recording = true +*.hostRX.wlan[0].radio.bitErrorRate:vector.vector-recording = true +*.hostRX.wlan[0].radio.packetErrorRate:vector.vector-recording = true +*.hostRX.*.**.vector-recording = false + +#----------------------------------------------------------------------------- +[Config NoAck] +extends = Lab_2 + +*.host*.wlan[0].mac.useAck = false + +#----------------------------------------------------------------------------- +[Config WithAck] +extends = Lab_2 + +*.host*.wlan[0].mac.useAck = true +*.host*.wlan[0].mac.retryLimit = ${MaxRetries=5,20} \ No newline at end of file diff --git a/src/niosII_tb.v b/src/niosII_tb.v new file mode 100644 index 0000000..8ce3bb0 --- /dev/null +++ b/src/niosII_tb.v @@ -0,0 +1,64 @@ +`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 + 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 + ); + + 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 + 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; + end + end + +endmodule diff --git a/src/sem.c b/src/sem.c new file mode 100644 index 0000000..45b744b --- /dev/null +++ b/src/sem.c @@ -0,0 +1,47 @@ +#include +#include "altera_avalon_sem_regs.h" +#include "alt_types.h" +#include "system.h" + +#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} +}; + +int main() +{ + int i,j; + volatile alt_u32 *p; + alt_u32 tmp; + + //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 = 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(); + + //select timeset and run semafor + IOWR_ALTERA_AVALON_SEM_DIVSET(SEM_CTL_SLAVE_BASE,0x00); + IOWR_ALTERA_AVALON_SEM_CTL(SEM_CTL_SLAVE_BASE,0x01); + + printf("Ready\n"); + + while (1) + { + ; + } + + return 0; +}