J1: 16-битный форт-процессор

Джеймс Боумэн (James Bowman) из Fig (Forth Interest Group) Кремниевой долины написал для своего компактного Форт-процессора (прошивается в FPGA, 200 строк на Verilog) Форт-операционку с TCP/IP, уложившись в 8Кб. Также для него уже есть пара игр, включая Space Invaders, и кросс-средства под Windows, Mac и Unix.

https://www.excamera.com/sphinx/fpga-j1.html

Процессор J1 был перенесён на FPGA Xilinx Spartan и Lattice ICE40. Он использует на удивление мало элементов и довольно быстр.

Комментарии

Интересная штука, больше похоже на ретропроцессор.
Посмотрел код на верилоге. 16 опкодов операций с АЛУ. 200 строк на верилоге - для сравнения, код после любительского реверс-инжиниринга советского КР580ВМ80А на верилоге занимает ~900 строк без учёта комментов.
Больше похоже на ядро микроконтроллера. 16-разрядный проц с 13-разрядным счётчиком адреса - адресное пространство всего 8 кб, хотя адресная шина на 64 кб. 33 регистра стек данных напомнил российский мультиклет - там стоял 64 регистровый коммутатор, сохранявший состояния последних 64 операций с флагами. И по большому счёту, проц 15-разрядный, в стек можно загрузить только младшие 15 бит.
Не совсем ясно, сколько этот проц места в ПЛИС занимает. Если я правильно понял описание, проц испытывался на 30 МГц, это весьма скромно - сама ПЛИС рассчитана на тактовую частоту ~200 МГц. Одна операция даёт задержку в 6 логических элементов. Видимо, это цена за простоту устройства.
На Марсоходе есть толковые статьи о самодельных процессорах - упрощённый ARM2 и упрощённое ядро микроконтроллера AVR.

Вроде, на 50 МГц в малосерийном исполнении — модифицированный J1 ставили в Gameduino:
https://www.excamera.com/sphinx/gameduino/coprocessor.html

Я не нашёл информации о процессоре в Gameduino 3X:
https://www.excamera.com/sphinx/gameduino3/index.html

Хотелось бы что-то подобное в ПМК будущего. Надо бы пораньше разработать и отладить FPGA, чтобы в благоприятное время выпустить энергоэффективный камень, политическим решением на благо Родины.

http://microsin.net/programming/xilinx/gameduino-making.html

Собирал, правда, не совсем так как описано в статье т.к. "синтезатор" у меня, почему выдавал варнинги.

P.S. На Github есть некоторые модификации этого процессора и Фортов под них https://github.com/jamesbowman/swapforth (c Github разработчика Gameduino1,2,3)
Вроде, как, в Gameduino-1 аппаратно выделен штатно 1Kб для какого то выполнения скетч Форт кода внутри самой платы (остальное под видеобуферы и хранения спрайтов по интерфейсу SPI)
Через Ардуино-среду запускал, для неё некоторое время назад, демо-примеры для Gameduino платы
(от Olimex https://chlb.terraelectronica.ru/product/1134109 ещё продаются и цена с 1500р до 983р уменьшили, на данной плате можно распаять дополнительно 32Мб ОЗУ:) с платой Arduino 101 (базис двухядерный Intel Quark контроллер со встроенным-вторым ARC ядром на котором и выполняются скетчи из Ардуино)

https://excamera.com/sphinx/gameduino/

Что за варнинги? А какой объём занял проц, если не секрет?

ПЛИС XC3S200A-4VQG100C по даташиту тянет до 333 МГц. Не совсем ясно на какой частоте проц работает, заявлено быстродействие 50 млн. оп./с

В России выпускается аналог - серия Марсоход на альтерах, народ спектрумы собирает :)

Ну и Миландр свою самобытную плисину дорабатывает :)

у меня не получилось в отдельном приложении загрузить проект в Xilinx PlanAhead 14.7, какие то траблы с Java runtime,
только запустить схематику проекта через контекстное меню проекта Xilinx Ise 14.7

