Цифровой режекторный фильтр
Дипломная работа - Компьютеры, программирование
Другие дипломы по предмету Компьютеры, программирование
фильтра можно составить разностное уравнение следующего вида:
,280448(D) = 0,01000111(B)
Предположим, x(n-2) хранится в ОЗУ с адресом X2, а результат надо записать по адресу P2 тогда модуль умножения отiета на 0,280448 будет выглядеть следующим образом:
Число тактов на выполнение командыLDA X213ARHL 7ARHL7ADD H4ARHL7ARHL 7ARHL7ARHL7ADD H4ARHL7ADD H4ARHL7ADD H4MOVE P2,H 7Всего: 92
0.66655(D) = 0.10101010(B);
Предположим, x(n-1) хранится в ОЗУ с адресом X1, а результат надо записать по адресу P2 тогда модуль умножения отiета на 0,66655 будет выглядеть следующим образом:
Число тактов на выполнение командыLDA X113ARHL 7MOV H,A7ARHL7ARHL 7ADD H4ARHL7ARHL7ADD H4ARHL7ARHL7ADD H4MOVE P1,H 7Всего: 89
Раiет реального быстродействия устройства
Как было подiитано ранее число тактов на выполнение умножений равно 2(92+89)=362. Помимо этого в процессе определения выходного отiета необходимо выполнить 24 операции сложения, которые занимают в общей сложности 24(7+4+7)=432 такта. Т.о. в общее число тактов, необходимых для вычисления одного выходного отiета равно 794 такта.
Мы дискретизируем входной сигнал iастотой 15 кГц, тогда максимальное время, затрачиваемое на обработку одного выходного отiета равно .
При тактовой частоте 1,5 МГц время обработки одного выходного отiета равно . Это нас не устраивает, поэтому придется поменять элементную базу. Вместо микропроцессора будет использоваться ПЛИС фирмы ALTERA семейства FLEX10K. Программа разрабатывалась на языке AHDL с помощью пакета MAX+2.
Модуль программы без вычитателя выглядит следующим образом:
*************************************************************"ku";"summator";"n";"nn";filter
([7..0]: INPUT =GND;: INPUT;[15..0] : OUTPUT;
)_HRAN : ku;[3..0] : summator;[1..0] : nn;[1..0] : n;_HRAN.takt = TAKT;[].takt = TAKT;[1..0].takt = TAKT;[1..0].takt = TAKT;_HRAN.vhod[7..0] = VHOD[7..0];[0].vhod[7..0] = REG_HRAN.vihod[15..8];[1].vhod[7..0] = REG_HRAN.vihod[39..32];[0].vhod[7..0] = REG_HRAN.vihod[23..16];[1].vhod[7..0] = REG_HRAN.vihod[31..24];
%суммируем коэффициенты с отрицательным знаком%
SUMMER[0].a[7..0] = REG_HRAN.vihod[7..0];[0].b[7..0] = shesty[0].vihod[7..0];[1].a[7..0] = try[1].vihod[7..0];
SUMMER[1].b[7..0] = SUMMER[0].sum[7..0];
%суммируем коэффициенты с положительным знаком%
SUMMER[2].a[7..0] = REG_HRAN.vihod[47..40];[2].b[7..0] = shesty[1].vihod[7..0];[3].a[7..0] = try[0].vihod[7..0];[3].b[7..0] = SUMMER[2].sum[7..0];[7..0] = SUMMER[3].sum[7..0];
VIHOD[15..8] = SUMMER[1].sum[7..0];;
************************************************************
Модули подпрограмм, использованных в головном проекте:
*************************************************************"summator";"mult";N
([7..0] : INPUT =GND;[7..0]: OUTPUT;: INPUT;
)[2..0] : summator;:mult;
%подсоединен тактовый сигнал%
SUMMER[2..0].takt = TAKT;.takt = TAKT;
%блок домножения входного отiета на коэффициент 0,280448%
.vhod[7..0] = VHOD[7..0];
%блок суммирования для n-1 отiета%
SUMMER[0].a[7..0] = VHOD[7..0];[0].b[7..0] = VHOD[7..0];[1].a[7..0] = VHOD[7..0];[1].b[7..0] = MULTI.vihod[7..0];[2].a[7..0] = SUMMER[0].sum[7..0];[2].b[7..0] = SUMMER[1].sum[7..0];
VIHOD[7..0] = SUMMER[2].sum[7..0];;
*************************************************************
%регистр хранения входных отiетов
..0 последний отiет по убыванию
..8 предпоследний отiет по убыванию и т.д.
23..16
..24
..32
..40 n-5 отiет %ku
([7..0] : INPUT ;: INPUT;[47..0] : OUTPUT;
)[47..0] : dffe;[].clk = takt;[].ena = VCC;[7..0] = VHOD[7..0];i in 9 to 48 generate[i-1].d = Tr[i-9].q;generate;
VIHOD[]=Tr[].q; ;
*************************************************************
%программа перемножитель 8-битного числа на коэффициент 0,280448%
INCLUDE "summator.inc";mult
([7..0] : INPUT;: INPUT;[7..0] : OUTPUT;
): summator;: summator;.takt=takt;.takt=takt;.a[5..0]=vhod[7..2];.b[1..0]=vhod[7..6];.a[6..0]=su0.sum[6..0];.b[0]=vhod[7];
vihod[7..0]=su1.sum[7..0];;
*************************************************************
%программа перемножитель 8-битного числа на коэффициент 0,66655
10101010%"summator.inc";multt
([7..0] : INPUT;: INPUT;[7..0] : OUTPUT;
): summator;: summator;: summator;.takt=takt;.takt=takt;.takt=takt;.a[6..0]=vhod[7..1];.b[4..0]=vhod[7..3];.a[2..0]=vhod[7..5];.b[0]=vhod[7];.a[7..0]=su0.sum[7..0];.b[7..0]=su1.sum[7..0];[7..0]=su2.sum[7..0];;
*************************************************************"summator";"multt";NN
([7..0] : INPUT =GND;[7..0]: OUTPUT;: INPUT;
)[5..0] : summator;:multt;
%подсоединен тактовый сигнал%
SUMMER[5..0].takt = TAKT;.takt = TAKT;
%блок домножения входного отiета на коэффициент 0,280448%
.vhod[7..0] = VHOD[7..0];
%блок суммирования для n-1 отiета%
SUMMER[0].a[7..0] = VHOD[7..0];[0].b[7..0] = VHOD[7..0];[1].a[7..0] = VHOD[7..0];[1].b[7..0] = VHOD[7..0];[2].a[7..0] = VHOD[7..0];[2].b[7..0] = VHOD[7..0];[3].a[7..0] = SUMMER[0].sum[7..0];[3].b[7..0] = MULTTI.vihod[7..0];[4].a[7..0] = SUMMER[1].sum[7..0];[4].b[7..0] = SUMMER[2].sum[7..0];[5].a[7..0] = SUMMER[3].sum[7..0];[5].b[7..0] = SUMMER[4].sum[7..0];[7..0] = SUMMER[5].sum[7..0];;
*************************************************************"summator";"mult";N
([7..0] : INPUT =GND;[7..0]: OUTPUT;: INPUT;
)[2..0] : summator;:mult;
%подсоединен тактовый сигнал%
SUMMER[2..0].takt = TAKT;.takt = TAKT;
%блок домножения входного отiета на коэффициент 0,280448%
.vhod[7..0] = VHOD[7..0];
%блок суммирования для n-1 отiета%
SUMMER[0].a[7..0] = VHOD[7..0];[0].b[7..0] = VHOD[7..0];[1].a[7..0] = VHOD[7..0];[1].b[7..0] = MULTI.vihod[7..0];[2].a[7..0] = SUMMER[0].sum[7..0];[2].b[7..0] = SUMMER[1].sum[7..0];
VIHOD[7..0] = SUMMER[2].sum[7..0];;
*************************************************************
%программа сумматор для двух восьмибитных чисел%
SUBDESIGN summator
(
a[7..0],b[7..0] : INPUT = GND;: INPUT;[7..0] : OUTPUT;
)[7..1]:node;[7..0]: dff;:dff;[7..0].clk = takt;[7..0].prn = VCC;[7..0].clrn = VCC;.clk=takt;.prn=VCC;(a[0]&b[0])==VCC then[0]=GND;[1]=VCC;(a[0]#b[0])==GND then[0]=GND;[1]=GND;sum[0]=VCC;[1]=GND;if;i in 1 to 6 generate(a[i]&b[i]&c[i])==VCC then[i]=VCC;[i+1]=VCC;(a[i]#b[i]#c[i])==GND then[i]=GND;[i+1]=GND;
(((a[i]&b[i])#(a[i]&c[i])#(b[i]&c[i]))&!(a[i]&b[i]&c[i]))==VCC then[i]=GND;[i+1]=VCC;sum[i]=VCC;[i+1]=GND;if ;generate;(a[7]&b[7]&c[7])==VCC then[7]=VCC;=VCC;(a[7]#b[7]#c[7])==GND then[7]=GND;=GND;(((a[7]&b[7])#(a[7]&c[7])#(b[7]&c[7]))&!(a[7]&b[7]&c[7]))==VCC then[7]=GND;=VCC;sum[7]=VCC;=GND;if;;
*************************************************************
Правильность работы программы можно проверить по временным диаграммам. Время работы программы 3 тактовых импульса. Поэтому тактовая частота должна быть 45 кГц, что вполне реализуемо, если учесть, что границы тактовых частот для ПЛИС семейства FLEX10K иiисляются МГц.
EFP10K10LC84-3
Спи?/p>