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

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

Отправлено 01 февраля 2004 г. 22:50
В ответ на: To SM .. Подскажите пожалуйста как поднять скорость счетчика. Входная частота внешняя. Как его сделать конвейерным способом? Где материалы посмотреть по этому вопросу? Спасибо. отправлено АлГа 01 февраля 2004 г. 14:12

используйте конвейеризацию. Сначала надо определиться с семейством ПЛИС. Возьмем ACEX1K. У него есть быстрые carry chain, а LUT в обычном режиме имеет 4 входа. Также есть "cascade chain", тоже скоростные. Итого, допустим, Вам нужен 32-битный счетчик. А при задействовании carry chain больше 8-битного никак по скорости не выходит. Тогда делаете следующее. Синтезируете 4 8-битных счетчика с разрешением. Их вид донельзя простой (AHDL):

cnt_l[7..0]:dffe;
-- ......
cnt_l[].clk=clock;
cnt_l[].ena=enable;
cnt_l[]=cnt+1;

cnt[]=cnt[]+1 синтезатор оформляет стандартным счетчиком с использованием carry chain и разделения LUT в режиме "clearable counter". Далее. Первые, младшие 8 бит вход "enable" не используют, они считают всегда. Туда надо единицу (VCC) подать. Следующие за ними 8 бит должны увеличится на 1, только когда происходит перенос их предыдущих. Для этого на вход разрешения триггеров надо подать 1 в тот момент, когда младшие 8 бит равны 0xFF. Для минимизации задержек делаем эту цепи синхронной, она дает задержку на лишний такт. То есть на входе триггера должна быть 1 за такт до переноса, когда младшие 8 бит = 0xFE. это выглядит

enable_m = dff(cnt_l[]==H"FE",clock,vcc,vcc);

Если не доверять синтезатору в части употребления cascade chain, то можно описать даже так:

enable_m = dff(CASCADE(cnt_l[3..0]==H"E") and cnt_l[7..4]==H"F",clock,vcc,vcc);

В данном описании учтена 4-х входовая структура LUT, и быстрое AND-каскадирование.

Итого следующий каскад получается таким:

cnt_m[7..0]:dffe;
-- -------------------
cnt_m[].clk=clock;
cnt_m[].ena=enable_m;
cnt_m[]=cnt_m[]+1;

теперь очередной каскад. Он должен тикать, когда содержимое обоих предыдущих каскадов равны 0xFF. Для этого делаем проверку первого каскада на 0xFD (аналогично предыдущему), проверку второго каскада на
0хFD, замешиваем выходы по И, и пропускаем через еще один триггер. Итого:

enable_t1 = dff(CASCADE(cnt_l[3..0]==H"D") and cnt_l[7..4]==H"F",clock,vcc,vcc);
enable_t2 = dff(CASCADE(cnt_m[3..0]==H"D") and cnt_m[7..4]==H"F",clock,vcc,vcc);
enable_mm = dff(enable_t1 & enable_t2,clock,vcc,vcc);

и это enable_mm идет на разрешение третьей 8-битной части счетчика. Так можно охватить еще 6 8-битных каскадов, если следовать условию, что не задействовать cascade chain длиннее чем на 1 LUT. 2 следующих разрешения 8-битных каскадов обойтудся без "cascade chain", а 4 следующих за ними будут с одним "CASCADE" в егойных "enable_mm".

Ну в общем это основной смысл. То есть принцип конвейеризации. Скорее всего, так как я это писал влёт, прям в ответе, это не самый оптимальный по скорости вариант, надо четко просчитывать все с учетом времянок CARRY, CASCADE, LUT, LCELL, EXP и т.п., что дают в данном семействе. И не факт, что разбиение именно по 8 разрядов оптимально (скорее всего даже нет). Но, следуя таким принципам, легко строится счетчик с немеренной разрядностью, скорость работы которого ограничена лишь максимальной скоростью работы самой ПЛИС.

P.S. Если не хотите лезть в дебри, доверяйте синтезатору, ставьте мегафункцию, получите относительно оптимальный счетчик.

P.P.S Мог и ошибиться где-нить, просьба сильно не пинать.


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

Ответы


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

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

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

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

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


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

E-mail: info@telesys.ru