\documentclass[12pt]{article}
\usepackage[spanish]{babel}
% \usepackage{natbib}
\usepackage{url}
\usepackage[utf8]{inputenc}

\usepackage{xfrac}
\usepackage{amsmath}
% \numberwithin{equation}{section}
\usepackage{mathtools}

\usepackage{empheq}
\usepackage{graphicx}
\usepackage{parskip}
\usepackage{fancyhdr}
\usepackage{vmargin}
\usepackage[ddmmyy]{datetime}
\usepackage{anyfontsize}
\usepackage{helvet}
\renewcommand{\familydefault}{phv}
\usepackage{xcolor}

\usepackage{float}
\usepackage[section]{placeins}
\usepackage{tocloft}
\usepackage{listings}

\lstset{
    language=VHDL,
    basicstyle=\ttfamily\small,
    keywordstyle=\color{blue},
    commentstyle=\color{green!60!black},
    stringstyle=\color{red},
    breaklines=true,
    backgroundcolor=\color{gray!05}, % fondo clarito
    frame=none
}


% Alinear completamente el texto del índice de figuras al margen izquierdo
\setlength{\cftfigindent}{0pt}     % sin sangría a la izquierda
\setlength{\cftfignumwidth}{2em}   % ancho reservado para "Figura X"

\setlength{\skip\footins}{5pt}
\usepackage[bottomfloats,belowfloats,hang]{footmisc}

% align first letter of all the lines in the footnotes
\setlength{\footnotemargin}{6pt}

% surround footnotes number with square brackets and always use numbers (even
% inside quoted text)
% https://www.overleaf.com/learn/latex/Footnotes
% \renewcommand*{\thefootnote}{\ [\arabic{footnote}]\ \ }
% \renewcommand*{\thempfootnote}{\ [\arabic{mpfootnote}]\ }

% space between text and footer
\setlength\footskip{40pt}
\setlength{\skip\footins}{20pt}


\usepackage[T1]{fontenc}


\usepackage{arevmath} % no funciona con xelatex/lualatex
\DeclareMathSizes{12}{11}{9}{8}

\usepackage{etoolbox}

\AtBeginEnvironment{align}{
    \vspace{-1.25em}
}

% Definir tamaño por defecto para todas las figuras
\setkeys{Gin}{width=\textwidth, keepaspectratio}

% \setmarginsrb{
%    left margin,
%    top margin,
%    right margin,
%    bottom margin,
%    head height,
%    head sep,
%    foot height,
%    foot skip
% }

\setmarginsrb{3.25 cm}{3.5 cm}{3.25 cm}{3.5 cm}
           {1 cm}{0.75 cm}{1 cm}{1.50 cm}

\definecolor{fiubablue}{HTML}{0085e5}
\usepackage{color}
\usepackage{hyperref}
\hypersetup{
    colorlinks=true, % set true if you want colored links
    linktoc=all,     % set to all if you want sections and subsections linked
    linkcolor=fiubablue, % choose some color if you want links to stand out
    urlcolor=fiubablue,
    citecolor=black
}

\usepackage{subfig}

\usepackage{fancyvrb}
\fvset{xleftmargin=\mathindent}

% code blocks
\usepackage{verbatimbox}
\newenvironment{fullgrayverb}
{\verbbox}
{\endverbbox\par\colorbox{gray!25}{\parbox{\textwidth}{\theverbbox}}\par}

% inline code blocks
\usepackage{tcolorbox}
\newcommand\mystrut{\rule[-3pt]{0pt}{12pt}}
\newtcbox{\code}{on line, boxrule=0pt, boxsep=0pt, top=0pt,
left=0pt, bottom=0pt, right=0pt, colback=gray!18, colframe=white,
fontupper={\ttfamily\mystrut}}

\title{Implementación de Sistema Secuencial en VHDL}          % Titulo del trabajo.
\author{Klöckner, Martin Javier}
\date{\today}                   % Fecha (automática)

\makeatletter
\let\thetitle\@title
\let\theauthor\@author
\let\thedate\@date
\makeatother

\pagestyle{fancy}
\fancyhf{}
\rhead{\theauthor}
\lhead{\thetitle}
\cfoot{\thepage}

\renewcommand{\to}{\mathrel{\scriptstyle\rightarrow}}

\begin{document}
\begin{titlepage}
    \vspace*{-2.5cm}
    {\centering
    \includegraphics[width=1.00\textwidth]{img/logofiuba.png}\\[2.25 cm]}
    \centering
    \textsc{\Large TA147}\\[0.2 cm]
    \textsc{\large Taller de Sistemas Digitales}\\[2.25 cm]
    \textcolor{cyan}{{
        \begin{minipage}{\textwidth}
            \centering
            \fontsize{26}{32}\selectfont \bfseries \thetitle
        \end{minipage}
    }}\\[1cm]
    \vspace{1em}
    {\Large \bfseries Primer Trabajo Práctico}\\[5cm]

    \vfill
    \noindent\makebox[\linewidth]{\rule{\textwidth}{0.4pt}}\\[0.5cm]
    \begin{minipage}{.49\textwidth}
    \textbf{Alumno}\\
    Klöckner, Martin Javier
    \end{minipage}%
    \begin{minipage}{.01\textwidth}
    % \centering\textbf{Legajo}\\
    % 105378 
    \end{minipage}%
    \vspace{1em}
    \begin{minipage}{.50\textwidth}
     \begin{flushright}
        \textbf{Correo electrónico}\\
         \href{mailto:mklockner@fi.uba.ar}{mklockner@fi.uba.ar} \\
      \end{flushright}
    \end{minipage}
