\subsection{CFSR}

CFSR\footnote{Complete Feedback Shift Register} je čítač vzniklý rozšířením LFSR čítače o stav \texttt{(others => '0')} a tím dosažení všech $2^n$ stavů,
kde $n$ je šířka čítače. Jako základ čítače CFSR využijeme Fibonacci LFSR čítač \ref{eq:lfsr-matrix} a zavedeme další zpětnou vazbu. Výsledek se chová dle rovnice \ref{eq:cfsr-basic}.

\vzorec{eq:cfsr-basic}{\mathbf{X}(n+1)=\mathbf{A}\cdot\mathbf{X}(n) + \left[\begin{matrix}
\overline{x_0(n)}\cdot\overline{x_1(n)}\cdot\overline{x_2(n)}\cdot\ldots\overline{x_{n-1}(n)}\\
0\\
0\\
\vdots\\
0
\end{matrix}\right]}{}{}

%Takto zadefinovaný čítač má moznost čítat také v opčném pořadí. Nejdříve z rovnice \ref{eq:cfsr-basic} vyjádříme $X(n)$. Tím dostáváme výraz \ref{eq:cfsr-rev}


\vzorec{eq:cfsr-rev}{
\mathbf{A}^{-1}\cdot\mathbf{X}(n+1) - \mathbf{A}^{-1}\cdot\left[\begin{matrix}
  \overline{x_1(n)}\cdot\overline{x_2(n)}\cdot\overline{x_3(n)}\cdot\ldots\overline{x_{n-1}(n)}\\
  0\\ 0\\ \vdots \\ 0
  \end{matrix}\right] = \mathbf{X}(n)}{}

První výraz na levé straně popisuje reverzní LFSR čítač. Druhý výraz popisuje nelineární část zpětovazební funkce pro CFSR čítač. Protože matice $\mathbf{A}$ je známého tvaru Fibonacci LFSR čítače, můžeme druhý člen přepsat pro stav o jeden krok posunutý k vyšším hodnotám podle výrazu \ref{eq:cfsr-nonlinear-rev}.

\vzorec{eq:cfsr-nonlinear-rev}{
  \left[\begin{matrix}
  \overline{x_1(n)} \cdot \overline{x_2(n)} \cdot \ldots \cdot \overline{x_{n-1}(n)} \\
  0 \\ \vdots \\ 0 \\
  \end{matrix}\right] \Rightarrow
  \left[\begin{matrix}
  \overline{x_2(n+1)} \cdot \overline{x_3(n+1)} \cdot \ldots \cdot \overline{x_{n}(n+1)} \\
  0 \\ \vdots \\ 0 \\
  \end{matrix}\right]
}{}{}

Matice $\mathbf{A}^{-1}$ přičítá vstup $x_0$ pouze k bitu $x_n$. Následkem toho rovnici \ref{eq:cfsr-rev} přepíšeme na rovnici \ref{eq:cfsr-rev-final}. Tuto rovnici použijeme pro implementaci reverzního čítače.
\vzorec{eq:cfsr-rev-final}{
\mathbf{A}^{-1}\cdot\mathbf{X}(n+1) + \cdot\left[\begin{matrix}
  0 \\ 0 \\ \vdots \\
  \overline{x_2(n+1)}\cdot\overline{x_3(n+1)}\cdot\overline{x_4(n+1)}\cdot\ldots\overline{x_{n}(n+1)}\\
  \end{matrix}\right] = \mathbf{X}(n)
}{}{}

Reálná implementace CFSR čítače je na obrázcích \ref{fig:cfsr-forward} a \ref{fig:cfsr-reverse}.

\image{fig:cfsr-forward}{
\input{obrazky/cfsr}
}
{Implementace dopředného čítače. Základem je LFSR čítač popsaný výrazem $x^3 + x^2 + 1$, doplněný o zpětnou vazbu dle výrazu \ref{eq:cfsr-basic}.}

\image{fig:cfsr-reverse}{
  \input{obrazky/cfsr-reverse}
}{Implementace zpětného čítače. Základem je zpětný LFSR čítač popsaný výrazem $x^3 + x^2 + 1$, doplněný o zpětnou vazbu dle výrazu \ref{eq:cfsr-rev-final}.}

Požadavky na implementaci CFSR čítačů jsou shrnuty v tabulkách \ref{tab:size-cfsr} a \ref{tab:size-cfsr-rev}.
Pro porovnání s dekadickým čítačem nás budou zajímat dva extrémy, tj. situace, kdy zpětovazební polynom má
pouze tři členy ($x^n+x^k+1$), a situace, kdy by byly využity všechny koeficienty\footnote{Tento stav je v
praxi neočekávaný.}.

\tabulka{tab:size-cfsr}{
\begin{tabular}{lll}
  Hradlo & Velikost & Počet   \\\hline
  DFF    & 5        & $n$     \\ %dffpx1_d
  MUX2   & 2.333    & $n$     \\ %mux2x1_d
  XOR2   & 2        & $k - 1$ \\ %exor2x1_d
  AND2   & 1.333    & $n - 1$ \\ %and2x1_d
  OR2    & 1.333    & $1$     \\ %or2x1_d
  OR2    & 1.333    & $n-1$   \\ %or2x1_d
  INV1   & 0.666    & $1$     \\ %inv1x_d
  \hline
  \multicolumn{2}{l}{$\Sigma$} & $9.999\cdot{}n + 2\cdot{}k - 2.666 $ \\ 
\end{tabular}}{Odhad velikosti dopředného CFSR čítače}

\tabulka{tab:size-cfsr-rev}{
\begin{tabular}{lll}
  \hline
  Hradlo & Velikost & Počet   \\\hline
  DFF    & 5        & $n$     \\
  MUX3\footnote{Kombinace OAI222 a INV1} & 3.5      & $n$ \\
  XOR2   & 2        & $k - 1$ \\
  AND2   & 1.333    & $n - 1$ \\
  OR2    & 1.333    & $1$     \\
  MUX2   & 2.333    & $k$     \\
  OR2    & 1.333    & $n-1$   \\ %or2x1_d
  INV1   & 0.666    & $1$     \\ %inv1x_d
  MUX2   & 2.333    & $1$     \\ %mux2x1_d
  \hline
  \multicolumn{2}{l}{$\Sigma$} & $11.1333\cdot{}n + 4.333\cdot{k} - 0.333$ \\ 
\end{tabular}}{Odhad velikosti obousměrného nulovatelného CFSR čítače}
