141 lines
7.9 KiB
TeX
141 lines
7.9 KiB
TeX
|
\documentclass[a4paper,fontsize=14bp]{article}
|
|||
|
|
|||
|
\input{../common-preamble}
|
|||
|
\input{../bmstu-preamble}
|
|||
|
\input{../fancy-listings-preamble}
|
|||
|
\setcounter{secnumdepth}{0}
|
|||
|
\numerationTop
|
|||
|
|
|||
|
\begin{document}
|
|||
|
\thispagestyle{empty}
|
|||
|
\makeBMSTUHeader
|
|||
|
|
|||
|
% ... работе, номер, тема, предмет, ?а, кто
|
|||
|
\makeReportTitle{лабораторной}{1}{Исследование команд обработки сигналов}{Микропроцессорные устройства обработки сигналов}{}{А.И. Германчук}
|
|||
|
\newpage
|
|||
|
\thispagestyle{empty}
|
|||
|
\tableofcontents
|
|||
|
\newpage
|
|||
|
\pagestyle{fancy}
|
|||
|
\section{Цель}
|
|||
|
Целью лабораторной работы является знакомство с интегрированной средой разработки программ Code Composer Studio (CCS) компании Texas Instruments. Лабораторная работа заключается в написании в соответствие с выданным индивидуальным заданием текстов несложных программ на языке C и ассемблера, создании нового проекта в CCS, компиляции и отладке разработанных программ с помощью симулятора микропроцессора TMS320C5515 или оценочной платы TMS320C5515 DSP Evaluation Module (TMDXEVM5515).
|
|||
|
|
|||
|
\section{Выполнение}
|
|||
|
Индивидуальным заданием было написание функции умножения и сложения с насыщением и округлением: \code{long _smacr(long src1, int src2, int src3)}. В учебном пособии \cite[с. 6-68]{dsp:lectures} и технической документацией \cite{ti:dsp-mnemonics} описаны как процессы умножения со сложением, так и используемые тестовые данные для проверки работоспособности.
|
|||
|
|
|||
|
Согласно документации \cite[с. 77 (3-33)]{ti:dsp-prog-guide} прототип низкоуровневой функции и описание аргументов функции на языке Си имеют вид, представленный в таблице \hrf{table:prototype}. Функция осуществляет умножение операторов \code{op1} и \code{op2}, сдвиг полученного результата влево на один разряд, складывает результат со значением параметра \code{src}, округляет результат, добавляя число 215 и обнуляет младшие 16 разрядов.
|
|||
|
|
|||
|
\begin{table}[H]
|
|||
|
\captionsetup{labelsep=endash}
|
|||
|
\centering
|
|||
|
\caption{Прототип и описание действия функции}
|
|||
|
\label{table:prototype}
|
|||
|
\begin{tabular}{|p{55mm}|p{110mm}|}
|
|||
|
\hline
|
|||
|
Прототип функции & Верхнеуровневое описание \\ [3ex]
|
|||
|
\hline
|
|||
|
\multirow{2}{54mm}{\code{long _smacr(long src, int op1, int op2)}} & Multiplies \code{op1} and \code{op2}, shifts the result left by 1, adds the result to \code{src}, and then rounds the result by adding 215 and zeroing out the lower 16 bits. (SATD, SMUL, and FRCT bits set).\\
|
|||
|
\cline{2-2}
|
|||
|
& Returns the saturated sum of src1 and the fractional-mode product of src2 and src3. The sum is rounded as if the intrinsic \code{_sround} were used. \\ [5ex]
|
|||
|
\hline
|
|||
|
\end{tabular}
|
|||
|
\end{table}
|
|||
|
|
|||
|
В наборе команд микропроцессора TMS320C55x \cite{ti:dsp-mnemonics} имеется команда, позволяющая реализовать умножение с насыщением и округлением. \code{MAC} – данная инструкция выполняет умножение и суммирование.
|
|||
|
|
|||
|
Команда MAC имеет следующий синтаксис \cite[с. 273]{ti:dsp-mnemonics}:
|
|||
|
\begin{center} \code{MAC[R] ACx, Tx, ACy[, ACy]},\end{center}
|
|||
|
где:
|
|||
|
\begin{itemize}
|
|||
|
\item [] MAC – мнемоника команды умножения со сложением;
|
|||
|
\item [] R – признак округления результата операции;
|
|||
|
\item [] Tx - 16-разрядные регистры T0, T1;
|
|||
|
\item [] ACx и ACy – регистр аккумулятор AC0-AC3.
|
|||
|
\end{itemize}
|
|||
|
Необязательный параметр (5) заключён в квадратные скобки.
|
|||
|
|
|||
|
Эта инструкция выполняет умножение и сложение. Входящие операнды умножителя ACx(32−16) и значение Tx знаково расширяются до 17 битов по формуле (\hrf{eq:expanding})
|
|||
|
\begin{equation}
|
|||
|
ACy = ACy + (ACx * Tx).
|
|||
|
\label{eq:expanding}
|
|||
|
\end{equation}
|
|||
|
|
|||
|
Умножение с накоплением чисел разной разрядности происходит как показано на рис. \hrf{pic:mac}. Для повторения этого действия необходимо переместить параметр, переданный в регистре \code{T0} в регистр большей разрядности \code{AC1} (строка \hrf{line:moving-to-hi}). Полный листинг ассемблерной команды (\hrf{code:prog-asm}) представлен в приложении \hrf{appendix:fulls}.
|
|||
|
\begin{figure}[H]
|
|||
|
\centering
|
|||
|
\includegraphics[height=5cm]{01lab-rpt-mac.png}
|
|||
|
\caption{Умножение с накоплением}
|
|||
|
\label{pic:mac}
|
|||
|
\end{figure}
|
|||
|
|
|||
|
\section{Результаты работы}
|
|||
|
После запуска проверочной программы (\hrf{code:prog-c}) представленной в приложении \hrf{appendix:fulls} было доказано совпадение результатов библиотечной функции и описанной в листинге \hrf{code:prog-asm}. Снимки экрана, демонстрирующие идентичность полученных результатов представлены на рис. \hrf{pic:result}.
|
|||
|
|
|||
|
\begin{figure}[H]
|
|||
|
\centering
|
|||
|
\begin{subfigure}[b]{0.7\textwidth}
|
|||
|
\centering
|
|||
|
\includegraphics[width=\textwidth]{01lab-rpt-1.png}
|
|||
|
\end{subfigure}
|
|||
|
|
|||
|
\begin{subfigure}[b]{0.7\textwidth}
|
|||
|
\centering
|
|||
|
\includegraphics[width=\textwidth]{01lab-rpt-2.png}
|
|||
|
\end{subfigure}
|
|||
|
\caption{Результаты вызова функций \code{_smacr} и \code{lab1}}
|
|||
|
\label{pic:result}
|
|||
|
\end{figure}
|
|||
|
|
|||
|
|
|||
|
\newpage
|
|||
|
\printbibliography[heading=bibintoc, title={Список литературы}, resetnumbers=1]
|
|||
|
|
|||
|
\newpage
|
|||
|
\appendix
|
|||
|
\section*{Приложения}
|
|||
|
\addcontentsline{toc}{section}{Приложения}
|
|||
|
\renewcommand{\thesubsection}{\Alph{subsection}}
|
|||
|
|
|||
|
\subsection{Полные листинги программ}
|
|||
|
\label{appendix:fulls}
|
|||
|
\begin{lstlisting}[language=C,style=CCodeStyle,caption={Программа на языке С}, label=code:prog-c]
|
|||
|
#include "stdio.h"
|
|||
|
|
|||
|
#define SIZE 2
|
|||
|
|
|||
|
//long _smacr(long src1, int src2, int src3);
|
|||
|
extern long lab1(long, int, int);
|
|||
|
|
|||
|
void main(void) {
|
|||
|
//Локальные переменные
|
|||
|
int i;
|
|||
|
int intValues[] = {0x00008001, 0xFFFE0001};
|
|||
|
long longValues[] = {0x00008001, 0xFFFE0001};
|
|||
|
|
|||
|
long result_lib;
|
|||
|
long result_lab;
|
|||
|
for (i = 0; i < SIZE; ++i) {
|
|||
|
result_lib = 10;
|
|||
|
result_lab = 10;
|
|||
|
result_lib = _smacr(result_lib, longValues[i], intValues[i]);
|
|||
|
result_lab = lab1(result_lab, longValues[i], intValues[i]);
|
|||
|
int neq = result_lib - result_lab;
|
|||
|
}
|
|||
|
}
|
|||
|
\end{lstlisting}
|
|||
|
|
|||
|
\begin{lstlisting}[style=ASMStyle,caption={Описание функции на языке ассемблера}, label=code:prog-asm]
|
|||
|
.def _lab1
|
|||
|
.text
|
|||
|
|
|||
|
_lab1:
|
|||
|
BSET FRCT
|
|||
|
BSET SATD
|
|||
|
MOV T1,HI(AC1) <@\label{line:moving-to-hi}@>
|
|||
|
MACR AC1, T0, AC0
|
|||
|
RET
|
|||
|
\end{lstlisting}
|
|||
|
|
|||
|
\end{document}
|
|||
|
|