This commit is contained in:
Patrick Hangl
2026-01-12 16:25:37 +01:00
parent e36e538d12
commit 8ad14d2268
12 changed files with 514 additions and 53 deletions

BIN
Bilder/fig_dsp_comm.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

BIN
Bilder/fig_dsp_dma.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

View File

@@ -16,6 +16,7 @@
\newacro{PCM}[\AC@hyperlink{PCM}{PCM}]{Pulse Code Modulation} \newacro{PCM}[\AC@hyperlink{PCM}{PCM}]{Pulse Code Modulation}
\newacro{ARM}[\AC@hyperlink{ARM}{ARM}]{Advanced RISC Machine} \newacro{ARM}[\AC@hyperlink{ARM}{ARM}]{Advanced RISC Machine}
\newacro{RISC}[\AC@hyperlink{RISC}{RISC}]{Reduced Instruction Set Computer} \newacro{RISC}[\AC@hyperlink{RISC}{RISC}]{Reduced Instruction Set Computer}
\newacro{SOC}[\AC@hyperlink{SOC}{SOC}]{System-on-Chip}
\@setckpt{acronyms}{ \@setckpt{acronyms}{
\setcounter{page}{5} \setcounter{page}{5}
\setcounter{equation}{0} \setcounter{equation}{0}

View File

@@ -17,4 +17,5 @@
\acro{PCM}{Pulse Code Modulation} \acro{PCM}{Pulse Code Modulation}
\acro{ARM}{Advanced RISC Machine} \acro{ARM}{Advanced RISC Machine}
\acro{RISC}{Reduced Instruction Set Computer} \acro{RISC}{Reduced Instruction Set Computer}
\acro{SOC}{System-on-Chip}
\end{acronym} \end{acronym}

View File

@@ -1,13 +1,17 @@
\relax \relax
\@writefile{toc}{\contentsline {section}{\numberline {4}DSP implementation and optimization of the ANR algorithm}{40}{}\protected@file@percent } \@writefile{toc}{\contentsline {section}{\numberline {4}Hardware implementation and optimization of the ANR algorithm}{40}{}\protected@file@percent }
\acronymused{ANR} \acronymused{ANR}
\acronymused{CI}
\acronymused{ANR} \acronymused{ANR}
\acronymused{DSP} \acronymused{DSP}
\acronymused{ANR} \acronymused{ANR}
\acronymused{ANR} \acronymused{ANR}
\@writefile{toc}{\contentsline {subsection}{\numberline {4.1}Description of the low-power DSP and its environment}{40}{}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {4.1}Description of the low-power DSP and its environment}{40}{}\protected@file@percent }
\AC@undonewlabel{acro:SOC}
\newlabel{acro:SOC}{{4.1}{40}{}{}{}}
\acronymused{SOC}
\AC@undonewlabel{acro:ARM} \AC@undonewlabel{acro:ARM}
\newlabel{acro:ARM}{{4.1}{40}{}{subsection.4.1}{}} \newlabel{acro:ARM}{{4.1}{40}{}{}{}}
\acronymused{ARM} \acronymused{ARM}
\acronymused{DSP} \acronymused{DSP}
\acronymused{ARM} \acronymused{ARM}
@@ -18,33 +22,58 @@
\acronymused{CI} \acronymused{CI}
\acronymused{DSP} \acronymused{DSP}
\acronymused{DSP} \acronymused{DSP}
\acronymused{ANR}
\AC@undonewlabel{acro:ALU}
\newlabel{acro:ALU}{{4.1.1}{40}{}{subsubsection.4.1.1}{}}
\acronymused{ALU}
\acronymused{DSP}
\acronymused{ALU}
\AC@undonewlabel{acro:MAC} \AC@undonewlabel{acro:MAC}
\newlabel{acro:MAC}{{4.1.1}{41}{}{subsubsection.4.1.1}{}} \newlabel{acro:MAC}{{4.1.1}{40}{}{}{}}
\acronymused{MAC} \acronymused{MAC}
\acronymused{DSP} \acronymused{ARM}
\@writefile{toc}{\contentsline {subsubsection}{\numberline {4.1.2}Communication between the ARM core and the DSP}{41}{}\protected@file@percent } \acronymused{ANR}
\acronymused{ANR}
\acronymused{SOC}
\acronymused{ARM} \acronymused{ARM}
\acronymused{DSP} \acronymused{DSP}
\acronymused{ARM} \acronymused{ARM}
\acronymused{DSP} \acronymused{DSP}
\acronymused{ANR}
\acronymused{DSP} \acronymused{DSP}
\acronymused{ARM} \acronymused{ARM}
\@writefile{lof}{\contentsline {figure}{\numberline {32}{\ignorespaces Simplified visualization of the communication between the \ac {ARM} core and the \ac {DSP} core}}{41}{}\protected@file@percent }
\acronymused{ARM}
\acronymused{DSP} \acronymused{DSP}
\newlabel{fig:fig_dsp_setup.jpg}{{32}{41}{}{figure.32}{}}
\acronymused{ARM}
\AC@undonewlabel{acro:PCM}
\newlabel{acro:PCM}{{4.1.2}{41}{}{figure.32}{}}
\acronymused{PCM}
\AC@undonewlabel{acro:DMA} \AC@undonewlabel{acro:DMA}
\newlabel{acro:DMA}{{4.1.2}{41}{}{figure.32}{}} \newlabel{acro:DMA}{{4.1.1}{41}{}{}{}}
\acronymused{DMA}
\AC@undonewlabel{acro:PCM}
\newlabel{acro:PCM}{{4.1.1}{41}{}{}{}}
\acronymused{PCM}
\acronymused{DSP}
\acronymused{PCM}
\acronymused{ARM}
\acronymused{DSP}
\acronymused{DSP}
\acronymused{DSP}
\acronymused{DSP}
\acronymused{ARM}
\acronymused{DSP}
\acronymused{DSP}
\AC@undonewlabel{acro:ALU}
\newlabel{acro:ALU}{{4.1.1}{41}{}{}{}}
\acronymused{ALU}
\acronymused{DSP}
\acronymused{MAC}
\acronymused{ALU}
\acronymused{MAC}
\@writefile{toc}{\contentsline {subsubsection}{\numberline {4.1.2}Communication between the ARM core and the DSP}{41}{}\protected@file@percent }
\acronymused{CI}
\acronymused{ARM}
\acronymused{DSP}
\acronymused{ARM}
\acronymused{DSP}
\acronymused{DSP}
\acronymused{ARM}
\@writefile{lof}{\contentsline {figure}{\numberline {32}{\ignorespaces Simplified visualization of the interaction between the \ac {ARM} core and the \ac {DSP} core}}{42}{}\protected@file@percent }
\acronymused{ARM}
\acronymused{DSP}
\newlabel{fig:fig_dsp_setup.jpg}{{32}{42}{}{}{}}
\acronymused{ARM}
\acronymused{PCM}
\acronymused{DMA} \acronymused{DMA}
\acronymused{PCM} \acronymused{PCM}
\acronymused{DSP} \acronymused{DSP}
@@ -54,16 +83,61 @@
\acronymused{DSP} \acronymused{DSP}
\acronymused{DMA} \acronymused{DMA}
\acronymused{PCM} \acronymused{PCM}
\@writefile{lof}{\contentsline {figure}{\numberline {33}{\ignorespaces Simplified flowchart of the sample processing between the \ac {ARM} core and the \ac {DSP} core via interrupts and shared memory. For simplification, the registers of the \ac {DSP} core are not visualized.}}{42}{}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {33}{\ignorespaces Simplified flowchart of the sample processing between the \ac {ARM} core and the \ac {DSP} core via interrupts and shared memory.}}{43}{}\protected@file@percent }
\acronymused{ARM}
\acronymused{DSP}
\newlabel{fig:fig_dsp_comm.jpg}{{33}{43}{}{}{}}
\@writefile{toc}{\contentsline {subsection}{\numberline {4.2}Implementation of the ANR algorithm on the DSP}{43}{}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {4.2.1}High-level description of the ANR algorithm implementation}{43}{}\protected@file@percent }
\acronymused{ANR}
\acronymused{DSP}
\acronymused{DSP}
\acronymused{ANR}
\acronymused{DSP}
\acronymused{ARM}
\acronymused{ARM}
\acronymused{DMA}
\acronymused{ARM}
\acronymused{DSP}
\acronymused{ARM}
\acronymused{DSP}
\acronymused{ARM}
\acronymused{DMA}
\acronymused{PCM}
\acronymused{ARM} \acronymused{ARM}
\acronymused{DSP} \acronymused{DSP}
\acronymused{DSP} \acronymused{DSP}
\newlabel{fig:fig_dsp_interrupt.jpg}{{33}{42}{}{figure.33}{}} \acronymused{ARM}
\@writefile{toc}{\contentsline {subsection}{\numberline {4.2}Implementation of the ANR algorithm on the DSP}{42}{}\protected@file@percent } \acronymused{DSP}
\@writefile{toc}{\contentsline {subsection}{\numberline {4.3}First optimization approach: algorithm implementation}{42}{}\protected@file@percent } \acronymused{ANR}
\@writefile{toc}{\contentsline {subsection}{\numberline {4.4}Second optimization approach: hybrid ANR algorithm}{42}{}\protected@file@percent } \acronymused{DSP}
\acronymused{ARM}
\acronymused{DSP}
\acronymused{DMA}
\acronymused{PCM}
\acronymused{ARM}
\acronymused{DSP}
\acronymused{DMA}
\@writefile{lof}{\contentsline {figure}{\numberline {34}{\ignorespaces Visualization of the \ac {DMA} operations between the PCM interface to the shared memory section. When the memory buffer is filled by 50\%, an interrupt is triggerd, either to the \ac {DSP} core or to the \ac {ARM} core, depending on the input or output direction.}}{45}{}\protected@file@percent }
\acronymused{DMA}
\acronymused{DSP}
\acronymused{ARM}
\newlabel{fig:fig_dsp_dma.jpg}{{34}{45}{}{}{}}
\acronymused{DMA}
\acronymused{DMA}
\acronymused{PCM}
\acronymused{DSP}
\acronymused{DMA}
\acronymused{PCM}
\acronymused{ARM}
\acronymused{ANR}
\acronymused{DSP}
\acronymused{ARM}
\@writefile{toc}{\contentsline {subsubsection}{\numberline {4.2.2}Code implementation of the ANR algorithm implementation}{46}{}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {4.3}First optimization approach: algorithm implementation}{46}{}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {4.4}Second optimization approach: hybrid ANR algorithm}{46}{}\protected@file@percent }
\@setckpt{chapter_04}{ \@setckpt{chapter_04}{
\setcounter{page}{43} \setcounter{page}{47}
\setcounter{equation}{21} \setcounter{equation}{21}
\setcounter{enumi}{0} \setcounter{enumi}{0}
\setcounter{enumii}{0} \setcounter{enumii}{0}
@@ -77,7 +151,7 @@
\setcounter{subsubsection}{0} \setcounter{subsubsection}{0}
\setcounter{paragraph}{0} \setcounter{paragraph}{0}
\setcounter{subparagraph}{0} \setcounter{subparagraph}{0}
\setcounter{figure}{33} \setcounter{figure}{34}
\setcounter{table}{0} \setcounter{table}{0}
\setcounter{float@type}{16} \setcounter{float@type}{16}
\setcounter{tabx@nest}{0} \setcounter{tabx@nest}{0}
@@ -198,7 +272,7 @@
\setcounter{lstnumber}{21} \setcounter{lstnumber}{21}
\setcounter{FancyVerbLine}{0} \setcounter{FancyVerbLine}{0}
\setcounter{linenumber}{1} \setcounter{linenumber}{1}
\setcounter{LN@truepage}{42} \setcounter{LN@truepage}{46}
\setcounter{FancyVerbWriteLine}{0} \setcounter{FancyVerbWriteLine}{0}
\setcounter{FancyVerbBufferLine}{0} \setcounter{FancyVerbBufferLine}{0}
\setcounter{FV@TrueTabGroupLevel}{0} \setcounter{FV@TrueTabGroupLevel}{0}

View File

@@ -1,31 +1,67 @@
\section{DSP implementation and optimization of the ANR algorithm} \section{Hardware implementation and optimization of the ANR algorithm}
This section aims to be the main part of this thesis. The first subchapter describes the hardware, on which the \ac{ANR} algorithm is implemented, including its environment, which serves as a link to the CI system itself. The following subchapter continues with the basic implementation of the \ac{ANR} algorithm on the hardware itself and shall provide the reader with a basic understanding of its efficiency, which shall serve as a baseline for the following optimizations.\\ This section aims to be the main part of this thesis. The first subchapter describes the hardware, on which the \ac{ANR} algorithm is implemented, including its environment, which serves as a link to the \ac{CI} system itself. The following subchapter continues with the basic implementation of the \ac{ANR} algorithm on the hardware itself and shall provide the reader with a basic understanding of its challenges, possibilities and limitations. This basic implementation shall serve as a baseline for the following optimizations.\\
During the third chapter, this initial implementation is further optimized in order to achieve an improved real-time performance on the \ac{DSP}. The last subchapter picks the final optimizations of the \ac{ANR} algorithm itself as a central theme, especially with respect to the capabilities of a hybrid \ac{ANR} approach. During the third chapter, this initial implementation is further optimized in order to achieve an improved real-time performance on the \ac{DSP}. The last subchapter picks the final optimizations of the \ac{ANR} algorithm itself as a central theme, especially with respect to the capabilities of a hybrid \ac{ANR} approach.
\subsection{Description of the low-power DSP and its environment} \subsection{Description of the low-power DSP and its environment}
This thesis considers a low-power system-on-chip architecture that integrates a general-purpose \ac{ARM} core with a dedicated \ac{DSP} core. The system combines the flexibility of an \ac{ARM}-based control processor with the computational efficiency of a specialized \ac{DSP}, splitting general computing tasks from real-time signal processing workloads. This thesis considers a low-power \ac{SOC} architecture that integrates a general-purpose \ac{ARM} core with a dedicated \ac{DSP} core. The system combines the flexibility of an \ac{ARM}-based control processor with the computational efficiency of a specialized \ac{DSP}, splitting general computing tasks from real-time signal processing workloads.
\subsubsection{Hardware overview} \subsubsection{Hardware overview}
The \ac{ARM} core serves as the primary control unit of the system. It is responsible for high-level application logic, system configuration, peripheral management, and scheduling. Due to its general-purpose instruction set and extensive software ecosystem, the \ac{ARM} core is well suited for handling general tasks and the interaction with the \ac{CI} system. Time-critical numerical processing is intentionally offloaded to the \ac{DSP} core in order to reduce computational load and power consumption on the control processor.\\ \\ A 32-bit \ac{ARM} core serves as the primary control unit of the system. It is responsible for high-level application logic, system configuration, peripheral management as also scheduling and serves as a general-purpose processing unit. Due to its universal instruction set and extensive input/output interface, the \ac{ARM} core is well suited for handling general tasks and the interaction with the \ac{CI} system. Time-critical numerical processing is intentionally offloaded to the \ac{DSP} core in order to reduce computational load and power consumption on the control processor.\\ \\
The \ac{DSP} used for the implementation is a 32-bit fixed-point processor primarily designed for audio signal-processing applications in low-power embedded systems. It is developed using a retargetable processor design methodology and is typically programmed in the C language. The used compiler is highly efficient and generates optimized assembler code, which is then translated in machine code to execute the \ac{ANR} algorithm on incoming samples.\\ \\ The \ac{DSP} used for the implementation features a 32-bit dual Harvard, dual \ac{MAC} architecture primarily designed for audio signal-processing applications in low-power embedded systems. It doesn´t feature a designated boot ROM, as it is initialized by the \ac{ARM} core. The firmware executing the \ac{ANR} algorithm is developed and programmed in the C programming language. The used propretiery compiler is highly efficient and generates optimized assembler code, which is then translated in machine code to execute the \ac{ANR} algorithm on incoming samples.\\ \\
The processor is equipped with load/store architecture, meaning that, initially all operands need to be moved from the memory to the registers, before any operation can be performed. After this task is performed, the execution units (\ac{ALU} and multiplier) can perform their operations on the data and write back the results into the registers. Finally, the results need to be explicitly moved back to the memory.\\ \\ All memory instances and registers of the \ac{SOC} are directly addressable by the \ac{ARM} through the standard busses, also enabling a simplified control of the \ac{DSP} through a shared memory section. The memory consists mainly out of the two followng parts:
The \ac{DSP} includes a three stage pipeline consisting of fetch, decode, and execute stages, allowing for overlapping instruction execution and improved throughput. The architecture is optimized for high cycle efficiency when executing computationally intensive signal-processing workloads. It features a dual Harvard load store architecture and two separate \ac{ALU}s, which enables the execution of two \ac{MAC} operations, two memory operations (load/store) and two pointer updates in a single processor cycle.\\ \\ \begin{itemize}
The \ac{DSP} includes a set of registers, including \item \textbf{Program Memory:} This memory section stores the executable code for both the \ac{ARM} core and the \ac{DSP} core. It contains the compiled instructions that define the behavior of the system, including the \ac{ANR} algorithm implemented on the \ac{DSP}.
\item \textbf{Data Memory:} This memory section is used for storing runtime data and variables, required during the execution of the program. This also includes the memory section for input/output audio samples and intermediate processing results. The shared memory section between the \ac{ARM} core and the \ac{DSP} core is also part of the data memory, featuring a total size of 64 KB.
\end{itemize}
The data memory is supported by an integrated \ac{DMA} controller, which allows efficient data transfers between peripherals and memory without burdening the processing cores. This is particularly needed for transferring audio samples from the \ac{PCM} interface to the shared memory section for further processing by the \ac{DSP}, as well as transferring processed samples back to the \ac{PCM} interface for playback.\\ \\
The mentioned 64 KB shared memory section between the \ac{ARM} core and the \ac{DSP} core is crucial for enabling efficient communication and data exchange between the two processing units, further described in the following subchapter.\\ \\
When the \ac{DSP} is not required to process audio data, it can be paused by pausing the clock provided to the \ac{DSP} core. When paused, the \ac{DSP} core enters a low-power state, still allowing the \ac{ARM} core to access its shared memory and wake up the \ac{DSP} core when needed. This mechanism helps to reduce overall power consumption, which is crucial for battery-operated devices like cochlear implants.\\ \\
The processing unit of the \ac{DSP} is equipped with load/store architecture, meaning that, initially all operands need to be moved from the memory to the registers, before any operation can be performed. After this task is performed, the execution units (\ac{ALU} and multiplier) can perform their operations on the data and write back the results into the registers. Finally, the results need to be explicitly moved back to the memory.\\ \\
Processor-wise, the \ac{DSP} includes a three stage pipeline consisting of fetch, decode, and execute stages, allowing for overlapping instruction execution and improved throughput. The architecture is optimized for high cycle efficiency when executing computationally intensive signal-processing workloads. The featured dual Harvard, dual \ac{MAC} architecture (two separate \ac{ALU}s) enables the execution of two \ac{MAC} operations, two memory operations (load/store) and two pointer updates in a single processor cycle.
\subsubsection{Communication between the ARM core and the DSP} \subsubsection{Communication between the ARM core and the DSP}
Communication between the \ac{ARM} core and the \ac{DSP} is realized through a shared memory region accessible by both processing units. This shared memory enables the exchange of data without the need for separate communication protocols. Synchronization between the cores is achieved using interrupt-based signaling: the \ac{ARM} core initiates processing requests by triggering an interrupt on the \ac{DSP}, while the \ac{DSP} notifies the \ac{ARM} core upon completion of a task via a dedicated signaling mechanism. This approach ensures efficient coordination while minimizing active waiting and unnecessary power consumption. In order to ensure a smooth, but power-efficient, operation together with the \ac{CI} system, a interrupt-driven communication between the \ac{ARM} core and the \ac{DSP} core is crucial. Center of communication between the the cores is the already mentioned shared memory region accessible by both processing units. This shared memory enables the exchange of data without the need for separate communication protocols or input/output interfaces (refer to Figure \ref{fig:fig_dsp_setup.jpg}). Synchronization between the cores is achieved using interrupt-based signaling: the \ac{ARM} core initiates processing requests by triggering an interrupt on the \ac{DSP}, while the \ac{DSP} notifies the \ac{ARM} core upon completion of a task also by rasing an inerrupt. This approach ensures efficient coordination while minimizing active waiting (polling) and therefore unnecessary power consumption.
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\includegraphics[width=1.0\linewidth]{Bilder/fig_dsp_setup.jpg} \includegraphics[width=1.0\linewidth]{Bilder/fig_dsp_setup.jpg}
\caption{Simplified visualization of the communication between the \ac{ARM} core and the \ac{DSP} core} \caption{Simplified visualization of the interaction between the \ac{ARM} core and the \ac{DSP} core}
\label{fig:fig_dsp_setup.jpg} \label{fig:fig_dsp_setup.jpg}
\end{figure} \end{figure}
\noindent The \ac{ARM} Core receives the audio data from the CI system via a \ac{PCM} interface, which offers one input and one output register. An interrupt trigger the integrated \ac{DMA} controller, which transfers the audio data from the \ac{PCM} interface to buffer in a predefined memory location. Once the buffer is filled with enough samples, another interrupt is triggered, notifying the \ac{DSP} core to start processing the audio data. The \ac{DSP} core then reads the audio samples from the shared memory, processes them using the implemented \ac{ANR} algorithm, and writes the processed samples back to an output buffer, also located in the shared memory. Finally, the \ac{ARM} core is notified via an interrupt from the \ac{DSP} core, that the processing is complete - the \ac{DMA} controller then transfers the processed audio samples from the output buffer back to the \ac{PCM} interface for playback.\\ \\ \noindent The \ac{ARM} Core receives the audio data from the CI system via a \ac{PCM} interface, which offers one input and one output register. An interrupt trigger the integrated \ac{DMA} controller, which transfers the audio data from the \ac{PCM} interface to buffer in a predefined memory location. Once the buffer is filled with enough samples (), another interrupt is triggered by the DMA controller itself, notifying the \ac{DSP} core to start processing the audio data. The \ac{DSP} core then reads the audio samples from the shared memory, processes them using the implemented \ac{ANR} algorithm, and writes the processed samples back to an output buffer, also located in the shared memory. Finally, the \ac{ARM} core is notified via an interrupt from the \ac{DSP} core, that the processing is complete - the \ac{DMA} controller then transfers the processed audio samples from the output buffer back to the \ac{PCM} interface for playback (refer to Figure \ref{fig:fig_dsp_comm.jpg}).\\ \\
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\includegraphics[width=0.9\linewidth]{Bilder/fig_dsp_interrupt.jpg} \includegraphics[width=0.9\linewidth]{Bilder/fig_dsp_comm.jpg}
\caption{Simplified flowchart of the sample processing between the \ac{ARM} core and the \ac{DSP} core via interrupts and shared memory. For simplification, the registers of the \ac{DSP} core are not visualized.} \caption{Simplified flowchart of the sample processing between the \ac{ARM} core and the \ac{DSP} core via interrupts and shared memory.}
\label{fig:fig_dsp_interrupt.jpg} \label{fig:fig_dsp_comm.jpg}
\end{figure} \end{figure}
\subsection{Implementation of the ANR algorithm on the DSP} \subsection{Implementation of the ANR algorithm on the DSP}
\subsubsection{High-level description of the ANR algorithm implementation}
In contrary, to the high-level simulation environment written in Python from the previous chapter, the implementation of the \ac{ANR} algorithm on the \ac{DSP} requires a low-level programming approach, as which takes into account the specific architecture and capabilities of the processor and its environment. This includes considerations such as memory management, data types, and optimization techniques specific to the \ac{DSP} architecture. The implementation is required to be done in the C programming language, which is a standard for embedded systems, as it allows low-level hardware implementation.\\ \\
The implementation of the \ac{ANR} algorithm on the \ac{DSP} follows the same overall structure as the high-level variant, but now the focus lies on memory management, interrupt-handling and communication between the two cores. The \ac{ARM} operates in a continious loop, structured into several states:
\begin{itemize}
\item \textbf{Idle:} The \ac{ARM} core waits for an interrupt from the \ac{DMA} controller, indicating that new audio samples are available in the input buffer.
\item \textbf{Work:} After receiving the interrupt, the \ac{ARM} core triggers an interrupt on the \ac{DSP} core to start processing the audio samples.
\item \textbf{Wait:} The \ac{ARM} core waits for an interrupt from the \ac{DSP} core, indicating that the processing is complete.
\item \textbf{Done/Idle:} Once the processing is complete, the \ac{ARM} core triggers the \ac{DMA} controller to transfer the processed audio samples from the output buffer back to the \ac{PCM} interface for playback. The \ac{ARM} core then returns to the idle state, waiting for the next batch of audio samples.
\end{itemize}
On the contrary, the \ac{DSP} core operates in an interrupt-driven manner:
\begin{itemize}
\item \textbf{Idle:} The \ac{DSP} core remains in a halted state, waiting for an interrupt from the \ac{ARM} core to start processing.
\item \textbf{Work:} Upon receiving the interrupt, the \ac{DSP} core reads the audio samples from the input buffer located in the shared memory, processes them using the implemented \ac{ANR} algorithm, and writes the processed samples back to the output buffer in the shared memory.
\item \textbf{Done/Idle:} After completing the processing, the \ac{DSP} core triggers an interrupt on the \ac{ARM} core to notify that the processing is complete. The \ac{DSP} core then returns to the idle state, waiting for the next processing request.
\end{itemize}
\noindent The \ac{DMA} controller plays a crucial role in this architecture by handling the data transfers between the \ac{PCM} interface and the shared memory buffers. It operates independently of both the \ac{ARM} core and the \ac{DSP} core, allowing for efficient data movement without burdening the processing units. The \ac{DMA} controller is configured to transfer audio samples in blocks, triggering interrupts to notify the respective cores when new data is available or when processing is complete.
\begin{figure}[H]
\centering
\includegraphics[width=1.0\linewidth]{Bilder/fig_dsp_dma.jpg}
\caption{Visualization of the \ac{DMA} operations between the PCM interface to the shared memory section. When the memory buffer is filled by 50\%, an interrupt is triggerd, either to the \ac{DSP} core or to the \ac{ARM} core, depending on the input or output direction.}
\label{fig:fig_dsp_dma.jpg}
\end{figure}
\noindent Figure \ref{fig:fig_dsp_dma.jpg} visualizes the concrete operation of the \ac{DMA} controller during the audio sample processing. The \ac{DMA} controller is configured to samplewise transfer the audio samples from the \ac{PCM} interface into a defined memory location of the shared memory (input buffer). When the input buffer is half full, an interrupt is triggered to the \ac{DSP} core, notifying it to start processing the available samples. After processing, the results are written to another designated section of the memory (output buffer). When the output buffer is filled is half full, another interrupt is triggered to the \ac{DMA} controller, indicating that the processed samples are ready to be transferred back to the \ac{PCM} interface for playback. \\ \\
As the \ac{ARM} operation is not the main focus of this thesis, the following section will focus on implementation of the \ac{ANR} algorithm on the \ac{DSP} core itself. As the behavior of the \ac{ARM} core is already sufficiently described, furhter implementaion details will be omitted in the following.
\subsubsection{Code implementation of the ANR algorithm implementation}
- Definition Speicherbereiche und Konstanten
- Main loop
- Initialisierung der Signale
- Calc Funktion
\subsection{First optimization approach: algorithm implementation} \subsection{First optimization approach: algorithm implementation}
\subsection{Second optimization approach: hybrid ANR algorithm} \subsection{Second optimization approach: hybrid ANR algorithm}

153
drawio/fig_dsp_comm.drawio Normal file
View File

@@ -0,0 +1,153 @@
<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36" version="29.2.10">
<diagram name="Page-1" id="biPyHR2u_nhwJtU07GTZ">
<mxGraphModel dx="576" dy="743" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="m7WE5ZGX3xGycdAAs7q0-1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="&lt;b style=&quot;&quot;&gt;&lt;font style=&quot;font-size: 16px;&quot;&gt;Shared Memory&lt;/font&gt;&lt;/b&gt;" vertex="1">
<mxGeometry height="40" width="160" x="1620" y="40" as="geometry" />
</mxCell>
<mxCell id="m7WE5ZGX3xGycdAAs7q0-2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" value="&lt;b style=&quot;&quot;&gt;&lt;font style=&quot;font-size: 16px;&quot;&gt;ARM Core&lt;/font&gt;&lt;/b&gt;" vertex="1">
<mxGeometry height="40" width="160" x="1380" y="40" as="geometry" />
</mxCell>
<mxCell id="m7WE5ZGX3xGycdAAs7q0-3" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" value="&lt;b style=&quot;&quot;&gt;&lt;font style=&quot;font-size: 16px;&quot;&gt;DSP Core&lt;/font&gt;&lt;/b&gt;" vertex="1">
<mxGeometry height="40" width="160" x="1860" y="40" as="geometry" />
</mxCell>
<mxCell id="m7WE5ZGX3xGycdAAs7q0-4" edge="1" parent="1" style="endArrow=none;dashed=1;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;strokeWidth=2;" target="m7WE5ZGX3xGycdAAs7q0-1" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="1700" y="720" as="sourcePoint" />
<mxPoint x="1680" y="150" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="m7WE5ZGX3xGycdAAs7q0-5" edge="1" parent="1" style="endArrow=none;dashed=1;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;strokeWidth=2;" target="m7WE5ZGX3xGycdAAs7q0-3" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="1940" y="720" as="sourcePoint" />
<mxPoint x="2000" y="110" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="m7WE5ZGX3xGycdAAs7q0-6" edge="1" parent="1" style="endArrow=none;dashed=1;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;strokeWidth=2;" target="m7WE5ZGX3xGycdAAs7q0-2" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="1460" y="720" as="sourcePoint" />
<mxPoint x="1490" y="140" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="m7WE5ZGX3xGycdAAs7q0-7" edge="1" parent="1" source="m7WE5ZGX3xGycdAAs7q0-8" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="1240" y="120" as="sourcePoint" />
<mxPoint x="1460" y="120" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="m7WE5ZGX3xGycdAAs7q0-9" connectable="0" parent="m7WE5ZGX3xGycdAAs7q0-7" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=16;" value="Write sample to&lt;br&gt;PCM Interface" vertex="1">
<mxGeometry relative="1" x="-0.0429" y="2" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="m7WE5ZGX3xGycdAAs7q0-8" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" value="&lt;b style=&quot;&quot;&gt;&lt;font style=&quot;font-size: 16px;&quot;&gt;CI System&lt;/font&gt;&lt;/b&gt;" vertex="1">
<mxGeometry height="40" width="160" x="1120" y="100" as="geometry" />
</mxCell>
<mxCell id="m7WE5ZGX3xGycdAAs7q0-10" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="1460" y="160" as="sourcePoint" />
<mxPoint x="1700" y="160" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="m7WE5ZGX3xGycdAAs7q0-11" connectable="0" parent="m7WE5ZGX3xGycdAAs7q0-10" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=16;" value="Move sample to&lt;br&gt;Shared Memory" vertex="1">
<mxGeometry relative="1" x="-0.0429" y="2" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="m7WE5ZGX3xGycdAAs7q0-12" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="1460" y="220" as="sourcePoint" />
<mxPoint x="1940" y="220" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="m7WE5ZGX3xGycdAAs7q0-13" connectable="0" parent="m7WE5ZGX3xGycdAAs7q0-12" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=16;" value="Raise Interrupt on DSP&lt;br&gt;&quot;Work requested&quot;" vertex="1">
<mxGeometry relative="1" x="-0.0429" y="2" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="m7WE5ZGX3xGycdAAs7q0-14" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="1700" y="340" as="sourcePoint" />
<mxPoint x="1940" y="340" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="m7WE5ZGX3xGycdAAs7q0-15" connectable="0" parent="m7WE5ZGX3xGycdAAs7q0-14" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=16;" value="Move sample to&lt;br&gt;Register" vertex="1">
<mxGeometry relative="1" x="-0.0429" y="2" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="m7WE5ZGX3xGycdAAs7q0-17" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="1940" y="280" as="sourcePoint" />
<mxPoint x="1700" y="280" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="m7WE5ZGX3xGycdAAs7q0-18" connectable="0" parent="m7WE5ZGX3xGycdAAs7q0-17" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=16;" value="Read sample from&lt;br&gt;Shared Memory" vertex="1">
<mxGeometry relative="1" x="-0.0429" y="2" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="m7WE5ZGX3xGycdAAs7q0-19" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="1940" y="440" as="sourcePoint" />
<mxPoint x="1700" y="440" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="m7WE5ZGX3xGycdAAs7q0-20" connectable="0" parent="m7WE5ZGX3xGycdAAs7q0-19" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=16;" value="Write result to&lt;br&gt;Shared Memory" vertex="1">
<mxGeometry relative="1" x="-0.0429" y="2" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="m7WE5ZGX3xGycdAAs7q0-23" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="1940" y="500" as="sourcePoint" />
<mxPoint x="1460" y="500" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="m7WE5ZGX3xGycdAAs7q0-24" connectable="0" parent="m7WE5ZGX3xGycdAAs7q0-23" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=16;" value="Raise Interrupt on ARM&lt;br&gt;&quot;Work done&quot;" vertex="1">
<mxGeometry relative="1" x="-0.0429" y="2" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="m7WE5ZGX3xGycdAAs7q0-25" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="1460" y="560" as="sourcePoint" />
<mxPoint x="1700" y="560" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="m7WE5ZGX3xGycdAAs7q0-26" connectable="0" parent="m7WE5ZGX3xGycdAAs7q0-25" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=16;" value="Read result from&amp;nbsp;&lt;br&gt;Shared Memory" vertex="1">
<mxGeometry relative="1" x="-0.0429" y="2" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="m7WE5ZGX3xGycdAAs7q0-27" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="1700" y="620" as="sourcePoint" />
<mxPoint x="1460" y="620" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="m7WE5ZGX3xGycdAAs7q0-28" connectable="0" parent="m7WE5ZGX3xGycdAAs7q0-27" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=16;" value="Move result to&amp;nbsp;&lt;br&gt;PCM Interface" vertex="1">
<mxGeometry relative="1" x="-0.0429" y="2" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="m7WE5ZGX3xGycdAAs7q0-30" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" target="m7WE5ZGX3xGycdAAs7q0-32" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="1460" y="680" as="sourcePoint" />
<mxPoint x="1260" y="720" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="m7WE5ZGX3xGycdAAs7q0-31" connectable="0" parent="m7WE5ZGX3xGycdAAs7q0-30" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=16;" value="Recieve result from&lt;br&gt;PCM Interface" vertex="1">
<mxGeometry relative="1" x="-0.0429" y="2" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="m7WE5ZGX3xGycdAAs7q0-32" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" value="&lt;b style=&quot;&quot;&gt;&lt;font style=&quot;font-size: 16px;&quot;&gt;CI System&lt;/font&gt;&lt;/b&gt;" vertex="1">
<mxGeometry height="40" width="160" x="1115" y="660" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

196
drawio/fig_dsp_dma.drawio Normal file
View File

@@ -0,0 +1,196 @@
<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36" version="29.2.10">
<diagram name="Page-1" id="biPyHR2u_nhwJtU07GTZ">
<mxGraphModel dx="576" dy="743" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="IjZ5u4x7_LR3Ume5GlYs-10" parent="1" style="rounded=1;whiteSpace=wrap;html=1;labelBackgroundColor=default;fillColor=#dae8fc;strokeColor=#6c8ebf;" value="" vertex="1">
<mxGeometry height="280" width="480" x="960" y="100" as="geometry" />
</mxCell>
<mxCell id="IjZ5u4x7_LR3Ume5GlYs-9" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;" value="RX Register" vertex="1">
<mxGeometry height="30" width="160" x="980" y="170" as="geometry" />
</mxCell>
<mxCell id="H6R4VGwbr_i7cj5zOMue-39" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="0x800000" vertex="1">
<mxGeometry height="30" width="160" x="1220" y="320" as="geometry" />
</mxCell>
<mxCell id="H6R4VGwbr_i7cj5zOMue-42" edge="1" parent="1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;">
<mxGeometry relative="1" as="geometry">
<mxPoint x="1120" y="220.0000000000001" as="sourcePoint" />
<mxPoint x="1120" y="220.0000000000001" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="IjZ5u4x7_LR3Ume5GlYs-1" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" target="IjZ5u4x7_LR3Ume5GlYs-9" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="880" y="185" as="sourcePoint" />
<mxPoint x="1050.72" y="75" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="IjZ5u4x7_LR3Ume5GlYs-11" parent="1" style="text;whiteSpace=wrap;html=1;align=center;" value="&lt;b style=&quot;forced-color-adjust: none; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;&quot;&gt;PCM Interface&lt;br&gt;ARM&lt;/b&gt;" vertex="1">
<mxGeometry height="40" width="130" x="1000" y="110" as="geometry" />
</mxCell>
<mxCell id="IjZ5u4x7_LR3Ume5GlYs-12" parent="1" style="text;whiteSpace=wrap;html=1;" value="&lt;b style=&quot;forced-color-adjust: none; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;&quot;&gt;DMA Input Operation&lt;/b&gt;" vertex="1">
<mxGeometry height="40" width="145" x="1127.5" y="70" as="geometry" />
</mxCell>
<mxCell id="IjZ5u4x7_LR3Ume5GlYs-13" parent="1" style="text;whiteSpace=wrap;html=1;align=center;" value="&lt;div style=&quot;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); font-size: 14px;&quot;&gt;&lt;b&gt;Shared Memory&lt;br&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); font-size: 14px;&quot;&gt;&lt;b&gt;ARM/DSP&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="40" width="130" x="1240" y="110" as="geometry" />
</mxCell>
<mxCell id="IjZ5u4x7_LR3Ume5GlYs-19" edge="1" parent="1" source="Uk31TYlx7ywhMvou_2Fj-2" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="1380" y="264.65999999999997" as="sourcePoint" />
<mxPoint x="1560" y="285" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="IjZ5u4x7_LR3Ume5GlYs-21" parent="1" style="text;whiteSpace=wrap;html=1;fontSize=12;" value="&lt;span style=&quot;color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; float: none; display: inline !important;&quot;&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;Input Data&lt;/font&gt;&lt;/span&gt;" vertex="1">
<mxGeometry height="40" width="110" x="880" y="150" as="geometry" />
</mxCell>
<mxCell id="Uk31TYlx7ywhMvou_2Fj-2" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="0x800004" vertex="1">
<mxGeometry height="30" width="160" x="1220" y="270" as="geometry" />
</mxCell>
<mxCell id="Uk31TYlx7ywhMvou_2Fj-3" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="0x800008" vertex="1">
<mxGeometry height="30" width="160" x="1220" y="220" as="geometry" />
</mxCell>
<mxCell id="Uk31TYlx7ywhMvou_2Fj-4" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="0x80000B" vertex="1">
<mxGeometry height="30" width="160" x="1220" y="170" as="geometry" />
</mxCell>
<mxCell id="Uk31TYlx7ywhMvou_2Fj-5" parent="1" style="text;whiteSpace=wrap;html=1;align=center;fontSize=12;" value="&lt;font style=&quot;font-size: 14px;&quot;&gt;Raise Interrupt&lt;br&gt;on DSP Core&lt;/font&gt;" vertex="1">
<mxGeometry height="40" width="110" x="1450" y="240" as="geometry" />
</mxCell>
<mxCell id="IjZ5u4x7_LR3Ume5GlYs-20" edge="1" parent="1" source="IjZ5u4x7_LR3Ume5GlYs-9" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" target="Uk31TYlx7ywhMvou_2Fj-4" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="1487" y="420" as="sourcePoint" />
<mxPoint x="1390" y="420.6399999999999" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="Uk31TYlx7ywhMvou_2Fj-6" edge="1" parent="1" source="IjZ5u4x7_LR3Ume5GlYs-9" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" target="Uk31TYlx7ywhMvou_2Fj-3" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="1290" y="400" as="sourcePoint" />
<mxPoint x="1340" y="400" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="Uk31TYlx7ywhMvou_2Fj-7" edge="1" parent="1" source="IjZ5u4x7_LR3Ume5GlYs-9" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" target="Uk31TYlx7ywhMvou_2Fj-2" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="1360" y="120" as="sourcePoint" />
<mxPoint x="1410" y="120" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="Uk31TYlx7ywhMvou_2Fj-8" edge="1" parent="1" source="IjZ5u4x7_LR3Ume5GlYs-9" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" target="H6R4VGwbr_i7cj5zOMue-39" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="1510" y="90" as="sourcePoint" />
<mxPoint x="1560" y="90" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="Uk31TYlx7ywhMvou_2Fj-9" parent="1" style="text;whiteSpace=wrap;html=1;align=center;fontSize=10;" value="&lt;div&gt;&lt;span&gt;&lt;b&gt;&lt;font style=&quot;font-size: 12px;&quot;&gt;20 kHz&lt;br&gt;DMA Operation&lt;/font&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="40" width="130" x="1114" y="120" as="geometry" />
</mxCell>
<mxCell id="Uk31TYlx7ywhMvou_2Fj-29" parent="1" style="text;whiteSpace=wrap;html=1;labelBackgroundColor=none;fontColor=default;fontStyle=0;fontSize=10;" value="&lt;span style=&quot;forced-color-adjust: none; font-family: Helvetica; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;&quot;&gt;32 Bit&lt;/span&gt;" vertex="1">
<mxGeometry height="20" width="30" x="1290" y="200" as="geometry" />
</mxCell>
<mxCell id="Uk31TYlx7ywhMvou_2Fj-35" parent="1" style="text;whiteSpace=wrap;html=1;labelBackgroundColor=none;fontColor=default;fontStyle=0;fontSize=10;" value="&lt;span style=&quot;forced-color-adjust: none; font-family: Helvetica; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;&quot;&gt;32 Bit&lt;/span&gt;" vertex="1">
<mxGeometry height="20" width="30" x="1285" y="150" as="geometry" />
</mxCell>
<mxCell id="Uk31TYlx7ywhMvou_2Fj-36" parent="1" style="text;whiteSpace=wrap;html=1;labelBackgroundColor=none;fontColor=default;fontStyle=0;fontSize=10;" value="&lt;span style=&quot;forced-color-adjust: none; font-family: Helvetica; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;&quot;&gt;32 Bit&lt;/span&gt;" vertex="1">
<mxGeometry height="20" width="30" x="1290" y="250" as="geometry" />
</mxCell>
<mxCell id="Uk31TYlx7ywhMvou_2Fj-37" parent="1" style="text;whiteSpace=wrap;html=1;labelBackgroundColor=none;fontColor=default;fontStyle=0;fontSize=10;" value="&lt;span style=&quot;forced-color-adjust: none; font-family: Helvetica; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;&quot;&gt;32 Bit&lt;/span&gt;" vertex="1">
<mxGeometry height="20" width="30" x="1290" y="300" as="geometry" />
</mxCell>
<mxCell id="Uk31TYlx7ywhMvou_2Fj-38" parent="1" style="rounded=1;whiteSpace=wrap;html=1;labelBackgroundColor=default;fillColor=#fff2cc;strokeColor=#d6b656;" value="" vertex="1">
<mxGeometry height="280" width="480" x="960" y="420" as="geometry" />
</mxCell>
<mxCell id="Uk31TYlx7ywhMvou_2Fj-39" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;" value="TX Register" vertex="1">
<mxGeometry height="30" width="160" x="980" y="490" as="geometry" />
</mxCell>
<mxCell id="Uk31TYlx7ywhMvou_2Fj-40" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="0x80000F" vertex="1">
<mxGeometry height="30" width="160" x="1220" y="640" as="geometry" />
</mxCell>
<mxCell id="Uk31TYlx7ywhMvou_2Fj-41" edge="1" parent="1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;">
<mxGeometry relative="1" as="geometry">
<mxPoint x="1120" y="540.0000000000001" as="sourcePoint" />
<mxPoint x="1120" y="540.0000000000001" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="Uk31TYlx7ywhMvou_2Fj-42" edge="1" parent="1" source="Uk31TYlx7ywhMvou_2Fj-39" style="endArrow=classic;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="880" y="505" as="sourcePoint" />
<mxPoint x="880" y="505" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="Uk31TYlx7ywhMvou_2Fj-43" parent="1" style="text;whiteSpace=wrap;html=1;align=center;" value="&lt;b style=&quot;forced-color-adjust: none; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;&quot;&gt;PCM Interface&lt;br&gt;ARM&lt;/b&gt;" vertex="1">
<mxGeometry height="40" width="130" x="1000" y="430" as="geometry" />
</mxCell>
<mxCell id="Uk31TYlx7ywhMvou_2Fj-45" parent="1" style="text;whiteSpace=wrap;html=1;align=center;" value="&lt;div style=&quot;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); font-size: 14px;&quot;&gt;&lt;b&gt;Shared Memory&lt;br&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); font-size: 14px;&quot;&gt;&lt;b&gt;ARM/DSP&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="40" width="130" x="1240" y="430" as="geometry" />
</mxCell>
<mxCell id="Uk31TYlx7ywhMvou_2Fj-46" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" target="Uk31TYlx7ywhMvou_2Fj-48" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="1560" y="605" as="sourcePoint" />
<mxPoint x="1540" y="605" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="Uk31TYlx7ywhMvou_2Fj-47" parent="1" style="text;whiteSpace=wrap;html=1;fontSize=12;" value="&lt;span style=&quot;color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; float: none; display: inline !important;&quot;&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;Output Data&lt;/font&gt;&lt;/span&gt;" vertex="1">
<mxGeometry height="20" width="80" x="880" y="470" as="geometry" />
</mxCell>
<mxCell id="Uk31TYlx7ywhMvou_2Fj-48" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="0x80004F" vertex="1">
<mxGeometry height="30" width="160" x="1220" y="590" as="geometry" />
</mxCell>
<mxCell id="Uk31TYlx7ywhMvou_2Fj-49" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="0x80008F" vertex="1">
<mxGeometry height="30" width="160" x="1220" y="540" as="geometry" />
</mxCell>
<mxCell id="Uk31TYlx7ywhMvou_2Fj-50" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="0x8000BF" vertex="1">
<mxGeometry height="30" width="160" x="1220" y="490" as="geometry" />
</mxCell>
<mxCell id="Uk31TYlx7ywhMvou_2Fj-51" parent="1" style="text;whiteSpace=wrap;html=1;align=center;fontSize=12;" value="&lt;font style=&quot;font-size: 14px;&quot;&gt;Raise Interrupt&lt;br&gt;on ARM Core&lt;/font&gt;" vertex="1">
<mxGeometry height="40" width="110" x="1450" y="560" as="geometry" />
</mxCell>
<mxCell id="Uk31TYlx7ywhMvou_2Fj-52" edge="1" parent="1" source="Uk31TYlx7ywhMvou_2Fj-40" style="endArrow=classic;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" target="Uk31TYlx7ywhMvou_2Fj-39" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="1487" y="740" as="sourcePoint" />
<mxPoint x="1390" y="740.6399999999999" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="Uk31TYlx7ywhMvou_2Fj-56" parent="1" style="text;whiteSpace=wrap;html=1;align=center;fontSize=10;" value="&lt;div&gt;&lt;span&gt;&lt;b&gt;&lt;font style=&quot;font-size: 12px;&quot;&gt;20 kHz&lt;br&gt;DMA Operation&lt;/font&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="40" width="130" x="1114" y="440" as="geometry" />
</mxCell>
<mxCell id="Uk31TYlx7ywhMvou_2Fj-57" parent="1" style="text;whiteSpace=wrap;html=1;labelBackgroundColor=none;fontColor=default;fontStyle=0;fontSize=10;" value="&lt;span style=&quot;forced-color-adjust: none; font-family: Helvetica; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;&quot;&gt;32 Bit&lt;/span&gt;" vertex="1">
<mxGeometry height="20" width="30" x="1290" y="520" as="geometry" />
</mxCell>
<mxCell id="Uk31TYlx7ywhMvou_2Fj-58" parent="1" style="text;whiteSpace=wrap;html=1;labelBackgroundColor=none;fontColor=default;fontStyle=0;fontSize=10;" value="&lt;span style=&quot;forced-color-adjust: none; font-family: Helvetica; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;&quot;&gt;32 Bit&lt;/span&gt;" vertex="1">
<mxGeometry height="20" width="30" x="1285" y="470" as="geometry" />
</mxCell>
<mxCell id="Uk31TYlx7ywhMvou_2Fj-59" parent="1" style="text;whiteSpace=wrap;html=1;labelBackgroundColor=none;fontColor=default;fontStyle=0;fontSize=10;" value="&lt;span style=&quot;forced-color-adjust: none; font-family: Helvetica; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;&quot;&gt;32 Bit&lt;/span&gt;" vertex="1">
<mxGeometry height="20" width="30" x="1290" y="570" as="geometry" />
</mxCell>
<mxCell id="Uk31TYlx7ywhMvou_2Fj-60" parent="1" style="text;whiteSpace=wrap;html=1;labelBackgroundColor=none;fontColor=default;fontStyle=0;fontSize=10;" value="&lt;span style=&quot;forced-color-adjust: none; font-family: Helvetica; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;&quot;&gt;32 Bit&lt;/span&gt;" vertex="1">
<mxGeometry height="20" width="30" x="1290" y="620" as="geometry" />
</mxCell>
<mxCell id="Uk31TYlx7ywhMvou_2Fj-61" edge="1" parent="1" source="Uk31TYlx7ywhMvou_2Fj-48" style="endArrow=classic;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" target="Uk31TYlx7ywhMvou_2Fj-39" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="1610" y="640" as="sourcePoint" />
<mxPoint x="1530" y="490" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="Uk31TYlx7ywhMvou_2Fj-62" edge="1" parent="1" source="Uk31TYlx7ywhMvou_2Fj-49" style="endArrow=classic;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" target="Uk31TYlx7ywhMvou_2Fj-39" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="1580" y="620" as="sourcePoint" />
<mxPoint x="1500" y="470" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="Uk31TYlx7ywhMvou_2Fj-63" edge="1" parent="1" source="Uk31TYlx7ywhMvou_2Fj-50" style="endArrow=classic;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" target="Uk31TYlx7ywhMvou_2Fj-39" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="1640" y="590" as="sourcePoint" />
<mxPoint x="1560" y="440" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="Uk31TYlx7ywhMvou_2Fj-64" parent="1" style="text;whiteSpace=wrap;html=1;labelBackgroundColor=none;fontColor=default;fontStyle=0;fontSize=10;" value="&lt;span style=&quot;forced-color-adjust: none; font-family: Helvetica; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;&quot;&gt;32 Bit&lt;/span&gt;" vertex="1">
<mxGeometry height="20" width="30" x="1045" y="150" as="geometry" />
</mxCell>
<mxCell id="Uk31TYlx7ywhMvou_2Fj-65" parent="1" style="text;whiteSpace=wrap;html=1;labelBackgroundColor=none;fontColor=default;fontStyle=0;fontSize=10;" value="&lt;span style=&quot;forced-color-adjust: none; font-family: Helvetica; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;&quot;&gt;32 Bit&lt;/span&gt;" vertex="1">
<mxGeometry height="20" width="30" x="1050" y="470" as="geometry" />
</mxCell>
<mxCell id="9jqM_zlcDrX7iHHAm0HB-1" parent="1" style="text;whiteSpace=wrap;html=1;" value="&lt;b style=&quot;forced-color-adjust: none; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;&quot;&gt;DMA Output Operation&lt;/b&gt;" vertex="1">
<mxGeometry height="40" width="160" x="1120" y="390" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

View File

@@ -1,6 +1,6 @@
<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36" version="29.2.7"> <mxfile host="app.diagrams.net" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36" version="29.2.7">
<diagram name="Page-1" id="biPyHR2u_nhwJtU07GTZ"> <diagram name="Page-1" id="biPyHR2u_nhwJtU07GTZ">
<mxGraphModel dx="133" dy="1695" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> <mxGraphModel dx="-171" dy="1454" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root> <root>
<mxCell id="0" /> <mxCell id="0" />
<mxCell id="1" parent="0" /> <mxCell id="1" parent="0" />
@@ -36,7 +36,7 @@
<mxPoint x="1370" y="285" as="targetPoint" /> <mxPoint x="1370" y="285" as="targetPoint" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="n_U1TYArYy-J3cMbdSy8-10" connectable="0" parent="n_U1TYArYy-J3cMbdSy8-9" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Buffer full" vertex="1"> <mxCell id="n_U1TYArYy-J3cMbdSy8-10" connectable="0" parent="n_U1TYArYy-J3cMbdSy8-9" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Buffer &lt;br&gt;half full" vertex="1">
<mxGeometry relative="1" x="-0.2357" y="-2" as="geometry"> <mxGeometry relative="1" x="-0.2357" y="-2" as="geometry">
<mxPoint as="offset" /> <mxPoint as="offset" />
</mxGeometry> </mxGeometry>
@@ -104,7 +104,7 @@
<mxPoint x="1370" y="457.5" as="targetPoint" /> <mxPoint x="1370" y="457.5" as="targetPoint" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="n_U1TYArYy-J3cMbdSy8-30" connectable="0" parent="n_U1TYArYy-J3cMbdSy8-29" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Buffer full" vertex="1"> <mxCell id="n_U1TYArYy-J3cMbdSy8-30" connectable="0" parent="n_U1TYArYy-J3cMbdSy8-29" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Buffer &lt;br&gt;half full" vertex="1">
<mxGeometry relative="1" x="-0.2357" y="-2" as="geometry"> <mxGeometry relative="1" x="-0.2357" y="-2" as="geometry">
<mxPoint as="offset" /> <mxPoint as="offset" />
</mxGeometry> </mxGeometry>
@@ -133,7 +133,7 @@
<mxPoint x="1130" y="592.5" as="targetPoint" /> <mxPoint x="1130" y="592.5" as="targetPoint" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="n_U1TYArYy-J3cMbdSy8-40" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" value="&lt;font style=&quot;font-size: 14px;&quot;&gt;sleep&lt;/font&gt;" vertex="1"> <mxCell id="n_U1TYArYy-J3cMbdSy8-40" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" value="&lt;font style=&quot;font-size: 14px;&quot;&gt;wait&lt;/font&gt;" vertex="1">
<mxGeometry height="40" width="70" x="930" y="95" as="geometry" /> <mxGeometry height="40" width="70" x="930" y="95" as="geometry" />
</mxCell> </mxCell>
<mxCell id="n_U1TYArYy-J3cMbdSy8-41" edge="1" parent="1" source="n_U1TYArYy-J3cMbdSy8-40" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" target="H6R4VGwbr_i7cj5zOMue-39" value=""> <mxCell id="n_U1TYArYy-J3cMbdSy8-41" edge="1" parent="1" source="n_U1TYArYy-J3cMbdSy8-40" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" target="H6R4VGwbr_i7cj5zOMue-39" value="">
@@ -152,12 +152,12 @@
<mxPoint x="960" y="310" as="targetPoint" /> <mxPoint x="960" y="310" as="targetPoint" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="n_U1TYArYy-J3cMbdSy8-45" connectable="0" parent="n_U1TYArYy-J3cMbdSy8-44" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Buffer not full" vertex="1"> <mxCell id="n_U1TYArYy-J3cMbdSy8-45" connectable="0" parent="n_U1TYArYy-J3cMbdSy8-44" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Buffer not &lt;br&gt;half full" vertex="1">
<mxGeometry relative="1" x="-0.9032" y="-1" as="geometry"> <mxGeometry relative="1" x="-0.9032" y="-1" as="geometry">
<mxPoint x="1" y="7" as="offset" /> <mxPoint x="1" y="7" as="offset" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="n_U1TYArYy-J3cMbdSy8-46" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" value="&lt;font style=&quot;font-size: 14px;&quot;&gt;sleep&lt;/font&gt;" vertex="1"> <mxCell id="n_U1TYArYy-J3cMbdSy8-46" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" value="&lt;font style=&quot;font-size: 14px;&quot;&gt;wait&lt;/font&gt;" vertex="1">
<mxGeometry height="40" width="70" x="930" y="265" as="geometry" /> <mxGeometry height="40" width="70" x="930" y="265" as="geometry" />
</mxCell> </mxCell>
<mxCell id="n_U1TYArYy-J3cMbdSy8-47" edge="1" parent="1" source="n_U1TYArYy-J3cMbdSy8-46" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" target="n_U1TYArYy-J3cMbdSy8-8" value=""> <mxCell id="n_U1TYArYy-J3cMbdSy8-47" edge="1" parent="1" source="n_U1TYArYy-J3cMbdSy8-46" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" target="n_U1TYArYy-J3cMbdSy8-8" value="">
@@ -176,12 +176,12 @@
<mxPoint x="960" y="480" as="targetPoint" /> <mxPoint x="960" y="480" as="targetPoint" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="n_U1TYArYy-J3cMbdSy8-53" connectable="0" parent="n_U1TYArYy-J3cMbdSy8-52" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Buffer not full" vertex="1"> <mxCell id="n_U1TYArYy-J3cMbdSy8-53" connectable="0" parent="n_U1TYArYy-J3cMbdSy8-52" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Buffer not &lt;br&gt;half full" vertex="1">
<mxGeometry relative="1" x="-0.9032" y="-1" as="geometry"> <mxGeometry relative="1" x="-0.9032" y="-1" as="geometry">
<mxPoint x="1" y="7" as="offset" /> <mxPoint x="1" y="7" as="offset" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="n_U1TYArYy-J3cMbdSy8-54" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" value="&lt;font style=&quot;font-size: 14px;&quot;&gt;sleep&lt;/font&gt;" vertex="1"> <mxCell id="n_U1TYArYy-J3cMbdSy8-54" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" value="&lt;font style=&quot;font-size: 14px;&quot;&gt;wait&lt;/font&gt;" vertex="1">
<mxGeometry height="40" width="70" x="930" y="435" as="geometry" /> <mxGeometry height="40" width="70" x="930" y="435" as="geometry" />
</mxCell> </mxCell>
<mxCell id="n_U1TYArYy-J3cMbdSy8-55" edge="1" parent="1" source="n_U1TYArYy-J3cMbdSy8-54" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" target="n_U1TYArYy-J3cMbdSy8-21" value=""> <mxCell id="n_U1TYArYy-J3cMbdSy8-55" edge="1" parent="1" source="n_U1TYArYy-J3cMbdSy8-54" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" target="n_U1TYArYy-J3cMbdSy8-21" value="">
@@ -205,7 +205,7 @@
<mxPoint as="offset" /> <mxPoint as="offset" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="n_U1TYArYy-J3cMbdSy8-58" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" value="&lt;font style=&quot;font-size: 14px;&quot;&gt;sleep&lt;/font&gt;" vertex="1"> <mxCell id="n_U1TYArYy-J3cMbdSy8-58" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" value="&lt;font style=&quot;font-size: 14px;&quot;&gt;wait&lt;/font&gt;" vertex="1">
<mxGeometry height="40" width="70" x="930" y="610" as="geometry" /> <mxGeometry height="40" width="70" x="930" y="610" as="geometry" />
</mxCell> </mxCell>
<mxCell id="n_U1TYArYy-J3cMbdSy8-59" edge="1" parent="1" source="n_U1TYArYy-J3cMbdSy8-58" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" value=""> <mxCell id="n_U1TYArYy-J3cMbdSy8-59" edge="1" parent="1" source="n_U1TYArYy-J3cMbdSy8-58" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" value="">

View File

@@ -1,6 +1,6 @@
<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36" version="29.2.7"> <mxfile host="app.diagrams.net" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36" version="29.2.10">
<diagram name="Page-1" id="biPyHR2u_nhwJtU07GTZ"> <diagram name="Page-1" id="biPyHR2u_nhwJtU07GTZ">
<mxGraphModel dx="1426" dy="863" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> <mxGraphModel dx="1426" dy="743" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root> <root>
<mxCell id="0" /> <mxCell id="0" />
<mxCell id="1" parent="0" /> <mxCell id="1" parent="0" />
@@ -22,7 +22,7 @@
<mxPoint x="1060" y="170" as="targetPoint" /> <mxPoint x="1060" y="170" as="targetPoint" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="IjZ5u4x7_LR3Ume5GlYs-3" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" value="&lt;span style=&quot;font-size: 14px;&quot;&gt;&lt;b&gt;DSP&lt;/b&gt;&lt;/span&gt;" vertex="1"> <mxCell id="IjZ5u4x7_LR3Ume5GlYs-3" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" value="&lt;span style=&quot;font-size: 14px;&quot;&gt;&lt;b&gt;DSP Core&lt;/b&gt;&lt;/span&gt;" vertex="1">
<mxGeometry height="240" width="120" x="1460" y="100" as="geometry" /> <mxGeometry height="240" width="120" x="1460" y="100" as="geometry" />
</mxCell> </mxCell>
<mxCell id="H6R4VGwbr_i7cj5zOMue-41" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;" value="&lt;font style=&quot;font-size: 14px;&quot;&gt;Input Register&lt;/font&gt;" vertex="1"> <mxCell id="H6R4VGwbr_i7cj5zOMue-41" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;" value="&lt;font style=&quot;font-size: 14px;&quot;&gt;Input Register&lt;/font&gt;" vertex="1">