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

ТЕМА: Пожелания для Марсохода4

Пожелания для Марсохода4 4 года 9 мес. назад #5317

  • kox
  • kox аватар
  • Не в сети
  • Осваиваюсь на форуме
  • Осваиваюсь на форуме
  • Сообщений: 26
  • Спасибо получено: 3
Да verilog сам по себе достаточно высокоуровненный язык. Описывая счетчик или мультиплексор тремя строчками кода, как представишь себе его на чисто логических вентилях, так дурно становится. А еще более высокий уровень- это типа язык с операторами типа 'сделать как надо', или 'сделать правильно' ?

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

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

Пожелания для Марсохода4 4 года 9 мес. назад #5318

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

kox пишет: А еще более высокий уровень-

это, например, когда графический режим с менюшками/окнами/мышками/... - можно на чистом HDL описать за ~~час, а не ~~год.

Вон на electronix недавно обсуждали, что для человеко-машинного интерфейса к ПЛИС обязательно нужно присобачить мощный проц с линухом...

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

Пожелания для Марсохода4 4 года 9 мес. назад #5319

  • Leka
  • Leka аватар
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54
Вот написал, к примеру, простенькую программу на Си с использованием openGL (для тренировки, раньше графику только на Паскале писал) - и смотрю, легко или сложно будет сделать то-же самое на чистом HDL(с целью синтеза, и без каких-либо софт процессоров), и на дешевых ПЛИС.
#include <stdlib.h>
#include <GL/glut.h>

#define N 8
int Width=1024, Height=768;
int x1[N]={100,120,140,160,180,200,220,240};
int x2[N]={200,220,240,260,280,300,320,340};
int y1[N]={100,120,140,160,180,200,220,240};
int y2[N]={200,220,240,260,280,300,320,340};
int stX = 0, stY = 0;
int xx = 0, yy = 0;
int xx0 = 0, yy0 = 0;

void Display( void ) {
	int i;
	glClearColor( 0, 0, 0, 1 );
	glClear( GL_COLOR_BUFFER_BIT );

	for(i=N-1;i>=0;i--){
		if(i==0) 
			glColor3f( 0, 0.75, 0 );
		else 
			glColor3f( 0, 0.5, 0 );
		glBegin( GL_QUADS );	
			glVertex2i( x1[i], y1[i] );
			glVertex2i( x2[i], y1[i] );
			glVertex2i( x2[i], y2[i] );
			glVertex2i( x1[i], y2[i] );
		glEnd();
		glColor3f( 1, 0, 0 );
		glBegin( GL_LINE_LOOP );	
			glVertex2i( x1[i], y1[i] );
			glVertex2i( x2[i], y1[i] );
			glVertex2i( x2[i], y2[i] );
			glVertex2i( x1[i], y2[i] );
		glEnd();		
	}	
	
	glColor3f( 1, 1, 1 );
	glBegin( GL_POINTS );
		glVertex2i( xx, yy );
	glEnd( );	
	
	glFlush( ); 
}

void Reshape( int w, int h ) {
	Width = w; 
	Height = h;
	glViewport( 0, 0, w, h );
	glMatrixMode( GL_PROJECTION );
	glLoadIdentity( );
	glOrtho( 0, w, 0, h, -1, 1 );
	glPointSize( 10 );
	glLineWidth( 1 );	
}

void MouseMove( int x, int y ) {
	xx = x; 
	yy = Height - y;
	xx0 = xx; 
	yy0 = yy;
	glutPostRedisplay( );
}

void MouseActiveMove( int x, int y ) {
	int dx, dy;
	xx = x; 
	yy = Height - y;
	if( stX == 1 ) x1[0] = xx; 
	if( stX == 2 ) x2[0] = xx;
	if( stY == 1 ) y1[0] = yy; 
	if( stY == 2 ) y2[0] = yy;
	if( ( stX == 3 ) & ( stY == 3 ) ) {
		dx = xx - xx0; 
		dy = yy - yy0;
		xx0 = xx; 
		yy0 = yy; 			
		x1[0] = x1[0] + dx;	
		x2[0] = x2[0] + dx;	
		y1[0] = y1[0] + dy;	
		y2[0] = y2[0] + dy;
	}
	glutPostRedisplay( );
}