\end{titlepage}

\setcounter{tocdepth}{2}
\hypersetup{linkcolor=black} % colorlinks=true option is used
\tableofcontents
\listoffigures
\pagebreak

% En el presente trabajo se realiza la implementación y sintesis de un dispositivo
% secuencial que permite controlar dos semaforos en una interseccion de calles.

En el presente trabajo se realiza el diseño, simulación y síntesis de un
sistema digital destinado al control de dos semaforos en una intersección. Se
emplea el lenguaje de descripción de hardware VHDL para modelar el sistema y la
herramienta de linea de comandos GHDL para la compilación y simulación del
diseño. Por ultimo se utiliza Vivado para realizar una síntesis sobre el
dispositivo xc7a15tftg256-1.

\hypertarget{introduccion}{%
\section{Introducción}\label{introduccion}}

% Por definición, la transferencia $H(s)$ de un sistema, es el cociente entre la
% entrada $X(s)$ y la salida $Y(s)$ del sistema, suponiendo que todas las
% condiciones iniciales son nulas, específicamente en el dominio de
% Laplace.\footnotemark[1]
El control de tráfico en intersecciones es un problema clásico en sistemas
digitales. La implementación mediante hardware programable permite obtener
soluciones eficientes, determinísticas y además flexibles.

El objetivo del trabajo, entonces, es diseñar e implementar un sistema digital
que controle el estado de dos semaforos en la intersección de dos calles.

\hypertarget{diseño}{%
\section{Diseño}\label{diseño}}

Para la implementación del control de los dos semáforos se modela al sistema
como una maquina de estados finita compuesta de seis estados cíclicos, en la que
cada estado representa una configuración de luces. Se considera que el estado de
cada semáforo es, ordenados en orden secuencial: solo luz roja encendida, luz
roja y amarilla encendida al mismo tiempo, solo luz verde encendida y solo luz
amarilla encendida. 

El diagrama de estados de la maquina de estados diseñada se muestra en la figura
\ref{statechart}.

\begin{figure}[!ht]
    \centering
    \includegraphics[width=1.00\textwidth]{img/statechart_trim.png}
    \caption{Diagrama de estados del control de semaforos}
    \label{statechart}
\end{figure}

Donde los estados de la maquina de estados representan la configuración de
luces como se muestra a continuación:

\begin{itemize}
    \item state\_1r\_2g: primer semáforo en rojo, segundo en verde.
    \item state\_1r\_2y: primer semáforo en rojo, segundo en amarillo.
    \item state\_1ry\_2r: primer semáforo en rojo y amarillo, segundo en rojo.
    \item state\_1g\_2r: primer semáforo en verde, segundo en rojo.
    \item state\_1y\_2r: primer semáforo en amarillo, segundo en rojo.
    \item state\_1r\_2ry: primer semáforo en rojo, segundo en rojo y amarillo.
\end{itemize}

A cada estado del semanforo se asigna un valor de tiempo en segundos, para los
estados solo rojo o solo verde se asigna 30 segundos y para los estados que
involucran amarillo se asignan 2 segundos.

Dado que el dispositivo programable en el cual se sintetiza el diseño solo
dispone de una señal de reloj de frecuencia 50 MHz, se implementa un modulo de
reloj de tiempo real (Real Time Clock, RTC) que permita determinar la cantidad
de segundos reales. Luego este modulo RTC se combina con un modulo que cuenta la
cantidad de segundos en cada estado y genera una señal bandera (flag) que indica
que se debe cambiar de estado.

\hypertarget{implementacion}{%
\section{Implementación}\label{implementacion}}

Para la implementación del control de los dos semáforos, se divide la lógica
en distintos submódulos que interactúan entre sí. Y se integran estos submódulos
en un módulo principal denominado \code{intersection\_ctrl}.

El diseño se compone de las siguientes partes fundamentales, modeladas mediante
el lenguaje de descripción de hardware VHDL: \code{semaphore\_pkg}, \code{rtc},
\code{cnt}, \code{semaphore} y \code{intersection\_ctrl}.

\hypertarget{semaphore\_pkg}{%
\subsection{semaphore\_pkg}\label{semaphore_pkg}}

En este paquete se definen los tipos de datos utilizados en el sistema. En
particular, se define el tipo enumerativo \code{state\_t}, el cual representa
los seis estados secuenciales y cíclicos de la máquina de estados.

\hypertarget{rtc}{%
\subsection{rtc}\label{rtc}}

