%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  Rychla reference k zakladum programovaciho jazyka VHDL, 
%  s durazem na syntezu HW
%
%  Martin Bruchanov -- bruxy at regnet dot cz
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\documentclass[a4paper, 10pt, pointednumbers]{scrartcl}
\usepackage{czech}
\usepackage{a4wide}
\usepackage{graphics}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{latexsym}
\usepackage{multicol}

% změna okrajů stránky, které jsou standardně 1 palec = 2.54 cm
\evensidemargin 0mm
\oddsidemargin 0mm
\headsep 0mm
\hoffset -18.4mm
\voffset -17.4mm % vrsek
\topmargin 0in 
\headheight 0cm
\textwidth 197mm
%\textheight 28.7cm
\textheight 28.4cm
\footskip 0mm

\dateczech
\newcommand{\respac}{

	\vspace{-4.5mm}

}

\newcommand{\tstart}{
	\begin{tabbing}
	M \= MMM \= MMM \kill
}

\newcommand{\tstop}{
	\end{tabbing}
	
	\vspace{-3mm}

}




%\renewcommand{\arraystretch}{1.2}

%\newcommand{\tbf}[#1]{\textbf{#1}{} }

%\newcommand{\lra}{ $\Longleftrightarrow${}\quad}
\newcommand{\zif}{\textbf{if}{} }
\newcommand{\zelse}{\textbf{else}{} }
\newcommand{\zswitch}{\textbf{switch}{} }
\newcommand{\zcase}{\textbf{case}{} }
\newcommand{\zdefault}{\textbf{default}{} }
\newcommand{\zwhile}{\textbf{while}{} }
\newcommand{\zdo}{\textbf{do}{} }
\newcommand{\zfor}{\textbf{for}{} }
\newcommand{\zgoto}{\textbf{goto}{} }
\newcommand{\zstruct}{\textbf{struct}{} }
\newcommand{\pr}[1]{$_{#1}$}

\renewcommand{\baselinestretch}{.85}
\renewcommand{\arraystretch}{0.9}
% Zmena vzdalenosti
%\newcommand{\itemizespace}{-0.5em}

\newcommand{\itemspace}{\addtolength\itemsep{-0.6em}}


\pagestyle{empty}

\begin{document} 
\begin{multicols}{2}
\begin{center}
{\huge \textbf{Programovací jazyk VHDL}}
\end{center}

Na začátku přidat knihovní podporu:

\begin{verbatim}
    library IEEE;
    use ieee.std_logic_1164.all;
    use ieee.std_logic_unsigned.all;
\end{verbatim}

\respac
\section{Datové typy}

Proměnné mohou být uvnitř PROCESS, FUNCTION
nebo PROCEDURE.\\[2mm] 
VARIABLE jméno : typ ( := hotnota );

Přiřazení: 	proměnná $:=$ hodnota; signál $<=$ hodnota;

\begin{itemize}\itemspace
\item boolean -- True, False
\item integer -- celá čísla v rozsahu $-2^{32}$--$2^{32}$; 

Jiné číselné soustavy vyjádřeny pomocí:

\vspace{-2mm}

\begin{center}
			základ soustavy \# hodnota \#
\end{center}

Př.:  \texttt{42} (desítkově), \texttt{2\#101010\#},
\texttt{16\#2A\#}

Pro lepší čitelnost možnost oddělovat \uv{\_}:

\vspace{-2mm}

\begin{verbatim}
	B"1010_1111_1100", 16#A_F_C#
\end{verbatim}

Zadání rozsahu datového typu:

\vspace{-2mm}

\begin{verbatim}
	variable state : integer range 0 to 4;
\end{verbatim}


\item natural -- celá čísla v rozsahy $0$--$2^32$ 
\item real -- \texttt{2.75}, \texttt{2\#10.11\#}, \texttt{16\#2.C\#}
\item character -- \texttt{'A'}, \texttt{'H'}
\item string -- \texttt{"ahoj vole!"}
\item bit -- \texttt{'0'}, \texttt{'1'}
\item bit\_vector -- \texttt{B"0111011"} (bin.), \texttt{X"3B"}
(hexa.), \texttt{7"73"} (oct.)

\item std\_ulogc, std\_ulogic\_vector
\item std\_logic, std\_logic\_vector -- mají 
definovanou rezoluční funkci při setkání
dvou hodnot na jednom drátu

Devítihodnotová logika:

\vspace{-2mm}

\begin{verbatim}
'U', 'X', '0', '1', 'Z', 'W', 'L', 'H', '-'
\end{verbatim}
\end{itemize}

\subsection{Uživatelsky definovaný datový typ}

\begin{verbatim}
TYPE bit IS ('0', '1')
TYPE my_integer IS RANGE -32 TO 32;
\end{verbatim}

\subsection{Výčtový typ}

\texttt{TYPE color IS (red, green, blue);}

\subsection{Pole}

TYPE název IS ARRAY (specifikace) OF datový typ;

\begin{verbatim}
TYPE matrix IS ARRAY (0 TO 2) 
     OF std_logic_vector(7 downto 0); 

matrix(0)(7 DOWNTO 3) <= "1010"; 
matrix <= ((others => '0'), 
           (others =>'0'), 
           "11110000"); 
\end{verbatim}

\subsection{Signály}

SIGNAL jméno : typ (:= počáteční hodnota);

\begin{verbatim}
SIGNAL bus : std_logic_vector(3 downto 0) 
                                     := "0101";  
SIGNAL bus : std_logic_vector(3 downto 0) 
                          := ('0','1','0','1'); 
\end{verbatim}

\subsection{Agregační operátory}
my\_vector : bit\_vector (3 down 0);

\begin{itemize}\itemspace
\item 
	my\_vector(3) $<=$ '1';\\
	my\_vector(2) $<=$ A and B;\\
	my\_vector(1) $<=$ '0';\\
	my\_vector(0) $<=$ A xor B;

	Možno napsat nahuštěně:

	my\_vector('1', A and B, '0', A xor B);\\

\item
my\_vector'('0', '1', '0', '0'); -- jinak: \\
my\_vector'(3 $=>$ '1', others $=>$ '0');
\end{itemize}

\subsection{Atributy}
\subsubsection{Atributy polí a vektorů}

\begin{verbatim}
signal c : in bit_vector(7 downto 0) := "10101010";
             std_logic_vector
\end{verbatim}

\begin{itemize}\itemspace
\item c'LOW  = 0  -- nejnižší index pole, 
\item c'HIGH = 7 -- nejvyšší index pole 
\item c'LEFT = 7 -- nejlevější index pole
\item c'RIGHT = 0 -- nejpravější index pole
\item c'RANGE = (7 downto 0) -- rozsah vektoru
\item c'LENGTH = 8 -- vrátí velikost vektoru
\item c'REVERSE\_RANGE = (0 to 7) -- vrátí rozsah vektoru v obráceném pořadí
\end{itemize}

%Atributy výčtových typů
%
%c'VAL(pozice) -- hodnota na dané pozici
%c'POS(hodnota) -- pozice spesifikované hodnoty
%d'LEFTOF(hodnota) -- hodnota vlevo od specifikované hodnoty
%d'VAL(řádek, sloupec) -- hodnota na dané pozici

\subsubsection{Atributy signálů}

\begin{itemize}\itemspace
\item s'EVENT -- pravda pokud se signál mění
\item s'STABLE -- pravda pokud se signál nemění
\item s'ACTIVE -- pravda pokud s='1'
%s'QUITE <time> -- pravda pokud nedošlo ke změně po danou dobu
%s'LAST_EVENT -- vrátí uplynulý čas od poslední změny
%s'LAST_ACTIVE --  vrátí uplynulý čas od poslední s = '1'
%s'LAST_VALUE -- vrátí hodnotu před poslední změnou
\end{itemize}

\subsubsection{Uživatelské atributy}

Deklarace: ATRIBUTE název: typ;\\ 
Specifikace: ATRIBUTE název OF cíl: třída IS hodnota;

\begin{verbatim}
ATRIBUTE number_of_inputs : INTEGER;
ATRIBUTE number_of_inputs OF xor3: SIGNAL IS 3;

inputs <= xor3'number_of_inputs; -- vrátí hodnotu 3
\end{verbatim}

\subsection{Konstanty}

Mohou být definovány v deklarační části 
ENTITY, ARCHITEKTURE nebo PACKAGE.

CONSTANT název : typ := hodnota;

\subsection{Struktura:}

\tstart
TYPE název IS RECORD\\
\>	a$_1$ : typ ( := hodnota ); \\
\> \>		\ldots \\
\>	a$_n$ : typ ( := hodnota ); \\
END RECORD;
\tstop

\subsection{Konverze datových typů}

Konverzní funkce se nacházejí v balíku
\begin{verbatim}
use ieee.std_logic_arith.all;
\end{verbatim}

\begin{itemize}\itemspace
\item conv\_integer(hodnota)
\item conv\_unsigned(hodnota)
\item conv\_signed(hodnota, bitů)
\item conv\_std\_logic\_vector(hodnota, bitů)
\end{itemize}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\respac
\section{Priority operátorů}

\begin{tabular}{|c||l|}
\hline
		&\qquad\qquad	Stejná  \\
\hline\hline
Nejvyšší & **, abs, not                    \\
$\downarrow$		 & *, $/$, mod, rem                \\  
$\downarrow$		 & unární $+$ a $-$              \\
$\downarrow$		 & $+$, $-$, \&  (zřetězení)       \\
$\downarrow$		 & sll, srl, sla, sra, rol, ror,   \\
$\downarrow$		 & $=$, $/\!\!=$, $<$, $<=$, $>$, $>=$ \\
Nejnižší & and, or, nand, nor, xor, xnor   \\
\hline
\end{tabular}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\respac
\section{Definice entity a jejího chování}

\tstart
ENTITY název IS\\
\>	GENERIC (název parametru : typ := hodnota );\\
\>	PORT ( \\
\> \>	port$_1$ : chování typ;\\
\> \>   \ldots\\
\> \>   port$_n$ : chování typ );\\
END název;
\tstop

Není-li u parametrů zadána hodnota, nutno 
zadat při vložení komponenty pomocí GENERIC MAP.
	
Chování portů: IN, OUT, INOUT, BUFFER.

%ENTITY notand IS
%	GENERIC ( parametr : typ := hodnota, \ldots ); -- chybí-li hodnota, nutno 
%zadat při vložení kompomenty pomocí generic map.
%	PORT (a, b : IN std_logic;
%		  y    : OUT std_logic;
%		  bus  : OUT std_logic_vector( parametr - 1 downto 0);
%		);
%END notand;

\subsection{Vnitřní popis entity}

ARCHITECTURE definuje chování, entita může mít víc popisů.

\tstart
ARCHITECTURE název OF entita IS\\
\>	deklarační část pro komponenty, signály,\ldots\\
BEGIN\\
\>	paralelní prostředí\ldots\\
END název;\\
\tstop

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\respac
\section{Stavové příkazy}

%%%
\tstart
	(label:) \textbf{PROCESS} (citlivostní seznam)\\
	\>	variable název : typ (rozsah) (:= počáteční hodnota);\\
	BEGIN\\
	\> WAIT UNTIL \ldots; $--$ místo citl. seznamu \\
	\>	\ldots sekvenční kód \ldots\\
    END PROCESS;\\
\tstop

%%%
\tstart
  	(label:) \textbf{WHILE} podmínka LOOP\\
	\>	\ldots\\
	END LOOP;\\
\tstop
%%%
\tstart
	(label:) \textbf{IF} podmínka THEN\\
	\>	\ldots\\
	\>	ELSIF podmínka THEN\\
	\> \>	\ldots\\
	\> ELSE\\
	\> \>	\ldots\\
	END IF;\\
\tstop
%%%
\tstart
	(label:) \textbf{CASE} výraz IS\\
	\>	WHEN volba$_1$ $=>$ \ldots;\\
	\>	WHEN volba$_2$ $=>$ \ldots;			\\
 	$-${}$-$ chování pro ostatní volby\\
 	\>	WHEN OTHERS $=>$ \ldots;\\
	END CASE;\\
\tstop

%%%
\tstart
	(label:) \textbf{FOR} i IN rozsah LOOP\\
	\> \ldots\\
	END LOOP;\\
\tstop
	rozsah = { $a$ TO $b$, $b$ DOWNTO $a$, \ldots}
%%%
\tstart
	(label:) \textbf{LOOP}\\
	\>	\ldots\\
	\> EXIT label WHEN podmínka;\\
	END LOOP;\\
\tstop

\begin{itemize}\itemspace	
\item	\textbf{EXIT} LABEL (WHEN podmínka); -- bez labelu ukončí nejbližší uzavírající cyklus
\item	\textbf{NEXT} LABEL (WHEN podmínka); -- skočí na další iteraci cyklu
\end{itemize}

% IF podmínka THEN EXIT;
%	end loop;

	

%	clk'event
%	rising_edge(clk)
%	falling_edge(clk)
%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\respac
\section{Paralelní prostředí}

\tstart
label: \textbf{FOR} i IN rozsah \textbf{GENERATE}\\
\>	paralelní příkaz;\\
END GENERATE;\\
\tstop

\tstart
label: \textbf{IF} podmínka \textbf{GENERATE}\\
\>	paralelní příkaz;\\
END GENERATE;\\
\tstop
		
\subsection{Paralelní stavové příkazy}

\begin{itemize}
\item WHEN (analogie IF):

\tstart
signál $<=$ výraz$_1$ when volby$_1$ else,\\
\>		 výraz$_2$ when volby$_2$ else,\\
\>		\ldots\\
\>		výraz$_n$;\\
\tstop

\item WITH (analogie CASE):
\tstart
	WITH testovaný výraz SELECT\\
	signál $<=$ výraz$_1$ WHEN volby$_1$,\\
	\>		  výraz$_2$ WHEN volby$_2$,\\
	\>			\ldots\\
	\>		  výraz$_n$ WHEN OTHERS;\\
	\>	(UNAFFECTED WHEN OTHERS;)\\
\tstop
\end{itemize}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\respac
\section{Strukturní popis}

Deklarace komponenty (v deklarační části architektury):

\tstart
COMPONENT název\\
\>	( GENERIC \ldots;) $--$ parametry\\
\>	PORT ( \ldots );  $--$ porty\\
END COMPONENT;\\
\tstop

Zapojení:

\tstart
LABEL:  název komponenty\\
\>	GENERIC MAP ( parametr $=>$ hodnota )  $--$ aktuální parametry\\
\>	PORT MAP ( mapování,\ldots ); $--$ popis struktury\\
\tstop

	Mapování:
	\begin{enumerate}\itemspace
	\item Port komponenty $=>$ port nadřazené entity 
 	\item Port komponenty $=>$ signál architektury
	\item Poziční mapování, nadřazené signály v pořadí portů entity
	\end{enumerate}
%		p2 => open (nezapojeno)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

BLOCK slouží k seskupování paralelních příkazů,
může obsahovat lokální deklarace.

\tstart 
label: BLOCK (strážený signál)\\
\>	deklarace\\
BEGIN\\
\>	\ldots\\
END BLOCK label;\\
\tstop

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\respac
\section{Vlastní knihovny}

\begin{verbatim}
USE work.název.all;
\end{verbatim}

\tstart
PACKAGE název IS\\
\>	deklarace\ldots \\
END název;
\tstop

\tstart
PACKAGE BODY název IS \\
\> popis funkcí a procedur\ldots \\
END; 
\tstop

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\respac
\section{Procedury a funkce}

Mohou být deklarovány uvnitř dekl. části ENTITY,
ARCHITECTURY a PACKAGE.

\tstart
FUNCTION název ( parametr : typ; \ldots)  RETURN typ IS\\
\>	deklarace\\
BEGIN\\
\>	sekvenční výrazy\\
END název;\\
\tstop

\tstart
PROCEDURE název ( parametr : typ; \ldots) IS\\
BEGIN\\
\>	sekvenční výrazy\\
END PROCEDURE;\\
\tstop

Parametry procedury mohou být IN, OUT nebo INOUT.

\respac
\section{Zpoždění pro simulace}

\begin{itemize}\itemspace
\item	wait for \emph{čas} ns/us/ms/sec; wait on \emph{signál} (místo
citlivostního seznamu v procesu);  wait
until \emph{výraz};
\item	y $<=$ NOT (a AND b) AFTER 10 ns; -- definuje setrvačné zpozdění
\item    y $<=$ TRANSPORT b AFTER 10 ns; -- definuje transportní zpozdění 
\end{itemize}
	

\end{multicols}
\end{document}


