[an error occurred while processing this directive]
AHDL(+)
(«Телесистемы»: Конференция «Программируемые логические схемы и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Question 19 июля 2004 г. 08:59

Написал такую программу. Но существует узкое место (ограничивает быстродействие) - строка:
compareIZP = (CntIZP[].q == Duration[].q);
сравнение регистровых выходов. Операция конечно асинхронная, но результат сравнения я далее пропускаю уже через триггер на глобальной частоте (произвожу синхронизацию). И все-таки частота падает. Если же сравнение производить просто с двоичным числом, такого плана:
compareIZP = (CntIZP[].q == B"0011111011101111");
то уменьшения быстродействия не происходит. Не подскажет ли кто выхода из ситуации. Как сделать так, чтобы частота не падала при сравнении триггерных выходов.


SUBDESIGN Pult_UFSS
(
Data[7..0] : INPUT;
Add[2..0] : INPUT;
Wr : INPUT;
F56 : INPUT;
reset : INPUT;

FD[15..0] : OUTPUT;
FA[9..0] : OUTPUT;
WrFSS : OUTPUT;
TI : OUTPUT;
IZP : OUTPUT;
)

variable
countTI [20..0] : dff;
decision : dff;
compare : node;

Duration[15..0] : dffe;
Period[15..0] : dffe;
DataFss[15..0] : dffe;
AddFss[9..0] : dffe;
EnaWrFss : dffe;
EnaTI : dffe;
EnaIZP : dffe;
Choice[7..0] : node;

CntIZP[15..0] : dff;
decisionIZP : dff;
compareIZP : node;

begin
--блок приема и обработки
Duration[].clrn = reset;
Duration[15..8].d = Data[];
Duration[7..0].d = Data[];
Duration[].clk = Wr;
Duration[15..8].ena = Choice0;
Duration[7..0].ena = Choice1;

Period[].clrn = reset;
Period[15..8].d = Data[];
Period[7..0].d = Data[];
Period[].clk = Wr;
Period[15..8].ena = Choice2;
Period[7..0].ena = Choice3;

DataFss[].clrn = reset;
DataFss[15..8].d = Data[];
DataFss[7..0].d = Data[];
DataFss[].clk = Wr;
DataFss[15..8].ena = Choice4;
DataFss[7..0].ena = Choice5;
FD[15..8] = DataFss[15..8].q;
FD[7..0] = DataFss[7..0].q;

AddFss[].clrn = reset;
AddFss[9..2].d = Data[];
AddFss[1..0].d = Data[7..6];
AddFss[].clk = Wr;
AddFss[9..2].ena = Choice6;
AddFss[1..0].ena = Choice7;
FA[9..2] = AddFss[9..2].q;
FA[1..0] = AddFss[1..0].q;

EnaWrFss.clrn = reset;
EnaWrFss.d = Data5;
EnaWrFss.clk = Wr;
EnaWrFss.ena = Choice7;
WrFSS = EnaWrFss.q;

EnaTI.clrn = reset;
EnaTI.d = Data4;
EnaTI.clk = Wr;
EnaTI.ena = Choice7;

EnaIZP.clrn = reset;
EnaIZP.d = Data3;
EnaIZP.clk = Wr;
EnaIZP.ena = Choice7;

case Add[] is
when 0 => Choice0 = B"1";
when 1 => Choice1 = B"1";
when 2 => Choice2 = B"1";
when 3 => Choice3 = B"1";
when 4 => Choice4 = B"1";
when 5 => Choice5 = B"1";
when 6 => Choice6 = B"1";
when 7 => Choice7 = B"1";
end case;

--формирователь ИЗП------------------------------------
compareIZP = (CntIZP[].q == Duration[].q);

decisionIZP.clk = global(F56);
decisionIZP.clrn = reset;
decisionIZP.d = compareIZP;

CntIZP[].clk = global(F56);
CntIZP[].clrn = reset;
if decisionIZP.q then
CntIZP[].d = Period[].q;
else
CntIZP[].d = CntIZP[].q-1;
end if;
IZP = CntIZP15.q & EnaIZP;

--Формирователь ТИ------------------------------------
compare = (countTI[].q == B"111111111111110010001");

decision.clk = global(F56);
decision.clrn = reset;
decision.d = compare;

countTI[].clk = global(F56);
countTI[].clrn = reset;
if decision.q then
countTI[].d = B"010001100011000011001";
else
countTI[].d = countTI[].q-1;
end if;
TI = !countTI20.q & EnaTI;
end;

Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru