Введение
В данной курсовой работе стоит задача разработать специализированное цифровое устройство - процессор CORDIC, являющееся отдельным законченным модулем для расчёта значений обратной тригонометрической функции arcSin(Z) и функции возведения в степень числа arCth(Z).
Устройство такого рода может использоваться в сложной комплексной системе, реализующей расчёт координат, расстояния или размера объекта, либо может найти своё применение в системах навигации и позиционирования. Такие приборы широко используются в различных сферах жизнедеятельности, начиная от строительных площадок и заканчивая сверхточными системами позиционирования объектов в космосе.
Данное устройство должно сочетать в себе как высокое быстродействие, так и необходимую точность вычисления. Исходя из задания, в основе работы устройства лежит метод Волдера «Цифра за цифрой». Этот метод представляет собой ряд итерационных формул, в результате расчёта которых происходит процесс поворота вектора до нужного угла.
Общая идея метода сводится к следующему. Последовательным умножением аргумента на заранее выбранные константы, приблизить аргумент с заданной точностью для одних функций к единице, для других функций - к нулю. Однако, для того, чтобы само значение функции при этом оставалось неизменным, необходимо одновременно совершать эквивалентные действия над выбранными константами. При выборе значений констант особым образом удается существенно упростить вычисления значений функции.
Промоделировав математическую модель метода Волдера в пакете Scilab, ее необходимо реализовать практически на интегральных микросхемах. Построить такое устройство можно как на отдельных микросхемах низкой степени интеграции выполняющих определённые функции, либо на программируемой логической матрице, либо на готовом микроконтроллере.
Каждый из этих способов имеет свои преимущества и недостатки, поэтому необходимо выбрать наиболее эффективный и экономичный среди них.
Для построения устройства на ПЛИС необходимо его смоделировать в САПР на языке VHDL. При использовании микроконтроллера необходимо написать программу либо на языке ASSEMBLER, либо на любом другом языке программирования высокого уровня, например C++. Таким образом, разработка и построение цифрового устройства является комплексной и весьма сложной задачей, требующей глубоких знаний во многих компьютерных дисциплинах.
Большинство цифровых систем строится на микропроцессорах либо на микроконтроллерах. И при помощи микропроцессорных систем происходит управление различными технологическими процессами и отдельными операциями. Данные системы практически универсальны, так как они имеют очень высокое быстродействие, и достаточную разрядность для выполнения точных расчетов на производстве. А так же используя в данных системах ППЗУ возможно при помощи одной компьютерной системы управление различным оборудованием. То есть необходимо изменение только программы управления.
1. АНАЛИЗ ПОСТАВЛЕННОЙ ЗАДАЧИ
В курсовой проекте необходимо реализовать специализированный математический процессор для вычисления элементарных функций arcSin(Z) и arCth(Z).
Эти функции можно реализовать методом Волдера «Цифра за цифрой», метод Меджита и др. Оба эти метода основаны на ряде итерационных формул, которые приведены в таблице 1.1. Основное их различие заключается в том, что в методе Меджита на первом этапе сразу рассчитываются все направляющие коэффициенты. В данном устройстве будем использоваться метод Волдера «Цифра за цифрой», так как он требует меньших аппаратных затрат и обладает достаточной точностью вычислений.
В таблице 1 приведены итерационные формулы для вычисления заданных элементарных функций по методу Волдера «Цифра за цифрой».
Табл.1 - Метод Волдера для расчёта ArcSin(z).
Вычисление | |
Вычисление | |
Данное устройство должно являться частью комплексного прибора, поэтому оно должно иметь разъём для подключения и все соответствующие интерфейсные сигналы.
Устройство получает данные от главного модуля и передаёт ему обратно результат. Данные передаются в формате с фиксированной точкой. На целую часть отводится 7 разрядов и 1 знаковый, на дробную часть также отводится 16 разрядов. Передача осуществляется по интерфейсу I2C(TWI). Выбран именно этот интерфейс так как в нём реализовано распознавание пакетов (начало, конец, распознавание собственных адресов для каждого устройства, что является хорошим способом и альтернативным вариантом для предотвращения коллизий).
1.1 Расчет разрядности представления данных и числа итераций
Произведём расчёт числа итераций и разрядности в математическом пакете SciLab.
Определим диапазон допустимых значений заданных элементарных функций. Исследуем итерационные формулы для вычисления Θ = arcth Z:
Тогда границы значений функции, при которых метод Волдера является верным, лежит в следующем пределе:
При этом Z для функции Θ = arch Z должно находиться в следующем диапазоне:
Определим диапазон допустимых значений аргументов функции 2Z, а затем диапазон значений само функции.
Тогда границы значений функции, при которых метод Волдера является верным, лежит в следующем пределе:
Следовательно функция будет изменяться в диапазоне:
.Рассчитаем минимальное число итераций при погрешности преобразования равной 0,01% и максимальной выходной величине 4,685:
Тогда количестово разрядов данных составит:
.1.2 Разработка итерационных алгоритмов вычисления функции в математическом пакете SciLab
Промоделируем в пакете математического моделирования MatLab метод Волдера «Цифра за цифрой» для анализа его работоспособности и определения погрешности вычислений.
В цикле подсчитаем значение абсолютной погрешности при изменении количества итераций от 1 до n и при изменении разрядности данных (дробная часть задается от 1 до 16 бит).
Листинг программы для исследования погрешности при изменении числа итераций:
//== function arch ====
//function [archZ] = arch(Z,N)
Q0 = 0;
x0 = 0.6072529;
y0 = 0;
N=20;
Z= 0.512
acos_ist = asin(Z)
for n=1:N
Q(1)=Q0+atan(2^(-0));
r(1)=sign(Z-y0);
x(1)=x0-y0*2^(-0);
y(1)=y0+x0*2^(-0);
for i=1:n
r(i)=sign(Z-y(i));
// ARTH =atan(2^(-i));
Q(i+1)= Q(i)+r(i)*atan(2^(-i));
x(i+1)= x(i)-r(i)*y(i)*2^(-i);
y(i+1)= y(i)+r(i)*x(i)*2^(-i);
end
arcsinZ(n)= Q(n);
asin_ist = asin(Z);
pogr(n)=(asin_ist-arcsinZ(n))/asin_ist*100;
end
scf(1);
clf();
plot(pogr);
xgrid();
//endfunction
//////////////////////////////////////////////////////////////
Q0 = 0;
x0 = 0.6072529;
y0 = 0;
for n=1:20
m=3;
Q(1)=Q0+atan(2^(-0));
Q(1)=conv(n,m,Q(1));
r(1)=sign(Z-y0);
x(1)=x0-y0*2^(-0);
x(1)=conv(n,m,x(1));
y(1)=y0+x0*2^(-0);
y(1)=conv(n,m,y(1));
for i=1:20
r(i)=sign(Z-y(i));
// ARTH =atan(2^(-i));
Q(i+1)= Q(i)+r(i)*atan(2^(-i));
Q(i+1)=conv(n,m,Q(i+1));
x(i+1)= x(i)-r(i)*y(i)*2^(-i);
x(i+1)=conv(n,m,x(i+1));
y(i+1)= y(i)+r(i)*x(i)*2^(-i);
y(i+1)=conv(n,m,y(i+1));
end
arcsinZ(n)= Q(20);
asin_ist = asin(Z);
pogr(n)=(asin_ist-arcsinZ(n))/asin_ist*100;
end
scf(2);
clf();
plot(pogr);
xgrid();
Запустив приведенную программу, мы получим график зависимости погрешности от числа итераций:
Рис.1.1 - График абсолютной погрешности для функции Θ = arcsin Z при изменяющемся числе итераций
По полученным графикам видно как ведёт себя погрёшность преобразования. При количестве итераций меньше 10 погрешность достигает 5%. По заданию требуется, чтобы погрешность составляла меньше 1%, это достигается при n = 13 и более.
Листинг программы для изменения разрядности данных:
clear
clc
//== function convert real to bin ====
function [x_bin] = conv(n,m,x)
//преобразование целой части
x_int = abs(int(x));
x_tmp=x_int;
for j=1:m
x_tmp = x_tmp/2
if (x_tmp-int(x_tmp))==0
arr_tmp(j)=0
else
arr_tmp(j)=1
x_tmp = int(x_tmp)
end
end
x_cel = 0;
for j=1:m
x_cel = x_cel+arr_tmp(j)*2^(j-1)
end
//преобразование дробной части
x_real = x- x_int;
for i=1:n,
x_real = x_real * 2;
if x_real<1
arr(i)=0;
else
arr(i)=1;
x_real=x_real-1;
end,
x_real1=1-int(x_real)
end
x_new=0;
for i=1:n
x_new=x_new+arr(i)*2^(-i)
end
x_bin=x_cel+x_new
endfunction
Рис.1.2 - График абсолютной погрешности для функции Θ = arch Z при изменении разрядности дробной части