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

ТЕМА: Система на кристалле "Террикон"

Система на кристалле "Террикон" 8 года 5 мес. назад #6489

  • alman
  • alman аватар Автор темы
  • Не в сети
  • Завсегдатай
  • Завсегдатай
  • Сообщений: 263
  • Спасибо получено: 41
Разрешите представить новый проект "Террикон". Это простейшая система на кристалле с оригинальной системой команд "Эверест".
В приложенном архиве вы найдёте SOF файл с прошивкой "Террикон" для платы Марсоход-2, а так же исполняемый файл макро-ассемблера (Windows версия) и несколько примеров программ и библиотечных функций. Так же в архиве есть файл с README c небольшим описанием.

Если вы в точности повторите инструкции из README,то на экране терминала, подключенного к Марсоходу-2, вы увидите следующий текст.
┌──────────────────────────────> Slagheap SoC v1.0 <───────────────────────────┐
│  1 - X-modem load file to 0x1000                                             │
│  2 - Run code on 0x1000                                                      │
│  3 - Show uptime                                                             │
│  4 - Dump memory                                                             │
│  5 - Show memory as text                                                     │
└────────────────────────────────────────────────────── 20161001 ──────────────┘

Если нажать в терминале клавишу 3, то на экран будет выведено нечто вроде такого:

Tick 0000000B 91A39520 is 993 seconds = 16 min 33 sec

Это время с момента старта устройства.

Если нажать клавишу 4, то система войдёт в режим дампа памяти. Выглядит это приблизительно вот так:
 FF000000 : 048F000C  8F002B8F  00738F00  929E2000
 FF000010 : 50005101  5202E333  333333E4  44444444
 FF000020 : E5555555  55E66666  66668F01  00000009
 FF000030 : 820027D0  20000282  00206832  31308100
 FF000040 : 0DD02240  03820012  8FFFF220  02350408
 FF000050 : D0200002  830016D0  20000383  000FD000
 FF000060 : 000483FF  F550008F  FFE92002  68303130
 FF000070 : 80FFE0D0  10400135  04082300  82002134
[n]ext  [p]rev [a]ddress  [q]uit

При этом можно листать память вверх или вниз, или установить адрес просмотра.
Более подробная информация непосредственно приложенном архиве.

Что такое SoC "Террикон"? Это конвейерная версия ядра с системой команд "Эверест". Устройство состоит из нескольких модулей - ядро процессора, арбитр шин, 4 Кб ПЗУ с микрокодом, 4 Кб статической памяти и контроллер UART для связи с внешним миром. Данный проект является развитием предыдущего проекта - marsohod.org/forum/proekty-polzovatelej/...chik-dlya-marsokhoda и может служить средством для изучения ассемблера "Эверест".

Проект развивается в нескольких направлениях. Прежде всего речь идёт о портировании устройства на плату Марсоход-3, добавление контроллера SDRAM и кэша инструкций, добавление новых интерфейсов ввода/вывода. Ну и конечно же главной "фишки", ради которой создан проект - добавление аппаратной поддержки многозадачности.

Наверняка проект и SoC будут ещё несколько раз переименованы, но пока что название Slagheap символизирует несколько вещей - край терриконов, откуда родом устройство, разницу между тем что есть сейчас и что должно получиться в итоге (маленькая искусственная гора супротив самой большой горы), а так же то, что SoC "Террикон" является побочным продуктом другого, более глобального проекта, так же как и отвалы породы являются побочным продуктом добычи полезных ископаемых.
Вложения:

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

Система на кристалле "Террикон" 8 года 5 мес. назад #6502

  • Leka
  • Leka аватар
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54
N-ферзей (на Си) когда сможете запустить на своей SoC?
Сами же предлагали соревнование ядер...
Спасибо сказали: alman

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

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

Система на кристалле "Террикон" 8 года 5 мес. назад #6504

  • alman
  • alman аватар Автор темы
  • Не в сети
  • Завсегдатай
  • Завсегдатай
  • Сообщений: 263
  • Спасибо получено: 41
