\chapter{Protokol FrameLink}
\label{par:framelink}



\section{Úvod}
FrameLink (FL) je protokol pro přenos dat ve formě paketů v rámci designů projektu \mbox{Liberouter}.
FL nahrazuje doposud používaný command protokol, protože ten je při vyšších
datových šířkách značně neefektivní. FL je inspirován protokolem LocalLink
od Xilinxu ale obsahuje závažné změny (viz dále).
Celý text je převzat z privátní wiki stránky \cite{liberouter} projektu liberouter.



\section{Rozhraní protokolu}
\begin{itemize}
   \item DATA - přenášená data o šířce N*8 bitu
   \item REM - signál určuje kolik bytů z datové cesty je platných. Signál je binárně zakódován, takže jeho šířka je log(N). Signál je platný pokud je aktivní signál EOP\_N - tzn. je konec bloku a zajímá nás kolik bytů v tomto posledním slově je platných, přičemž se počítá zpráva a od nuly (little endian, stejně jako CMD protokol). Hodnota REM ukazuje na poslední platný byte. Např. pro DATA o šířce 32 bitů má REM šířku 2 bity. Pokud končí blok dat a REM je "00" pak platný je pouze první byte - tedy 7 downto 0, "01" pak platné jsou první 2 byty, "11" pak platné jsou všechny byty. Více viz specifikace LocalLinku, kde je REM řešen stejně (Pozor! LocalLinku používá big Indian).
   \item SOF\_N - start of frame, aktivní v nule. Ohraničuje začátek celého paketu, ten se pak muže skládat z více částí, které jsou ohraničeny pomocí SOP\_N a EOP\_N. Zároveň s SOF\_N je vždy nastaven SOP\_N v první části paketu.
   \item EOF\_N - end of frame, aktivní v nule. Ukončuje paket, muže se vyskytovat zároveň se SOF\_N (pak má paket méně než N bytů). Zároveň s ním je vždy nastaven EOP\_N v poslední částí paketu.   \item SOP\_N - začátek části paketu, aktivní v nule. Částí muže být v paketu libovolné množství ale typicky to budou dvě nebo tři.
   \item EOP\_N - konec části paketu, aktivní v nule. Valid pro signál REM. Může se vyskytovat zároveň se SOP\_N pokud je daná část menší než šířka dat.
   \item SRC\_RDY\_N - source ready, aktivní v nule. Zařízení, které vysílá data, tímto signalizuje připravenost odesílat data (má nějaké data na odesílání). Data jsou připravena na výstupu.
   \item DST\_RDY\_N - destination ready, aktivní v nule. Zařízení přijímající data tímto signalizuje schopnost přijmout data. Přenos probíhá, jen pokud jsou SRC\_RDY\_N i DST\_RDY\_N aktivní.\end{itemize}


\section{Struktura paketu}
\begin{itemize}
   \item celý paket je ohraničen signály SOF\_N a EOF\_N
   \item paket se pak muže skládat z libovolného počtu části ohraničených signaly SOP\_N a EOP\_N
   \item každá část je zarovnaná, tedy při SOP\_N je vždy první byte na první pozici (je použito schéma little endian)
   \item v jednom slově dat tedy nemůžou být přenášeny dvě různé části jako v LocalLinku
   \item paket se typicky bude skládat až ze tří částí, kterými budou HEADER, PAYLOAD a FOOTER
   \item libovolná část muže být v konkrétním projektu vynechána, vznikne tak např. jenom HEADER a PAYLOAD
   \item bude také možné počet častí paketu zvýšit, to se ale nepředpokládá
   \item která část je která není explicitně uvedeno, je to dáno kontextem (pořadí časti v celém paketu)
   \item pořadí bytů je dáno dle uspořádání Little endian, tedy v 32 bitovém slově (31 downto 0) je první byte (7 downto 0) pak (15 downto 8) atd
   \item možný průběh komunikace (\ref{img:fl_diagram}) pokud se paket skládá ze tří časti
\end{itemize}


\begin{figure}[h]
\begin{center}
\scalebox{0.5}{\includegraphics{img/fl_diagram.pdf}}
\end{center}
\caption{Možný průběh komunikace}
\label{img:fl_diagram}
\end{figure}


\section{Přenos dat}
Přenos je řízen signály SRC\_RDY\_N a DST\_RDY\_N stejně jako u LocalLinku.
Ve zkratce: signály znamenají připravenost komponenty vysílat/přijímat data.
Vlastní přenos pak probíhá, pouze pokud jsou oba signály aktivní.
U komponenty, která data odesílá, se navíc předpokládá, že pokud bude mít nějaká data na odeslání, tak je sama aktivně připraví na výstup
(bez nějakého signálu read) ale na další data přejde až po potvrzení připravenosti
přijímat z druhé strany. Příklad komunikace \ref{img:fl_diagram2}


\begin{figure}[h]
\begin{center}
\scalebox{0.9}{\includegraphics{img/fl_diagram2.pdf}}
\end{center}
\caption{Příklad komunikace}
\label{img:fl_diagram2}
\end{figure}


\section{Rozdíly proti LocalLinku}
\begin{itemize}
   \item data jsou vždy zarovnaná, v jednom slově nemůžou být dvě části paketu
   \item SOP\_N a EOP\_N ohraničuji každou část paketu
   \item chybí explicitní informace, ve které části paketu jsme, je to dáno pořadím. Nicméně komponenta bude od tohoto odstíněna použitím generického dekodéru viz dále
   \item používá se uspořádání bytů little endian (kvůli uložení v BlockRAM, přístupu do SW), LocalLink používá Big Endian
\end{itemize}


\section{Rozhraní komponent s FrameLinkem}
Pokud má komponenta jen jedno FL rozhraní (SW\_RX/TX\_BUFFER, IBUF, OBUF) jsou možnosti jmen následující:

\begin{itemize}
   \item dle rozhraní protokolu viz výše, s tím rozdílem že místo REM se použije DREM (data remainder) - REM není možné použít, protože je to operátor VHDL
   \begin{itemize}
      \item SOF\_N
      \item SOP\_N
      \item EOP\_N
      \item EOF\_N
      \item SRC\_RDY\_N
      \item DST\_RDY\_N
      \item DATA
      \item DREM
   \end{itemize}

   \item použije se předpona TX nebo RX podle toho zda se jedná o vstupní nebo výstupní rozhraní:
   \begin{itemize}
      \item RX\_SOF\_N
      \item RX\_SOP\_N
      \item RX\_EOP\_N
      \item RX\_EOF\_N
      \item RX\_SRC\_RDY\_N
      \item RX\_DST\_RDY\_N
      \item RX\_DATA
      \item RX\_REM
   \end{itemize}
\end{itemize}

Pokud má komponente vstupní i výstupní rozhraní FL protokolu tak se použije předpona RX resp. TX viz výše.
