МАРСОХОД

Open Source Hardware Project

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

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

Система на кристалле "Террикон" 3 мес. 2 нед. назад #6489

  • alman
  • alman аватар
  • Не в сети
  • Завсегдатай
  • Сообщений: 262
  • Спасибо получено: 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 "Террикон" является побочным продуктом другого, более глобального проекта, так же как и отвалы породы являются побочным продуктом добычи полезных ископаемых.
Вложения:
Администратор запретил публиковать записи гостям.

Система на кристалле "Террикон" 3 мес. 2 нед. назад #6502

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

Система на кристалле "Террикон" 3 мес. 2 нед. назад #6504

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

Система на кристалле "Террикон" 3 мес. 1 нед. назад #6530

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

Система на кристалле "Террикон" 3 нед. 1 день назад #6819

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

Система на кристалле "Террикон" 3 нед. 16 ч. назад #6823

  • alman
  • alman аватар
  • Не в сети
  • Завсегдатай
  • Сообщений: 262
  • Спасибо получено: 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
Администратор запретил публиковать записи гостям.
Время создания страницы: 0.300 секунд

GitHub YouTube Twitter
Вы здесь: Начало Forum Наш форум Проекты пользователей Система на кристалле "Террикон"