void Mouse( int button, int state, int x, int y ) {
	int i,n,t,xx1,xx2,yy1,yy2;
	int yy; 
	yy = Height - y;
	
	n=-1;
	for(i=N-1;i>0;i--) 
		if( ( x1[i] < x ) & ( x < x2[i] ) & ( y1[i] < yy ) & ( yy < y2[i] ) ) 
			n=i;
	if( ( (x1[0]-5) <= x ) & ( x <= (x2[0]+5) ) & ( (y1[0]-5) <= yy ) & ( yy <= (y2[0]+5) ) ) 
		n=0;
	
	if( n>0 ) {
		xx1=x1[n]; 
		xx2=x2[n]; 
		yy1=y1[n]; 
		yy2=y2[n];
		
		for(i=n;i>0;i--) { 
			x1[i]=x1[i-1]; 
			x2[i]=x2[i-1];
			y1[i]=y1[i-1]; 
			y2[i]=y2[i-1];
		}
		
		x1[0]=xx1; 
		x2[0]=xx2;
		y1[0]=yy1; 
		y2[0]=yy2;		
	}

	if( state == GLUT_DOWN ) {
		if( button == GLUT_LEFT_BUTTON ) {
			if( ( x1[0] < x ) & ( x < x2[0] ) & ( y1[0] < yy ) & ( yy < y2[0] ) ) { 
				stX = 3; 
				stY = 3; 
			} 
			if( ( (x1[0] - 5) <= x ) & ( x <= (x1[0] + 5) ) & ( y1[0] <= yy ) & ( yy <= y2[0] ) ) 
				stX = 1; 
			if( ( (x2[0] - 5) <= x ) & ( x <= (x2 [0]+ 5) ) & ( y1[0] <= yy ) & ( yy <= y2[0] ) ) 
				stX = 2;
			if( ( (y1[0] - 5) <= yy ) & ( yy <= (y1[0] + 5) ) & ( x1[0] <= x ) & ( x <= x2[0] ) ) 
				stY = 1; 
			if( ( (y2[0] - 5) <= yy ) & ( yy <= (y2[0] + 5) ) & ( x1[0] <= x ) & ( x <= x2[0] ) ) 
				stY = 2;						
		}
	} else { 
		stX = 0;
		stY = 0;
		if( x1[0] > x2[0] ) { 
			t=x1[0]; 
			x1[0]=x2[0]; 
			x2[0]=t; 
		}
		if( y1[0] > y2[0] ) { 
			t=y1[0]; 
			y1[0]=y2[0]; 
			y2[0]=t; 
		}		
	}
	glutPostRedisplay( );	
}

void Keyboard( unsigned char key, int x, int y ) {
	const char ESCAPE = '\033';
	if( key == ESCAPE ) 
		exit( 0 ) ;
}

void main ( int argc, char** argv ) {
	glutInit( &argc, argv );
	glutInitDisplayMode( GLUT_RGB );
	glutInitWindowSize( Width , Height );
	glutInitWindowPosition( 128, 128 );		
	glutCreateWindow( "Test" );
	glutDisplayFunc( Display );
	glutReshapeFunc( Reshape );
	glutKeyboardFunc( Keyboard );
	glutMouseFunc( Mouse );
	glutMotionFunc( MouseActiveMove );
	glutPassiveMotionFunc( MouseMove );
	glutMainLoop( );
}

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

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

Пожелания для Марсохода4 4 года 9 мес. назад #5320

Leka пишет: В общем, без высокоуровневого синтеза - популярность ПЛИС не получит.
Так что предлагаю в этом направлении подумать, а не изобретать новые шилды и форм-факторы.

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

С++ давно существует, но учить начинали раньше на Паскале. Причем без ООП, чтобы человек сам почувствовал в нем потребность и вовремя порадовался обретению такого инструментария. Сейчас куча народа на JavaScript пишет даже не понимая как там работает прототипное наследование. А ведь есть еще более высокий уровень. Kox правильно "пошутил":

kox пишет: А еще более высокий уровень- это типа язык с операторами типа 'сделать как надо', или 'сделать правильно' ?

Тот, кто на Прологе или Лиспе писал, тот знает, что это реально. Но к индустриальному программированию и модному сейчас стилю организации работы, когда куча инженеров под менеджером сидя пишут каждый свой кусок не видя общей картины, эти языки слабо подходят. Это для науки и искусства:) Как-то так. Хотя в каждой шутке есть доля шутки, как говорится.

Раз уж привели пример с графикой, то поделюсь своими старыми впечатлениями на эту тему. Переход на языки высокого уровня у меня совпал с появлением Windows и всякими его API. Многие ошибочно полагали, что это как бы одно и то же. И в литературе специально проводилась такая реклама. Таким образом специалисты привязывались к индустриальным стандартам. Если раньше, чтобы нарисовать 3D картинку мне нужны были знания линейной алгебры и быстрых алгоритмов и даже текст программы был красивым и отражал смысл происходящего, то с появлением DirectX (OpenGL в этом плане получше, конечно) главной благодетелью стало терпение - пол дня и несколько листов листинга программы формируешь аргументы к какой-нибудь функции, с использованием кучи всяких аббревиатур длинных и ненаглядных, чтобы потом одной (правда опять же километровой) строкой ее вызвать и чтобы она все за тебя сделала. Знания математики заменились на знания API. Многие сейчас понимают, что это невыгодный обмен и всячески сейчас с этим борются через кроссплатформенность, заменяя проприетарные API вычищенными библиотеками. Но до декларативных языков все равно большинству еще далеко.

Так что высокоуровневость бывает разная. Кому-то неважно есть в языке изящные средства для выражения мыслей или нет, если он просто собирает проект из чужих готовых "кубиков".

alman пишет:

Chaosorg пишет: Осциллограф тоже хорошо, но мне для него Марсоход 2 пока больше подходит, а когда перестанет хватать, то без посторонней поддержки мне придется перейти в лагерь тех, кто паяет сам. И я хоть и медленно, но движусь в этом направлении несмотря на нынешние цены. Можете поздравить с приобретением аналогового осциллографа (для отладки аналоговой части).

Поздравляю! Осциллограф - полезная в хозяйстве вещь. Кстати, говоря о плате расширения, превращающей Марсоход2 в осциллограф, я имел в виду как раз Марсоход2. Хотя, наверное, если сменить прошивку то плата без пайки пойдёт и на Марсоходе3?


частота дискретизации у встроенного в MAX10 АЦП всего 1МГц :( Он там наверное максимум для опроса датчиков при построении на нем какого-то микроконтроллера с софт-ядром, как Altera в рекламе показывает. Все что быстрее для MAX10 надо формировать отдельной микросхемой АЦП как это сделано в Марсоходе 2, но не сделано в Марсоходе 3. Справедливости ради замечу, что интересные частоты дискретизации все равно рано или поздно потребуют перехода на какие-то более быстрые АЦП и тогда смысла оставаться на Марсоходе 2 не останется.

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

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

Пожелания для Марсохода4 4 года 9 мес. назад #5321

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

Chaosorg пишет: Раз уж привели пример с графикой...

Первые проекты для разных Марсоходов были - "моргаем светодиодами..."
Для экспериментов с высокоуровневым синтезом тоже нужно выбрать какой-то стартовый уровень. Я выбрал задачу реализации графического интерфейса - легко расширяется от простого к сложному, и в то-же время плохо подходит для синтезируемого Верилога. Для старта, вместо 8 светодиодов - 8 прямоугольников на мониторе, и чтобы мышкой можно было перемещать их, менять форму/размеры, цепляя за стороны/углы. А программа на Си для ПК - просто наглядное ТЗ, что надо получить на дешевой ПЛИС без использования каких-либо процессоров. Решение на синтезируемом HDL, естественно, должно быть совершенно в другом стиле, чем для ПК, и без каких-либо "готовых кубиков". Прямоугольников м/б и много больше, чтобы не было соблазна делать все на регистрах.

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

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

Пожелания для Марсохода4 4 года 9 мес. назад #5322

  • kox
  • kox аватар
  • Не в сети
  • Осваиваюсь на форуме
  • Осваиваюсь на форуме
  • Сообщений: 26
  • Спасибо получено: 3
Немного оффтопа:
to Leka
Сейчас экспериментирую с ПЛИС на тему вывода анимации на монитор.
Так как в написании программ для PC я полный ноль, приходится каждый кадр gif анимации вручную конверт рожать в 8 битый бинарник, а затем сшивать бинарники в один файл с помощью total comander. Это долго и утомительно- однообразные действия.
Если вы так легко написали пример на C, может напишите софтинку, которая конвертирует gif в бинарник?
Не сочтите за наглость конечно :oops:

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

Пожелания для Марсохода4 4 года 9 мес. назад #5323

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

kox пишет: конвертирует gif в бинарник?

Мне это сложно, никогда не решал подобные задачки.

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

Пожелания для Марсохода4 4 года 9 мес. назад #5324

  • kox
  • kox аватар
  • Не в сети
  • Осваиваюсь на форуме
  • Осваиваюсь на форуме
  • Сообщений: 26
  • Спасибо получено: 3
Ясно. Ну тогда продолжу вручную сшивать анимации. :)

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

Пожелания для Марсохода4 4 года 9 мес. назад #5325

  • Leka
  • Leka аватар
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54
В документации на openGL и glut ничего нет про gif, только bmp. Надо как-то преобразовать animated gif в серию bmp, а дальше д/б легко (у bmp простой формат, если правильно помню).

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

Пожелания для Марсохода4 4 года 9 мес. назад #5326

kox пишет: Немного оффтопа:
to Leka
Сейчас экспериментирую с ПЛИС на тему вывода анимации на монитор.
Так как в написании программ для PC я полный ноль, приходится каждый кадр gif анимации вручную конверт рожать в 8 битый бинарник, а затем сшивать бинарники в один файл с помощью total comander. Это долго и утомительно- однообразные действия.
Если вы так легко написали пример на C, может напишите софтинку, которая конвертирует gif в бинарник?
Не сочтите за наглость конечно :oops:

Не не! И чтобы она выполнялась без процессора в ПЛИС и была написана на высокоуровневом HDL 8-0

P.S.
Извините, не сдержался :)
На самом деле, сорри, что влезаю, но такие задачи можно решать в "unix стиле", т.е. найти утилиту командной строки, которая умеет сохранять анимированный gif как набор отдельных bmp файлов, потом утилиту, которая превращает их в bin (ну или сразу, которая gif в bin), потом почитать опции команды cp для склейки бинарных файлов и написать bat или cmd или bash файл командный, который всю эту рутину будет выполнять одним кликом. Может даже тот софт, которым Вы уже пользуетесь умеет слушаться командную строку.

Вот конвертер анимированного gif в набор bmp, например
www.umbrellastudio.com/tools/extract-fra...rom-an-animated-gif/
там внизу есть даже ссылка на исходники

Про прямоугольники замечу, что на этом сайте для первого (!) марсохода на верилоге есть игры теннис и питон (змейка).

Еще вопрос к Leka: Вы видеокарты "дошейдерных" времен или векторные дисплеи считаете процессорами или нет? Т.е. я про устройства, которые строят изображение по некоему подобию задания или описания сцены?

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

Последнее редактирование: от Chaosorg.
Время создания страницы: 0.235 секунд
Работает на Kunena форум