Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Вт мар 19, 2024 06:22

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: KF600
СообщениеДобавлено: Чт май 21, 2015 03:24 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7958
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Собственно, вот и реализовалась архитектура форт-процессора 6-го поколения. Нельзя говорить, что 5-е было плохим. Наоборот, именно оно работало в проектах по принципу Plug&Play - единственный файл, решающий все проблемы с настройками внутри себя. Что было по факту реализовано:
- ориентация на 45-нм поколение FPGA с новой архитектурой логической ячейки. Это сработало ожидаемо эффективно, 6-битные команды уложились в меньшее число слоев декодирования, в результате тактовая частота составляет от 80 МГц (Spartan-6, slow speed grade) до 160-180 МГц (Kintex-7/Virtex-7, fast speed grade).
- Отдельно - 6-битная команда со сдвиговым регистром на загрузку литерала. Это позволило реализовать систему команд, полностью независимую от разрядности стека. Синтезируются ядра с разрядностью от 12 до 64 (больше тоже возможно, но не было смысла), совместимые по двоичному коду.
- Глубокая параметризация с возможностью отключения модулей. Размер ядра в LUT составляет от 800 до 1400 для 32-разрядной версии.

Главные плюсы при эксплуатации:
- Один файл, параметризуемый при включении в проект. Очень удобно и минимизирует возможные ошибки из-за невнимательности подключения.
- Компактный код благодаря 6-битной команде. Многие вещи успешно реализуются в блочной памяти младших Spartan-6.
- Быстрый доступ к системной шине. Все сигналы: addr, data, write_enable. Даже чисто программная реализация обмена дает довольно высокие скорости - 10 МГц и более.

Что сделано в 6-м поколении.
- Отсутствие регистров как таковых - в виде отдельного стека, регистрового файла или чего-либо еще. Стек вынесен в память данных (технически - Block RAM). Как вынесен и почему это работает - ну... это не вполне тривиально :) Хотя никаких нештатных решений тут нет. Двухтактный конвейер со штрафом в такт на переходах.
- Отдельный стек стековых кадров. При исполнении call текущее значение Depth укладывается на специальный стек, им можно пользоваться. Отдельная команда RETS восстанавливает указатель стека при возврате (просто RET не восстанавливает). Это позволяет при вызове слова положить на стек несколько чисел, и обращения к ним всегда будут выполняться командами 0 ARG@ 1 ARG@ 2 ARG@ и т.д.
- Прямая адресация стека через PICK/POKE, относительно текущей вершины.

Текущая система команд:

Код:
constant cmdNOP : integer := 0;

constant cmdRET : integer := 1;
constant cmdRETS : integer := 2; -- return with stack frame restore
constant cmdRETI : integer := 3; -- return from interrupt

constant cmdLOOP : integer := 4;

constant cmdNOT : integer := 16; -- 0x10
constant cmdSHL : integer := 17; -- 0x11
constant cmdSHR : integer := 18; -- 0x12
constant cmdSHRA : integer := 19; -- 0x13
constant cmdINPORT : integer := 20; -- 0x14
constant cmdSWAP : integer := 21; -- 0x15
constant cmdSHL8 : integer := 22; -- 0x16
constant cmdSHR8 : integer := 23; -- 0x17
constant cmdSYSREG : integer := 24; -- 0x18


-- +1 stack DEPTH
constant cmdDUP : integer := 32;   -- 0x20
constant cmdOVER : integer := 33;  -- 0x21
constant cmdFROMR : integer := 34; -- 0x22

constant cmdSAVEA : integer := 35; -- 0x23
constant cmdSAVEB : integer := 36; -- 0x24

constant cmdI : integer := 37; -- 0x24

-- -1 stack DEPTH

constant cmdPLUS : integer := 64;  -- 0x40
constant cmdMINUS : integer := 65;
constant cmdAND : integer := 66;
constant cmdOR : integer := 67;
constant cmdXOR : integer := 68;
constant cmdEQUAL : integer := 69;
constant cmdULESS : integer := 70;
constant cmdUGREATER : integer := 71;
constant cmdMULT : integer := 72;

constant cmdDROP : integer := 80; -- 0x50
constant cmdJMP : integer := 81; -- 0x51
constant cmdCALL : integer := 82; -- 0x52
constant cmdRJMP : integer := 83; -- 0x53
constant cmdTOR : integer := 84; -- 0x54
constant cmdFETCH : integer := 85; -- 0x55
constant cmdPICK : integer := 86;
constant cmdARGFETCH : integer := 87;

-- -2 stack DEPTH

constant cmdSTORE : integer := 96;
constant cmdOUTPORT : integer := 97;
constant cmdARGSTORE : integer := 98;

constant cmdDO : integer := 99;
constant cmdRIF : integer := 100;
constant cmdUNTIL : integer := 101;


Самое главное - результаты. Во-первых, от 1400 LUT новое ядро откатилось на 1000-1050. Тактовая частота:

Spartan-6 (было 80 МГц) - 95 - 100 МГц
Kintex-7 (было 180) - 333 МГц (!)

Последняя цифра при отключении стека циклов увеличивается до 375 МГц, с отдельными вариантами настроек поднималось до 400! А вот MicroBlaze, по последним данным, выше 332 МГц не поднимается, причем для этого требуется 5-ступенчатый конвейер.

Вобщем, я доволен :) В целом результат от оптимизации кода под 7-ю серию FPGA существенно превысил ожидания. Влияние слабее выражено для более простых Spartan-6, но те моменты, на которые Xilinx указывает для серии 7, сработали в полной мере. При этом сохраняется совместимость по исходным текстам Форта с предыдущим ядром, а пригодность к выполнению ЯВУ-ориентированного кода существенно улучшилась.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB