Bericht voerst fertig

This commit is contained in:
Matthias Biermann
2025-02-16 18:56:52 +01:00
parent 77852ca4ca
commit f7fd82380f
6 changed files with 6518 additions and 3 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.
+92 -3
View File
@@ -11,7 +11,7 @@ Der Softwarepart dieser Arbeit besteht aus zwei Programmen.
Beim ersten handelt es sich um ein C-Programm, welches ohne Betriebssystem 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}
\subsection{Anforderungen} \label{sec:Anforderungen}
Die Anforderungen an das Projekt und an das zu erstellende IP umfassen folgende Punkte:
@@ -272,6 +272,50 @@ Dieses Gesamtsystem kann nun synthetisiert und implementiert werden.
\section{Software - Treiberfunktion}
\begin{lstlisting}[caption={Struct für CRC-DMA-IP}, label={code:StructCRC}]
typedef struct
{
volatile uint32_t Control; // [0] Run, [1] INT Enable
volatile uint32_t InterruptStatus; // [0] INT Status
volatile uint32_t ReadAddress; // [31:0] Read Address of Data
volatile uint32_t WriteAddress; // [31:0] Write Address of Data + CRC Checksums
volatile uint32_t PacketSize; // [15:0] Size of Packets Minus 1 in 32 Bit words
volatile uint32_t NumberPackets; // [15:0] Number of Packets Minus 1
volatile uint32_t Polynomial; // [31:0] Polynomial for CRC Calculation
volatile uint32_t InitialValue; // [31:0] Initial Value of CRC Calculation
volatile uint32_t FinalXOR; // [31:0] Final XOR Value
volatile uint32_t InOutReflected; // [0] Input Reflected, [1] Output Reflected
volatile uint32_t AxCache; // [3:0] M_AXI AWCache, [7:4] M_AXI ARCache
} CRC_DMA_Typedef;
typedef CRC_DMA_Typedef *PCRC_DMA_Typedef;
\end{lstlisting}
Zur vereinfachten Handhabung des CRC-DMA-IPs wurde ein Struct und eine Treiberfunktion erstellt.
In Codeausschnitt~\ref{code:StructCRC} ist das Struct für das CRC-DMA-IP dargestellt.
Für einen einfacheren Umgang mit den CRC-Parametern befindet sich zusätzlich ein Struct für einen Satz an CRC-Parametern.
\begin{lstlisting}[caption={Struct für CRC-Parameter}, label={code:StructCRCSet}]
typedef struct
{
uint32_t Polynomial;
uint32_t InitalValue;
uint32_t FinalXOR;
bool InputReflected;
bool OutputReflected;
} CrcParameterSet;
// load a specific set of CRC parameters into Hardware
void CRC_DMA_set_parameters(PCRC_DMA_Typedef baseAddr, const CrcParameterSet* parameterSet);
\end{lstlisting}
In Codeausschnitt~\ref{code:StructCRCSet} ist das Struct für einen Satz an CRC-Parametern dargestellt.
Zum einfachen Setzen der CRC-Parameter im IP kann die Funktion \texttt{void CRC\_DMA\_set\_parameters(...)} genutzt werden.
Beiden gezeigten Codeausschnitte sind in der Headerdatei \texttt{axi\_crc\_dma.h} zu finden.
\newpage
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -417,6 +461,8 @@ Zusätzlich wurden dabei verschiedene Konfigurationen des IPs getstest, um auch
\subsection{Verifikation des Gesamtsystems} \label{sec:VerifikationGesamtsystem}
\subsubsection{Testprogramm}
Die Verifikation des Gesamtsystems erfolgt auf der Hardware.
Für die finale Verifikation des CRC-DMA-IPs bzw. des Gesamtsystems wurde das Testprogramm \texttt{CRC\_DMA.cpp} erstellt, welches im Kontext eines Linux Betriebssystems ausgeführt wird.
@@ -433,13 +479,56 @@ Der Ablauf eines Testlaufs ist wie folgt:
\end{enumerate}
Die Anzahl der Testläufe wird dem Programm als Argument beim Ausführen übergeben.
Die Testergebnisse werden in einer Log-Datei gespeichert.
Die Ausgabe des Programms erfolgt sowohl über die Konsole als auch in eine Logdatei.
\begin{figure}[H]
\centering
\includegraphics[width=0.5\textwidth]{TestprogrammBeispielausgabe.png}
\caption{Ausgabe des Testprogramms}
\label{fig:AusgabeTestprogramm}
\end{figure}
In Abbildung~\ref{fig:AusgabeTestprogramm} ist exemplarisch die Ausgabe des Testprogramms für einen Testlauf dargestellt.
Zur Verifikation des CRC-DMA-IPs können nun mithilfe dieses Programms im großen Umfang CRC-Berechnungsvorgänge ausgeführt werden.
Durch eine große Anzahl an Testläufen, kann so sichergestellt werden, dass, wenn das IP fehlerhaft ist, diese Fehler auch entdeckt werden.
Anbei dieser Projektarbeit befindet sich eine Logdatei des Testprogramms, welche die Ausgabe für 100 Testläufe enthält.
Ergebnis dieses Tests ist, dass bei insgesamt gelesenen Menge von ca. 100MB Daten keine Fehler aufgetreten sind.
Alle Daten wurden korrekt in den Speicher geschrieben.
Dabei ist anzumerken, dass nur bis zu einer Paketanzahl von 100 und einer Paketgröße von 10000 getestet wurde, auch wenn technisch gesehen sowohl Paketgröße als auch Paketanzahl auf einen Wert bis zu 65535 konfiguriert werden können.
\subsubsection{ILA-Messung}
\begin{figure}[H]
\centering
\includegraphics[width=1.0\textwidth]{ILA_wave_write_4k_boundry_crossing_ausschnitt.png}
\caption{ILA-Messung der Full-AXI-Master Schnittstelle}
\label{fig:ILA_Messung}
\end{figure}
Parallel zur Entwicklung des Testprogramms wurde mithilfe von ILA-Messungen die Funktionalität der Full-AXI-Master Schnittstelle überprüft.
Eine Beispielmessung ist in Abbildung~\ref{fig:ILA_Messung} dargestellt.
So konnte final die korrekte Kommunikation des IPs mit dem Restsystem festgestellt werden.
\newpage
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Fazit und Ausblick}
Es ist gelungen, ein CRC-DMA-IP gemäß den in Abschnitt~\ref{sec:Anforderungen} definierten Anforderungen zu erstellen und umfangreich mit einem Testprogramm zu testen.
Eine mögliche Verbesserung des IPs wäre die Optimierung der CRC-Berechnungskomponente.
Diese ist aktuell der limitierende Faktor für den Datendurchsatz des IPs.
Zum Beispiel könnte die CRC-Berechnung in mehrere Pipeline-Stufen aufgeteilt werden, wodurch der Datendurchsatz theoretisch auf ein 32-Bit-Wort pro Takt erhöht werden kann.
Damit wäre der Datendurchsatz verdreifacht.
Des weiteren könnte eine auf ein Byte genaue Addressieung der Daten implementiert werden.
Damit könnten Datenpakete auch innerhalb eines 32-Bit-Wortes beginnen und/oder enden.
Eine weitere Verbesserungsmöglichkeit wäre die Implementierung einer Stoppfunktion.
Wenn ein Vorgang gestartet wurde, kann dieser aktuell nicht vorzeitig abgebrochen werden.
Dies führt unter Umständen zu unnötigen Wartezeiten.
\newpage
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+3
View File
@@ -110,6 +110,9 @@ int main(int argc, char** argv)
PCRC_DMA_Typedef CRC = (PCRC_DMA_Typedef) mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fdCRC, 0);
uint32_t* pMem = (uint32_t*) mmap(NULL, 0x20000000, PROT_READ | PROT_WRITE, MAP_SHARED, fdMem, 0);
// Interrupt zuruecksetzen
CRC->InterruptStatus = 0;
// Physische Adressen anlegen
uint32_t uio16PhysBase = 0x30000000; // UIO16 physical Baseaddress
uint32_t* pDataPhy = (uint32_t*) uio16PhysBase;
+6423
View File
File diff suppressed because it is too large Load Diff