На Си пока N-ферзей не будет. Дайте недельку - напишу на ассемблере.

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

Система на кристалле "Террикон" 8 года 5 мес. назад #6530

  • alman
  • alman аватар Автор темы
  • Не в сети
  • Завсегдатай
  • Завсегдатай
  • Сообщений: 263
  • Спасибо получено: 41
Эх, недели не хватило - слишком много основной работы навалилось. Вот вот. Почти почти. Но не успел.
Таки спасибо за задачу - решая её нашёл и исправил ошибку в ассемблере и ошибку в схематике. Таки, ещё пару дней нужно и будут N-ферзей.
Спасибо сказали: SOVA

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

Система на кристалле "Террикон" 8 года 2 мес. назад #6819

  • Bitr
  • Bitr аватар
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 2
  • Спасибо получено: 0
Было бы интересно ознакомиться с результатом.

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

Система на кристалле "Террикон" 8 года 2 мес. назад #6823

  • alman
  • alman аватар Автор темы
  • Не в сети
  • Завсегдатай
  • Завсегдатай
  • Сообщений: 263
  • Спасибо получено: 41
Извините. Застрял на двойном обращении к памяти в двух последовательных инструкциях и решил немного отдохнуть перед правкой. До сих пор отдыхаю. Займусь фиксом на новогодних праздниках.

Пока лишь могу показать исходный код задачи N-ферзей. К сожалению до исправления ошибки в схематике он не рабочий. Можно было бы чуть изменить этот код (вставить NOP), чтобы обойти ошибку, но этот вариант мне не понравился.

Код транслирован "руками" из сишного исходника в ассемблер:
;; N-queens solver

; ------ Register name conversion -------
assign		r0	sol_num		;
assign		r1	ind		; 
assign		r2	bit_mask	; 
assign		r3	I		; 
assign		r4	J		; 
assign		r5	next_row_ptr	; 
assign		r6	row_ptr		;
assign		r7	cell_ptr	;
assign		r8	local_array_dat	;
assign		r9	local_array_ptr	;
assign		r10	array_ptr	;
assign		r13	tmp_reg		;
assign		r15	return_address  ;

; ------ Constant --------------
;$board_size	equ	3

; Programm entry point
function main
	push	return_address		;
	lea	r1, $into_str		; 
	call	_puts

	load	r10, 8
	load	r12, 1 
main_loop:
	push	r10
	call	solver
	pop	r10
	inc	r12
	dec	r10
	jnz	main_loop

	pop	return_address		;
	return				;
end

function	solver
	push	return_address		;
	lea	r1, $header_str		; 
	call	_puts
	mov	r0, r12 ; $board_size		;
	call	_print_dec 
;	jmp skip
	; clear board

	load	sol_num, 0x0		;
	lea	array_ptr, $array	;
	load	ind, 8
a_loop:
	mov	(array_ptr), sol_num
	inc	array_ptr, 4
	dec	ind
	jnz	a_loop 

	load	sol_num, 0x0		;
	lea	array_ptr, $board_line_0	;
	load	ind, 72 
clear_loop:               ;
	mov	(array_ptr), sol_num
	inc	array_ptr, 4
	dec	ind
	jnz	clear_loop
skip:
	lea	array_ptr, $array	;
	load	sol_num, 0x0		;
	load	ind, 0x0                ;
	call	dfs			; N-queen solver

	push	r0
	lea	r1, $body_str		; 
	call	_puts
	pop	r0		;
	call	_print_dec 
	call	_newline
	pop	return_address		;
	return				;
end

$into_str	db	'N-queen solver',0xd,0xa,0
$header_str	db	'N = ',0
$body_str	db	' Result = ',0

; Define static array
$array		dq	0,0,0,0,0,0,0,0
; Define board memory in some simple way
$board_line_0	dq	0,0,0,0,0,0,0,0
$board_line_1	dq	0,0,0,0,0,0,0,0
$board_line_2	dq	0,0,0,0,0,0,0,0
$board_line_3	dq	0,0,0,0,0,0,0,0
$board_line_4	dq	0,0,0,0,0,0,0,0
$board_line_5	dq	0,0,0,0,0,0,0,0
$board_line_6	dq	0,0,0,0,0,0,0,0
$board_line_7	dq	0,0,0,0,0,0,0,0
$board_line_8	dq	0,0,0,0,0,0,0,0

;$sol_num	dq	0


; --- Store ro local function space ------------------------
$var_row_ptr		equ		0	; Source pointer holder
$var_r1			equ		1	; Store R1
$var_r2			equ		2	; Store R2
$var_r3			equ		3	; Store R3

$line_size		equ		32	; 8 cells x 4 bytes
$line_words		equ		8	; 8 cells 

assign 		r6	src
assign		r1	dst
assign		r2	counter
assign		r3	value

; ------ Move array rows ------
; Imput:
;	R0	- pointer to source line 

function   shift_array
	dec	r14, 16
	mov	r14.var_row_ptr, src
	mov	r14.var_r1, dst
	mov	r14.var_r2, counter 
	mov	r14.var_r3, value
	load	dst, $line_size
	addc	dst, src	
	load	counter, $line_words
shift_array_loop:
	mov	value, (src)
	mov	(dst), value
	inc	src, 4
	inc	dst, 4
	dec	counter
	jne	shift_array_loop	

	mov	value, r14.var_r3
	mov	counter, r14.var_r2  
	mov	dst, r14.var_r1 
	mov	src, r14.var_row_ptr
	inc	r14, 16
	return
end

; ------ N-queen solver ------
; Imput:
;	R0	- must  be zero 
;	R1 	- index argument
; Output:
;	R0 	- number of solutions


function   dfs
	cmp	ind, r12 ; $board_size
	jc	start_loop
	inc	sol_num
	return
start_loop:
	push	return_address
	lea	local_array_ptr, $array
	shl	ind, 2	
	addc	local_array_ptr, ind
	shr	ind, 2	
	mov	(local_array_ptr), 0x0
dfs_main_loop:
	mov	local_array_dat, (local_array_ptr)
	cmp     local_array_dat, r12 ;$board_size
	jc	do_main_loop
	pop	return_address
	return
do_main_loop:
	mov     row_ptr, ind
	shl	row_ptr, 5 ;  this is 8 elements of 32bit 
	lea	tmp_reg, $board_line_0
	addc	row_ptr, tmp_reg
	mov	cell_ptr, ind
	shl	cell_ptr, 2
	addc	cell_ptr, row_ptr

	load	bit_mask, 1
	shl	bit_mask, local_array_dat
	and	bit_mask, (cell_ptr)
	jnz	next_iteration

;debug
	push	r8
	push	r11
	lea	r8, $array
	lea	r11, $board_line_0
	call	show_queens
	pop	r11
	pop	r8
; debug
        debug
	call	shift_array

; debug
enable
	push	r8
	push	r11
	lea	r8, $array
	lea	r11, $board_line_0
	call	show_queens
	pop	r11
	pop	r8
done
; debug

	mov	next_row_ptr, row_ptr
	load	tmp_reg, 32   ; $row_size
	addc	next_row_ptr, tmp_reg

	mov	I, ind
	mov	J, local_array_dat
first_internal_loop:
	mov	tmp_reg, r12 ; $board_size
	cmp	I, tmp_reg
	jnc	finish_internal_loop
	cmp	J, tmp_reg	
	jnc	finish_internal_loop
	load	bit_mask, 1
	shl	bit_mask, J

	mov	cell_ptr, I
	shl	cell_ptr, 2
	addc	cell_ptr, next_row_ptr
	or	(cell_ptr), bit_mask
	
	inc	I
	inc	J
	jmp	first_internal_loop

finish_internal_loop:
	mov	I, ind
	mov	J, local_array_dat