Este módulo se utiliza para contar la cantidad de segundos reales, activando la
bandera \code{seg\_flag} por un ciclo de reloj en cada segundo. Para determinar
la cantidad de segundos se utiliza un contador que incrementa su valor en cada
ciclo de reloj hasta alcanzar el valor de \code{MAX\_CNT}.

\hypertarget{cnt}{%
\subsection{cnt}\label{cnt}}

Este modulo es el responsable de medir la duración de cada estado incrementando
un contador interno únicamente cuando es habilitado por la señal
\code{seg\_flag} que proviene del modulo RTC. El tiempo objetivo depende del
estado actual: en los estados con amarillo se utiliza una constante de 3
segundos (\code{YELLOW\_S}) y para los estados en verde o rojo se utiliza una
constante de 30 segundos (\code{RED\_GREEN\_S}). Al finalizar la cuenta se
activa la señal \code{state\_flag} para solicitar un cambio de estado.

\hypertarget{semaphore}{%
\subsection{semaphore}\label{semaphore}}

Este módulo implementa la lógica de control central, es decir, la maquina de
estados. Esta maquina de estados transiciona secuencialmente a través de los
seis estados únicamente cuando recibe la señal \code{state\_flag}. Además,
decodifica el estado actual para asignar los niveles lógicos a las salidas
físicas, controlando las luces roja, amarilla y verde de ambos semáforos.

\if{0}
\begin{figure}[!ht]
    \centering
    \includegraphics[width=1.00\textwidth]{img/statechart_trim.png}
    \caption{Diagrama de estados del control de semáforos}
    \label{statechart}
\end{figure}
\fi

\hypertarget{intersection\_ctrl}{%
\subsection{intersection\_ctrl}\label{intersection_ctrl}}

Este es el modulo principal o de nivel superior (\emph{top-level}) en el cual
este se instancian todos los submódulos, asignando las señales de entrada
y salida de cada modulo.. A través de este bloque se propaga el parámetro
genérico \code{MAX\_CNT} y se gestionan las señales internas \code{seg\_flag} y
\code{state\_flag}, las cuales permiten la comunicación entre los módulos
\code{rtc} y \code{cnt}; y la lógica de control final de las salidas físicas.

\hypertarget{simulacion}{%
\section{Simulación}\label{simulacion}}

Para realizar la simulación se creó un nuevo módulo
\code{intersection\_ctrl\_tb} en el cual se encapsula el sistema diseñado, esto
de manera de proporcionar señales ficticias que actúen como entradas y salidas.
Para evitar tener que simular por mas de 30 segundos, se cambio el parámetro
\code{MAX\_CNT} de 50e6 (1 segundo con frecuencia de reloj 50 MHz) por
10, de esta forma se activa la bandera de que ha pasado un segundo cada 5 ciclos
de reloj.

Como herramientas de simulación se utilizó \emph{GHDL} y \emph{make} para
organizar el proceso de análisis, elaboración y simulación del sistema, luego
para la síntesis se utilizó Vivado. Vivado también proporciona una opción
de simulación utilizando los mismos módulos, por lo que también se hicieron
pruebas allí para verificar el funcionamiento del diseño. Para la visualización
de las señales por fuera de Vivado, resultantes de la simulaion en \emph{GHDL},
se utilizó \emph{surfer}, un programa similar a \emph{GTKWave}. Una vista de las
formas de onda resultantes de la simulación se muestra en la figura
\ref{waveform_view} a continuación, en la cual 1 segundo de tiempo real equivale
a 0.1 us en las vistas de las formas de onda.

\begin{figure}[!ht]
    \centering
    \includegraphics[width=1.00\textwidth]{img/waveform_view.png}
    \caption{Resultado de las señales simuladas}
    \label{waveform_view}
\end{figure}

\hypertarget{sintesis}{%
\section{Síntesis}\label{sintesis}}

Utilizando Vivado se realizo una síntesis del sistema sobre un dispositivo FPGA
modelo xc7a15tftg256-1.

% En el resultado de la síntesis se verificó que las
% lineas de clock y reset sean las mismas para todos los dispositivos dentro del
% diseño, verificando el correcto funcionamiento del diseño.

Luego de realizar la síntesis del sistema en Vivado para el dispositivo FPGA
xc7a15tftg256-1, se validó la integridad estructural del diseño.
Principalmente, se corroboró que las lineas de \code{clk} y \code{rst} fueran
distribuidas de manera global y uniforme a todos los bloques lógicos
(\code{rtc}, \code{cnt} y \code{semaphore}). Esta arquitectura garantiza un
comportamiento puramente sincrónico en toda el sistema, asegurando que el
sistema opere correctamente bajo restricciones temporales del hardware y además
que este libre de bucles combinacionales.

\hypertarget{conclusion}{%
\section{Conclusión}\label{conclusion}}

En este trabajo se logró implementar un controlador de dos semáforos para la
intersección de dos calles utilizando VHDL y validando el diseño mediante
simulación en GHDL y en Vivado. Por último se realizo una síntesis sobre el
dispositivo xc7a15tftg256-1. Con respecto a las maquinas de estados finitos, se
concluye que resultan adecuadas y muy útiles para este tipo de aplicaciones.

\end{document}
