209 lines
10 KiB
TeX
209 lines
10 KiB
TeX
\section{Einleitung}
|
|
|
|
\subsection{Projektbeschreibung und Zielsetzung}
|
|
|
|
Dieses Projekt umfasst die Konzeptionierung und Implementierung eines IPs zur Berechnung einer 32 Bit Cyclic Redundancy Check (CRC)-Prüfsumme.
|
|
Die Verarbeitung erfolgt paketweise, wobei die Daten aus dem Speicher gelesen, verarbeitet und mit angehängter Prüfsumme wieder zurückgeschrieben werden.
|
|
Der Speicherzugriff erfolgt über eine AXI-Master-Schnittstelle.
|
|
|
|
Nach Implementierung der Hardware erfolgt die Erstellung von Software, welche die Konfiguration und Steuerung des IP-Cores übernimmt.
|
|
Der Softwarepart dieser Arbeit besteht aus zwei Programmen.
|
|
Beim ersten handelt es sich um ein C-Programm, welches "bare metal" auf dem Mikroprozessor des hier verwendeten Entwicklungsboards \cite{ZyboBoard} ausgeführt wird.
|
|
Das zweite Programm wird im Kontext eines Linux Betriebssystems ausgeführt und beinhaltet die Implementierung eines ausführlichen Testprogramms, welches die Funktionalität des IP-Cores überprüft.
|
|
|
|
\subsection{Anforderungen}
|
|
|
|
Die Anforderungen an das Projekt und an das zu erstellende IP umfassen folgende Punkte:
|
|
|
|
\begin{itemize}
|
|
\item Implementierung eines \textbf{CRC-Berechnungsmoduls} als \textbf{IP-Core}
|
|
\item \textbf{Paketweises Einlesen} von Daten aus dem Speicher über einen \textbf{Full-AXI-Master}
|
|
\item Berechnung einer korrekten CRC-Prüfsumme mit \textbf{konfigurierbaren Parametern} (InitialValue, Polynomial, FinalXOR, Input/OutputReflected)
|
|
\item \textbf{Anfügen der Prüfsumme} an das ursprüngliche Datenpaket
|
|
\item \textbf{Zurückschreiben} der Daten über einen \textbf{Full-AXI-Master}
|
|
\item Unterstützung von \textbf{Interrupts} zur Synchronisation mit der CPU
|
|
\item Validierung der Hardwareimplementierung durch \textbf{Simulation und Messungen}
|
|
\item Implementierung eines \textbf{Testprogramms} zur Überprüfung der Funktionalität
|
|
\item Möglichst hoher \textbf{Datendurchsatz} bei einer Frequenz von \qty{100}{\MHz}
|
|
\end{itemize}
|
|
|
|
\subsection{CRC- Theoretische Grundlagen}
|
|
|
|
Der Cyclic Redundancy Check (CRC) ist ein Verfahren zur Fehlererkennung, welches in der Regel in digitalen Kommunikationssystemen eingesetzt wird.
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
\section{Konzept und Umsetzung des CRC-DMA-IP}
|
|
|
|
Im Rahmen dieses Projektes wurde ein IP-Block entwickelt, welcher die komplette CRC-DMA Funktionalität beinhaltet.
|
|
Dieser kann anschließend in ein größeres System eingebunden werden, um die CRC-Prüfsummen von Datenpaketen zu berechnen und diese wieder zurückzuschreiben.
|
|
Die Einbindung in ein Gesamtsystem wird in Abschnitt~\ref{sec:Einbindung} beschrieben.
|
|
|
|
Alle im Folgenden dargestellten Blockschaltbilder und VHDL-Quelldateien befinden sich im Vivadprojekt \texttt{axi\_crc\_dma} in den beigefügten Dateien.
|
|
|
|
\subsection{Entity / Schnittstellen}
|
|
|
|
\begin{figure}[H]
|
|
\centering
|
|
\includegraphics[width=0.6\textwidth]{Blockschaltbilder/axi_crc_dma_ip_entity.png}
|
|
\caption{Entity des IP \texttt{axi\_crc\_dma\_ip}}
|
|
\label{fig:CRC_DMA_IP_Entity}
|
|
\end{figure}
|
|
|
|
In Abbildung~\ref{fig:CRC_DMA_IP_Entity} ist die Entity des IPs \texttt{axi\_crc\_dma\_ip} dargestellt.
|
|
|
|
Die AXI Master Schnittstelle \emph{M\_AXI} dient zum Lesen und Schreiben der Daten aus dem Speicher.
|
|
|
|
Über die \emph{S\_AXIL} Schnittstelle kann das IP gesteuert und konfiguriert werden.
|
|
In Tabelle~\ref{tab:crc_dma_registers} sind die dafür zur Verfügung stehenden Register aufgelistet.
|
|
|
|
\begin{table}[H]
|
|
\centering
|
|
\begin{tabular}{|c|l|l|}
|
|
\hline
|
|
\textbf{Adresse} & \textbf{Registername} & \textbf{Beschreibung} \\ \hline
|
|
\multirow{3}{*}{0x00} & \multirow{3}{*}{\texttt{Control}}
|
|
& [0] Run \\ \cline{3-3}
|
|
& & [1] Interrupt Enable \\ \cline{3-3}
|
|
& & [31:2] Reserved \\ \hline
|
|
|
|
\multirow{2}{*}{0x04} & \multirow{2}{*}{\texttt{Interrupt Status}}
|
|
& [0] Interrupt Status \\ \cline{3-3}
|
|
& & [31:1] Reserved \\ \hline
|
|
|
|
\multirow{1}{*}{0x08} & \texttt{Read Address}
|
|
& [31:0] Startadresse der zu lesenden Datenpakete \\ \hline
|
|
|
|
\multirow{1}{*}{0x0C} & \texttt{Write Address}
|
|
& [31:0] Zieladresse für Daten + Prüfsumme \\ \hline
|
|
|
|
\multirow{2}{*}{0x10} & \multirow{2}{*}{\texttt{Packet Size}}
|
|
& [15:0] Paketgröße Minus 1 in Worte \\ \cline{3-3}
|
|
& & [31:16] Reserved \\ \hline
|
|
|
|
\multirow{2}{*}{0x14} & \multirow{2}{*}{\texttt{Number Packets}}
|
|
& [15:0] Anzahl der Pakete Minus 1 \\ \cline{3-3}
|
|
& & [31:16] Reserved \\ \hline
|
|
|
|
\multirow{1}{*}{0x18} & \texttt{Polynomial}
|
|
& [31:0] Generatorpolynom für CRC-Berechnung \\ \hline
|
|
|
|
\multirow{1}{*}{0x1C} & \texttt{Initial Value}
|
|
& [31:0] Initialwert der CRC-Berechnung \\ \hline
|
|
|
|
\multirow{1}{*}{0x20} & \texttt{Final XOR}
|
|
& [31:0] Wert für Finale XOR-Verknüpfung \\ \hline
|
|
|
|
\multirow{3}{*}{0x24} & \multirow{3}{*}{\texttt{InOutReflected}}
|
|
& [0] Input Reflected \\ \cline{3-3}
|
|
& & [1] Output Reflected \\ \cline{3-3}
|
|
& & [31:2] Reserved \\ \hline
|
|
|
|
\multirow{3}{*}{0x28} & \multirow{3}{*}{\texttt{AxCache}}
|
|
& [3:0] M\_AXI AWCache \\ \cline{3-3}
|
|
& & [7:4] M\_AXI ARCache \\ \cline{3-3}
|
|
& & [31:8] Reserved \\ \hline
|
|
\end{tabular}
|
|
\caption{Registerübersicht der CRC-DMA IP}
|
|
\label{tab:crc_dma_registers}
|
|
\end{table}
|
|
|
|
Mit dem Register \texttt{Control} kann das IP gesteuert werden.
|
|
Um die CRC-Berechnung zu starten, muss Bit 0 gesetzt werden.
|
|
Solange das IP aktive ist, bleibt das Bit 0 gesetzt.
|
|
Das Löschen des Bit 0 hat keine Wirkung.
|
|
Ein gestarteter Vorgang kann also nicht vorzeitig abgebrochen werden.
|
|
|
|
Mit dem Register \texttt{Interrupt Status} kann der Status des Interrupts ausgelesen werden.
|
|
Wenn der Interrupt aktiviert ist, wird dieser gesetzt, sobald die CRC-Berechnung abgeschlossen ist.
|
|
Zeitgleich wird der Interruptausgang des IPs auf High gesetzt.
|
|
Bevor das IP erneut gestartet werden kann, muss der Interrupt durch das Löschen des Bits 0 zurückgesetzt werden.
|
|
|
|
Die Register \texttt{Read Address} und \texttt{Write Address} dienen zur Konfiguration der Speicheradressen, von denen die Daten gelesen und wieder zurückgeschrieben werden.
|
|
Die Register \texttt{Packet Size} und \texttt{Number Packets} dienen zur Konfiguration der Paketgröße und der Anzahl der zu verarbeitenden Pakete.
|
|
Das IP arbeitet wort-weise.
|
|
Es können keine einzelnen Bytes adressiert werden.
|
|
Das heißt, das die konfigurierten Adressen word-aligned sein müssen und die Paketgröße und -anzahl in Worten angegeben werden müssen.
|
|
|
|
Die Register \texttt{Polynomial}, \texttt{Initial Value}, \texttt{Final XOR} und \texttt{InOutReflected} dienen zur Konfiguration der CRC-Berechnung.
|
|
|
|
Mit dem Register \texttt{AxCache} können die Werte für die \emph{ARCache} und \emph{AWCache} Signale der AXI Master Schnittstelle konfiguriert werden.
|
|
Das Verändern dieses Registers ist nicht notwendig, da der Standartwert bereits eine korrekte Funktionalität des IPs gewährleistet.
|
|
Es kann im Folgenden vernachlässigt werden.
|
|
|
|
\subsection{Architecture}
|
|
|
|
\begin{figure}[H]
|
|
\centering
|
|
\includegraphics[width=1.0\textwidth]{Blockschaltbilder/axi_crc_dma_ip_interfaces_view.png}
|
|
\caption{Architecture des IP \texttt{axi\_crc\_dma\_ip} im Interfaces-View}
|
|
\label{fig:CRC_DMA_IP_ArchitectureInterfaces}
|
|
\end{figure}
|
|
|
|
In Abbildung~\ref{fig:CRC_DMA_IP_ArchitectureInterfaces} ist der grundlegende Aufbau des IPs \texttt{axi\_crc\_dma\_ip} dargestellt.
|
|
Das IP besteht aus insgesamt vier Komponenten, die untereinander über AXI-Stream Schnittstellen kommunizieren und Daten weitergeben.
|
|
In den folgenden Abschnitten werden die einzelnen Komponenten genauer beschrieben.
|
|
|
|
\subsubsection{DMA Komponente - axis\_dma}
|
|
|
|
\begin{figure}[H]
|
|
\centering
|
|
\includegraphics[width=0.5\textwidth]{Blockschaltbilder/axis_dma_entity.png}
|
|
\caption{Entity des der Komponente \texttt{axis\_dma}}
|
|
\label{fig:AxisDMA_entity}
|
|
\end{figure}
|
|
|
|
Die Komponente \texttt{axis\_dma} ist die steuernde Komponente in diesem System.
|
|
Sie ist für das Lesen und Schreiben der Daten aus dem Speicher über die \emph{M\_AXI} Schnittstelle zuständig.
|
|
Dabei werden die gelesenen Datenpakete zunächst an einen FIFO-Speicher über die \emph{M\_AXIS} Schnittstelle weitergegeben.
|
|
Über die \emph{M\_AXIS} Schnittstelle werden die Datenpakete mit angehängter Prüfsumme wieder angenommen und zurück in den Speicher geschrieben.
|
|
|
|
Die Komponente arbeitet bei den Speicherzugriffen über die \emph{M\_AXI} Schnittstelle immer mit möglichst großen Burstlängen, um möglichst effiziente Speicherzugriffe zu gewährleisten.
|
|
Um sicherzustellen, dass das System dabei genug Daten aufnehmen kann bzw. zur Verfügung stellen kann, werden zwei FIFO-Speicher verwendet.
|
|
Die maximale Burstlänge in diesem System beträgt 16 Worte.
|
|
Die FIFO-Speicher haben eine Tiefe von 256 Worten, um ausreichend Daten puffern zu können, damit bei Verzögerungen der \emph{M\_AXI} Lesezugriffe die CRC-Berechnungskomponente trotzdem ununterbrochen Daten verarbeiten kann.
|
|
|
|
Die Eingänge \emph{S\_AXIS\_NUM\_AVIL} und \emph{M\_AXIS\_NUM\_FREE} dienen zur Überwachung der Füllstände der FIFO-Speicher.
|
|
Abhängig davon, ob genug Daten zum Schreiben oder genug freier Speicher zu Verfügung steht, werden die \emph{M\_AXI} Zugriffe gestartet.
|
|
|
|
Die Komponente ist bei Schreib- und Lesebursts in der Lage, 4kB-Adressgrenzen zu erkennen und passt entsprechend die Burstlängen und die Adressen des nächsten Zugriffs an.
|
|
|
|
\begin{figure}[H]
|
|
\centering
|
|
\includegraphics[width=1.0\textwidth]{Blockschaltbilder/axi_crc_dma_ip_default_view.png}
|
|
\caption{Architecture des IP \texttt{axi\_crc\_dma\_ip}}
|
|
\label{fig:CRC_DMA_IP_Architecture}
|
|
\end{figure}
|
|
|
|
\subsubsection{CRC-Berechnung}
|
|
|
|
|
|
|
|
\subsection{Einbindung in ein Gesamtsystem} \label{sec:Einbindung}
|
|
|
|
|
|
\newpage
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
\section{Konzept und Umsetzung der Software}
|
|
|
|
|
|
|
|
\newpage
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
\section{Testkonzept und Ergebnisse}
|
|
|
|
|
|
\newpage
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
\section{Fazit und Ausblick}
|
|
|
|
\newpage
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
|
|
%Anhang im ZIP-Ornder außer Litaratur
|
|
|