Files
es-abschlussprojekt/Projektbericht/content.tex
T
2025-02-14 16:18:38 +01:00

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