P.S. У меня небольшие знания по работе с проектами для FPGA, но могу посмотреть что за логи были для данного проекта и какие суммарные показатели. (Xilinx 14.7 устанавливал и запускал под Win7)
но схемотехнику проекта удалось увидеть в графическом виде. (хотелось бы понять, значит ли она что то помимо VHDL кода т.к. содержит какие то библиотечные модули).
и сам полученный файл проца не заливал в ПЛИС.

Forth CPU on Github

 Design statistics: 
    Minimum period:  19.059ns{1}   (Maximum frequency:  52.469MHz) 
 
top Project Status (12/04/2019 - 02:02:16)				   
Project File:	edif.xise	Parser Errors:	No Errors 	   
Module Name:	top	Implementation State:	Placed and Routed	   
Target Device:	xc3s200a-4vq100	Errors:	No Errors	   
Product Version:	ISE 14.7	Warnings:	21 Warnings (0 new)	   
Design Goal:	Balanced	Routing Results:	All Signals Completely Routed	   
Design Strategy:	Xilinx Default (unlocked)	Timing Constraints:	All Constraints Met	   
Environment:	System Settings 	Final Timing Score:	0 (Timing Report)	 
  
Device Utilization Summary					[-]	   
Logic Utilization	Used	Available	Utilization	Note(s)		   
Total Number Slice Registers	666	3,584	18%			   
Number used as Flip Flops	642					   
Number used as Latches	24					   
Number of 4 input LUTs	3,148	3,584	87%			   
Number of occupied Slices	1,790	1,792	99%			   
Number of Slices containing only related logic	1,790	1,790	100%			   
Number of Slices containing unrelated logic	0	1,790	0%			   
Total Number of 4 input LUTs	3,315	3,584	92%			   
Number used as logic	1,945					   
Number used as a route-thru	167					   
Number used as 16x1 RAMs	25					   
Number used for Dual Port RAMs	736					   
Number used for 32x1 RAMs	372					   
Number used as Shift registers	70					   
Number of bonded IOBs	23	68	33%			   
Number of BUFGMUXs	1	24	4%			   
Number of DCMs	1	4	25%			   
Number of ICAPs	1	1	100%			   
Number of DNA_PORTs	1	1	100%			   
Number of ICAP_SPARTAN3As	1	1	100%			   
Number of MULT18X18SIOs	7	16	43%			   
Number of RAMB16BWEs	16	16	100%			   
Average Fanout of Non-Clock Nets	3.77					 
  
Performance Summary				[-]	   
Final Timing Score:	0 (Setup: 0, Hold: 0, Component Switching Limit: 0)	Pinout Data:	Pinout Report		   
Routing Results:	All Signals Completely Routed	Clock Data:	Clock Report		   
Timing Constraints:	All Constraints Met				 
  
Detailed Reports						[-]	   
Report Name	Status	Generated	Errors	Warnings	Infos		   
Synthesis Report							   
Translation Report	Current	Ñð 4. äåê 02:02:24 2019	0	0	2 Infos (0 new)		   
Map Report	Current	Ñð 4. äåê 02:02:32 2019	0	21 Warnings (0 new)	5 Infos (0 new)		   
Place and Route Report	Current	Ñð 4. äåê 02:03:16 2019	0	0	0		   
Power Report							   
Post-PAR Static Timing Report	Current	Ñð 4. äåê 02:03:25 2019	0	0	5 Infos (0 new)		   
Bitgen Report							 
  
Secondary Reports			[-]	   
Report Name	Status	Generated		 


Warnings

All Implementation Messages Ïò 19. èþí 18:34:52 2020 

--------------------------------------------------------------------------------