second_internal_loop:
	cmp	I, r12 ; $board_size
	jz	finish_second_loop

	 ; load	tmp_reg, 0
	 ; cmp	tmp_reg, J
	 ; jl	finish_second_loop
         load tmp_reg, 0x80000000
	 and  tmp_reg, J
	 jnz  finish_second_loop

	load	bit_mask, 1
	shl	bit_mask, J

	mov	cell_ptr, I
	shl	cell_ptr, 2
	addc	cell_ptr, next_row_ptr
	or	(cell_ptr), bit_mask
	
	inc	I
	dec	J
	jmp	second_internal_loop

finish_second_loop:
	mov	I, ind
	shl	I, 2
	addc	I, next_row_ptr
	mov	(I), 0x0000ffff	

	mov	I, ind
third_internal_loop:
	cmp	I, r12 ; $board_size
	jnc	finish_thord_loop
	load	bit_mask, 1
	shl	bit_mask, local_array_dat
	
	mov	cell_ptr, I
	shl	cell_ptr, 2
	addc	cell_ptr, next_row_ptr
	or	(cell_ptr), bit_mask

	inc	I
	jmp	third_internal_loop

finish_thord_loop:
	push	local_array_dat
	push	local_array_ptr
	push	ind
	inc	ind
	call	dfs
	pop	ind
	pop	local_array_ptr
	pop	local_array_dat

next_iteration:
	inc	local_array_dat
	mov	(local_array_ptr), local_array_dat
	jmp	dfs_main_loop

end

include		../lib/tty.asm
include		../lib/print_dec.asm
include		../lib/div.asm
include		show_queens.asm

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

Система на кристалле "Террикон" 8 года 1 мес. назад #6890

alman пишет: Разрешите представить новый проект "Террикон". Это простейшая система на кристалле с оригинальной системой команд "Эверест".


Здравствуйте Алексей.

Давно хотел с вами пообщаться. Сейчас выдалось свободное время и
появилось к вам несколько вопросов.
Первое, что хотелось бы спросить. Может вам стоит сделать исходники проекта
открытыми? На самом деле вот у меня есть желание погонять вашу SoC
на своих отладочных платах. А исходников для адаптации нет. (
Можно было бы её попробовать скажем на Virtex-5 или Stratix-3
Там частоты доступны весьма приличные для работы.
Опять же открытая лицензия может привлечь к разработке
вашего проекта энтузиастов. Я ,к примеру, сейчас изучаю
построение систем на кристалле на базе MIPS.
Создатели этой серии процессоров пошли на открытие части
исходного кода процессоров для изучение в своих и российских
ВУЗ-ах. Их курс по изучению архитектуры MIPS весьма неплохо
и детально документирован. Попробуйте последовать их примеру. :)
Думаю, интерес к вашему процессору сильно возрастет.

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

Система на кристалле "Террикон" 8 года 1 мес. назад #6897

  • alman
  • alman аватар Автор темы
  • Не в сети
  • Завсегдатай
  • Завсегдатай
  • Сообщений: 263
  • Спасибо получено: 41
Здравствуйте. Спасибо за интерес к проекту. Первым делом хочу сказать что система команд получилась как побочный продукт другого, более масштабного проекта. В принципе, не вижу препятствий чтобы открыть исходники в текущем виде. Единственное, что немного смущает - я изучал Verilog в процессе написания устройства и некоторые моменты с точки зрения профессионала могут быть спорными. Но это мелочи.

Что касается аппаратного microkernel, ради которого это всё затевалось, то оно ещё не реализовано. Думаю что говорить об этой фиче преждевременно. Это то, что должно выделить разработку среди всех существующих.

Мне необходимо некоторое время, чтобы обсудить с компаньоном детали и весьма вероятно что код этой SoC будет открыт в в скором времени. Надеюсь, мой ответ Вас не разочаровал.

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

  • Страница:
  • 1
Время создания страницы: 0.134 секунд
Работает на Kunena форум