МАРСОХОД

Open Source Hardware Project

Добро пожаловать, Гость
Логин: Пароль: Запомнить меня

ТЕМА: Минималистичное софт-ядро для Марсохода.

Минималистичное софт-ядро для Марсохода. 3 года 9 мес. назад #4829

  • Leka
  • Leka аватар Автор темы
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54

MVV пишет: Описание картинки на verilog или vhdl можете показать как подтверждение?

В качестве примера сделал другую картинку 2х-входового АЛУ на 16 команд (полный набор операций знакового/беззнакового сравнения сделан в предположении, что операнды нельзя переставлять):
MOV ADD SUB AND OR XOR - арифметико-логические, результат в Y,
EQ NE - сравнение, результат в C,
GT GE LT LE - знаковое сравнение, результат в C,
UGT UGE ULT ULE - беззнаковое сравнение, результат в C.

По картинке 4 ЛЕ/разряд, итого 64 ЛЕ на 16 разрядов.
Еще ~10 управляющих сигналов, должны добавить ~10 ЛЕ.
В сумме ~75, это оценка по картинке. Синтез в Квартусе дал 77 ЛЕ.
///////////////////////////////////////////////////////////////////////////////
module alu(cmd,a,b,qC,qY);
input [3:0]cmd;
input [15:0]a,b;
output qC;
output [15:0]qY;
wire [15:0]qa,qb,qL;
alua a1(qa,a,cmd);
alub a2(qb,b,cmd);
aluL a3(qL,qa,b,cmd);
aluA a4(qY,qC,qL,qb,cmd);
endmodule
///////////////////////////////////////////////////////////////////////////////
`define mov_op	(cmd==0)
`define add_op	(cmd==1)
`define sub_op	(cmd==2)
`define and_op	(cmd==3)
`define or_op	 	(cmd==4)
`define xor_op  	(cmd==5)
`define eq_op	(cmd==6)
`define ne_op   	(cmd==7)
`define gt_op	        (cmd==8)
`define ge_op	(cmd==9)
`define lt_op		(cmd==10)
`define le_op		(cmd==11)
`define ugt_op	(cmd==12)
`define uge_op	(cmd==13)
`define ult_op	(cmd==14)
`define ule_op	(cmd==15)
///////////////////////////////////////////////////////////////////////////////
`define cmdA	(`add_op||`sub_op||`and_op||`or_op||`xor_op||`ugt_op||`uge_op||`ult_op||`ule_op)
`define cmdAN	(`eq_op||`ne_op)
`define cmdB	(`mov_op||`add_op) 
`define cmdBN	(`sub_op||`ugt_op||`uge_op||`ult_op||`ule_op) 
`define cmdAND 	(`and_op) 
`define cmdOR	(`or_op)
`define cmdXOR 	(`xor_op||`eq_op||`ne_op) 
`define cmdC    	(`sub_op||`eq_op||`ne_op||`uge_op||`ult_op||`ge_op||`lt_op)
`define cmdINT   	(`gt_op||`ge_op||`lt_op||`le_op)
`define cmdCOM (`ne_op||`ult_op||`ule_op||`lt_op||`le_op)
`define cmdCMP  (`eq_op||`ne_op||`ugt_op||`uge_op||`ult_op||`ule_op||`gt_op||`ge_op||`lt_op||`le_op)
///////////////////////////////////////////////////////////////////////////////
module alua(q,a,cmd);
output [15:0]q;
input [15:0]a;
input [3:0]cmd;
assign q = 
	`cmdA ? a : 
	`cmdAN ? ~a : 
	`cmdINT ? a ^ 'h8000 : 0; 
endmodule
///////////////////////////////////////////////////////////////////////////////
module alub(q,b,cmd);
output [15:0]q;
input [15:0]b;
input [3:0]cmd;
assign q = 
	`cmdB ? b : 
	`cmdBN ? ~b : 
	`cmdINT ? b ^ 'h7FFF : 0; 
endmodule
///////////////////////////////////////////////////////////////////////////////
module aluL(q,a,b,cmd);
output [15:0]q;
input [15:0]a,b;
input [3:0]cmd;
assign q = 
	`cmdAND ? a & b :
	`cmdOR ?  a | b :
	`cmdXOR ? a ^ b : a; 
endmodule
///////////////////////////////////////////////////////////////////////////////
module aluA(qY,qC,a,b,cmd);
output [15:0]qY;
output qC;
input [15:0]a,b;
input [3:0]cmd;
wire [17:0]q;
assign q = {`cmdCOM, `cmdCMP, a} + b + `cmdC;
assign qY=q; 
assign qC=q[17];
endmodule
///////////////////////////////////////////////////////////////////////////////
Вложения:

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Leka.

Минималистичное софт-ядро для Марсохода. 3 года 9 мес. назад #4830

  • Leka
  • Leka аватар Автор темы
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54
АЛУ в посте выше - не для м16 (временное название минималистичного софт-ядра), а в качестве примера "не case" описания. "Case"-описание дает 194 ЛЕ:
///////////////////////////////////////////////////////////////////////////////
module alu(cmd,a,b,qC,qY);
input [3:0]cmd;
input [15:0]a,b;
output qC;
output [15:0]qY;
///////////////////////////////////////////////////////////////////////////////
`define mov_op 	(cmd==0)
`define add_op	(cmd==1)
`define sub_op	(cmd==2)
`define and_op	(cmd==3)
`define or_op	(cmd==4)
`define xor_op  (cmd==5)
`define eq_op	(cmd==6)
`define ne_op   (cmd==7)
`define gt_op	(cmd==8)
`define ge_op	(cmd==9)
`define lt_op	(cmd==10)
`define le_op	(cmd==11)
`define ugt_op	(cmd==12)
`define uge_op	(cmd==13)
`define ult_op	(cmd==14)
`define ule_op	(cmd==15)
///////////////////////////////////////////////////////////////////////////////
assign qY = 
	`mov_op ? b :
	`add_op ? a+b :
	`sub_op ? a-b :
	`and_op ? a&b :
	`or_op ?  a|b :
	`xor_op ? a^b : 0;
assign qC =
	`eq_op ? a==b : 
	`ne_op ? a!=b : 
	`ge_op ? $signed(a)>=$signed(b) : 
	`gt_op ? $signed(a)>$signed(b) : 
	`le_op ? $signed(a)<=$signed(b) : 
	`lt_op ? $signed(a)<$signed(b) : 
	`ugt_op ? a>b : 
	`uge_op ? a>=b : 
	`ult_op ? a<b : 
	`ule_op ? a<=b : 0;
endmodule
///////////////////////////////////////////////////////////////////////////////

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Минималистичное софт-ядро для Марсохода. 3 года 9 мес. назад #4831

  • Leka
  • Leka аватар Автор темы
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54
Для м16 оставил только знаковое сравнение, для беззнаковых нет свободных опкодов.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Минималистичное софт-ядро для Марсохода. 3 года 9 мес. назад #4832

Чтобы установить на Windows средства разработки компилятора LCC 4.2,
можно либо скачать архив с этого адреса:
https://github.com/drh/lcc/archive/master.zip
или отсюда:
https://sites.google.com/site/lccretargetablecompiler/downloads/lcc42.zip?attredirects=0&d=1
и сделать следующее:

Распаковать архив, например, на диск C:.
Переименовать папку lcc-master на lcc (чтобы было покороче).
Или в случае lcc42.zip распаковать в C:\lcc.
Из Microsoft Visual Studio 6.0 скопировать папку VC98 в C:\lcc\VC98.
Создать папки C:\lcc\build, C:\lcc\4.2\bin и C:\lcc\4.2\m16.
Из файла makefile.nt создать файл makefile.m16.
Ввести в новый файл необходимые архитектуры.
В папку C:\lcc\src добавить machine description файлы (.md)
новых архитектур. У меня это arm, xr16, pdp11, m16 и мои st16 и vc732l.
В этой же папке в файл bind.c внести строки с новыми архитектурами.
В операционной системе Windows установить переменные окружения:

MSVCDir C:\lcc\VC98
INCLUDE %MSVCDir%\Include
LIB %MSVCDir%\Lib
PATH %MSVCDir%\bin
BUILDDIR C:\lcc\build
LCCDIR C:\lcc\4.2\bin

Создать командный файл C:\lcc\compile.bat следующего содержания:

del rpt.txt
nmake.exe /f makefile.m16 all >> rpt.txt
copy build\*.exe 4.2\bin\*.exe
copy build\*.lib 4.2\bin\*.lib
pause

Запустить созданный командный файл.
Если все нормально, в файле rpt.txt не будет сообщений об ошибках.

После этого можно перейти в папку C:\lcc\4.2\m16 или любую другую
с вашим программным обеспечением.
У меня в этой папке лежат .c файлы и создан командный файл _start.bat
следующего содержания:

del *.log /q
rem ..\bin\lcc.exe -Wf-target=up732l -S queens.c 2> _cc_err.log >> %~n1_cc.log
rem ..\bin\lcc.exe -Wf-target=st16 -S queens.c 2> _cc_err.log >> %~n1_cc.log
rem ..\bin\lcc.exe -Wf-target=pdp11 -S queens.c 2> _cc_err.log >> %~n1_cc.log
..\bin\lcc.exe -Wf-target=m16 -S queens.c 2> _cc_err.log >> %~n1_cc.log
pause

В этом файле ключем -target= задается процессор с нужной архитектурой.
При запуске командного файла создается ассемблерный файл .asm с тем же
префиксом, что и файл .c.
Если есть ошибки, смотреть файлы .log.

Либо все это можно скачать с моего облака:
https://cloud.mail.ru/public/6RBZ/j4SgMWY1K

Для линуксоидов (да и для виндоусоидов) можно почитать файл install.html в папке lcc\doc.

И сборку LCC и компиляцию исходников проверял на WIN7/32, WIN7/64 и WIN10/64.

Файл m16.md пока тупо скопировал из st16.md.
Будем его править по мере развития процессора.

Николай.
Спасибо сказали: alman, Leka

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Ynicky.

Минималистичное софт-ядро для Марсохода. 3 года 9 мес. назад #4833

  • Leka
  • Leka аватар Автор темы
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54
Спасибо, заработало! WinXP.
Скачал с облака, тк VC у меня не установлен. Только в setvars.bat надо добавить строку:
set BUILDDIR=путь_к_build
иначе новые файлы появляются на корневом диске, а в 4.2 копируются старые из build.
Еще в etc/win32.c есть строчка #define LCCDIR, которую тоже, наверно, надо поправить.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Leka.

Минималистичное софт-ядро для Марсохода. 3 года 9 мес. назад #4834

У меня тоже собралось. Собирал с помощью MS Visual Studio 2015 - пришлось убирать флаги компиляции и править конфликт char * outp; с функцией outp из conio.h
Помогла замена outp на output в исходниках lcc

Ого! Так он, оказывается, умеет генерировать код для нескольких платформ.
-Wf-target=m16

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от alman.

Минималистичное софт-ядро для Марсохода. 3 года 9 мес. назад #4835

Только в setvars.bat надо добавить строку:
set BUILDDIR=путь_к_build
иначе новые файлы появляются на корневом диске, а в 4.2 копируются старые из build.
Еще в etc/win32.c есть строчка #define LCCDIR, которую тоже, наверно, надо поправить.


Да, действительно, у меня в переменных окружения есть еще 2 переменные:
BUILDDIR C:\lcc\build
LCCDIR C:\lcc\4.2\bin

Поправлю.

Николай.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Минималистичное софт-ядро для Марсохода. 3 года 9 мес. назад #4838

  • Leka
  • Leka аватар Автор темы
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54
Разбираюсь с LCC. После изучения *.asm по -target=symbolic напрашивается вывод, что для "аккумуляторной" архитектуры (а также "безрегистровой", те с большим регистровым файлом в памяти), проще будет разобраться с symbolic.c, чем с *.md. Либо непосредственно переводить в машинные коды *.asm после -target=symbolic. Кто что думает по этому поводу?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Минималистичное софт-ядро для Марсохода. 3 года 9 мес. назад #4840

Кто что думает по этому поводу?

Мне больше нравится обычная мнемоника ассемблера.

To Leka:
Какие команды будут при эмуляции CALL и RET?
Будет ли указатель стека?
Нужен ли регистр константы 0?
Или любая константа будет в памяти?

Николай.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Минималистичное софт-ядро для Марсохода. 3 года 9 мес. назад #4841

Подскажите, как быть если архитектура не поддерживает 8 и 16 бит? На ассемблере эти разрядности я поддерживал с помощью различных приёмов (сдвиги и маски), оптимизировав непосредственно под каждую задачу. А вот как научить lcc эмулировать эти разрядности на архитектурах, которых их не поддерживают?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Время создания страницы: 0.486 секунд

ВКонтакте  facebook  GitHub  YouTube  Twitter
Вы здесь: Начало Forum Наш форум Проекты пользователей Минималистичное софт-ядро для Марсохода.