Program  All Implementation Messages - Errors, Warnings, and Infos New 
map WARNING  Pack:266 - The function generator occ/ramx[2].ramx/r6 failed to merge with F5 multiplexer occ/ramx[2].ramx/Mmux__COND_109_3_f5. The function generator occ/ramx[2].ramx/r6 is unable to be placed in the G position because the output signal doesn't match other symbols' use of the G signal. The signal occ/ramx[2].ramx/Mmux__COND_109_5 already uses G. The design will exhibit suboptimal timing.   
map WARNING  Pack:266 - The function generator occ/ramx[8].ramx/r6 failed to merge with F5 multiplexer occ/ramx[8].ramx/Mmux__COND_109_3_f5. The function generator occ/ramx[8].ramx/r6 is unable to be placed in the G position because the output signal doesn't match other symbols' use of the G signal. The signal occ/ramx[8].ramx/Mmux__COND_109_5 already uses G. The design will exhibit suboptimal timing.   
map WARNING  Pack:266 - The function generator occ/ramx[3].ramx/r6 failed to merge with F5 multiplexer occ/ramx[3].ramx/Mmux__COND_109_3_f5. The function generator occ/ramx[3].ramx/r6 is unable to be placed in the G position because the output signal doesn't match other symbols' use of the G signal. The signal occ/ramx[3].ramx/Mmux__COND_109_5 already uses G. The design will exhibit suboptimal timing.   
map WARNING  Pack:266 - The function generator occ/ramx[4].ramx/r6 failed to merge with F5 multiplexer occ/ramx[4].ramx/Mmux__COND_109_3_f5. The function generator occ/ramx[4].ramx/r6 is unable to be placed in the G position because the output signal doesn't match other symbols' use of the G signal. The signal occ/ramx[4].ramx/Mmux__COND_109_5 already uses G. The design will exhibit suboptimal timing.   
map WARNING  Pack:266 - The function generator occ/ramx[5].ramx/r6 failed to merge with F5 multiplexer occ/ramx[5].ramx/Mmux__COND_109_3_f5. The function generator occ/ramx[5].ramx/r6 is unable to be placed in the G position because the output signal doesn't match other symbols' use of the G signal. The signal occ/ramx[5].ramx/Mmux__COND_109_5 already uses G. The design will exhibit suboptimal timing.   
map WARNING  Pack:266 - The function generator occ/ramx[0].ramx/r6 failed to merge with F5 multiplexer occ/ramx[0].ramx/Mmux__COND_109_3_f5. The function generator occ/ramx[0].ramx/r6 is unable to be placed in the G position because the output signal doesn't match other symbols' use of the G signal. The signal occ/ramx[0].ramx/Mmux__COND_109_5 already uses G. The design will exhibit suboptimal timing.   
map WARNING  Pack:266 - The function generator occ/ramx[6].ramx/r6 failed to merge with F5 multiplexer occ/ramx[6].ramx/Mmux__COND_109_3_f5. The function generator occ/ramx[6].ramx/r6 is unable to be placed in the G position because the output signal doesn't match other symbols' use of the G signal. The signal occ/ramx[6].ramx/Mmux__COND_109_5 already uses G. The design will exhibit suboptimal timing.   
map WARNING  Pack:266 - The function generator occ/ramx[1].ramx/r6 failed to merge with F5 multiplexer occ/ramx[1].ramx/Mmux__COND_109_3_f5. The function generator occ/ramx[1].ramx/r6 is unable to be placed in the G position because the output signal doesn't match other symbols' use of the G signal. The signal occ/ramx[1].ramx/Mmux__COND_109_5 already uses G. The design will exhibit suboptimal timing.   
map WARNING  Pack:266 - The function generator occ/ramx[7].ramx/r6 failed to merge with F5 multiplexer occ/ramx[7].ramx/Mmux__COND_109_3_f5. The function generator occ/ramx[7].ramx/r6 is unable to be placed in the G position because the output signal doesn't match other symbols' use of the G signal. The signal occ/ramx[7].ramx/Mmux__COND_109_5 already uses G. The design will exhibit suboptimal timing.   
map WARNING  PhysDesignRules:372 - Gated clock. Clock net local_j1_read_not0001 is sourced by a combinatorial pin. This is not good design practice. Use the CE pin to control the loading of data into the flip-flop.   
map WARNING  PhysDesignRules:372 - Gated clock. Clock net mem_data_rd_reg_or0000 is sourced by a combinatorial pin. This is not good design practice. Use the CE pin to control the loading of data into the flip-flop.   
map WARNING  PhysDesignRules:812 - Dangling pin  on block::.   
map WARNING  PhysDesignRules:812 - Dangling pin  on block::.   
map WARNING  PhysDesignRules:812 - Dangling pin  on block::.   
map WARNING  PhysDesignRules:812 - Dangling pin  on block::.   
map WARNING  PhysDesignRules:812 - Dangling pin  on block::.   
map WARNING  PhysDesignRules:812 - Dangling pin  on block::.   
map WARNING  PhysDesignRules:812 - Dangling pin  on block::.   
map WARNING  PhysDesignRules:812 - Dangling pin  on block::.   
map WARNING  PhysDesignRules:812 - Dangling pin  on block::.   
map WARNING  PhysDesignRules:812 - Dangling pin  on block::.   
ngdbuild INFO  ConstraintSystem:178 - TNM 'CLKA', used in period specification 'TS_clk', was traced into DCM_SP instance DCM_SP. The following new TNM groups and period specifications were generated at the DCM_SP output(s): CLKFX:    
ngdbuild INFO  NgdBuild:1222 - Setting CLKIN_PERIOD attribute associated with DCM instance DCM_SP to 40.000000 ns based on the period specification ( [top.ucf(74)]).   
map INFO  LIT:243 - Logical network j/Mram_dstack10/SPO has no load.   
map INFO  LIT:395 - The above info message is repeated 79 more times for the following (max. 5 shown): j/Mram_dstack11/SPO, j/Mram_dstack12/SPO, j/Mram_dstack13/SPO, j/Mram_dstack14/SPO, j/Mram_dstack15/SPO To see the details of these info messages, please use the -detail switch.   
map INFO  MapLib:562 - No environment variables are currently set.   
map INFO  LIT:244 - All of the single ended outputs in this design are using slew rate limited output drivers. The delay on speed critical single ended outputs can be dramatically reduced by designating them as fast outputs.   
map INFO  PhysDesignRules:772 - To achieve optimal frequency synthesis performance with the CLKFX and CLKFX180 outputs of the DCM comp vga_ck_gen/DCM_inst/DCM_SP, consult the device Interactive Data Sheet.   
trce INFO  Timing:3412 - To improve timing, see the Timing Closure User Guide (UG612).   
trce INFO  Timing:2752 - To get complete path coverage, use the unconstrained paths option. All paths that are not constrained will be reported in the unconstrained paths section(s) of the report.   
trce INFO  Timing:3339 - The clock-to-out numbers in this timing report are based on a 50 Ohm transmission line loading model. For the details of this model, and for more information on accounting for different loading conditions, please see the device datasheet.   
trce INFO  Timing:3390 - This architecture does not support a default System Jitter value, please add SYSTEM_JITTER constraint to the UCF to modify the Clock Uncertainty calculation.   
trce INFO  Timing:3389 - This architecture does not support 'Discrete Jitter' and 'Phase Error' calculations, these terms will be zero in the Clock Uncertainty calculation. Please make appropriate modification to SYSTEM_JITTER to account for the unsupported Discrete Jitter and Phase Error.   

Вот, что посоветовали на фб:

You could start at James' J1 Github repository https://github.com/jamesbowman/j1

He did a version for the Papillion Duo FPGA board which if I recall ran at about 80-100MHz

Почитал про Papillion Duo FPGA, на плате стоит Spartan-6 LX9 и судя по фото -2С, вариант на 2 нс, то есть на 500 МГц.
Но 500 МГц это режим голого счёта без других операций. Процедуры выборки/опознавания и выполнения команд дают свои задержки - насколько я понял - проц работает последовательно - все задержки суммируются и в итоге схема работает на 80-100 МГц. Ну, это, повторю, цена за простоту.
Если вспомнить классику, то i8080 (прототип К580ИК80) работал последовательно - выборка, декодирование, исполнение. А в i8086 (прототип КР1810ВМ86) операции разделили, внедрив самый простой конвеер, сократив пути распространения сигналов. Думаю, это не в последнюю очередь позволило поднять тактовую частоту вдвое с 2,5 МГц до 5 МГц - усовершенствование технологии дало возможность снизить питание "ядра" с +12 В до +5 В.
В целом, задумка J1 очень интересная - если нужен предельно простой процессор.