[Logo] Форум DL
  [DL]  На главную страницу 
Индекс форума ->Учебный процесс ГГУ/СШ 27 ->Проектирование цифровых систем 1, 2, 3, ... 16, 17, 18, 19, 20, ... 24, 25, 26
Автор Сообщение
Игорь Коршунов

Темы: 7
Сообщений: 2186

Мой профиль


Михаил Бугаенко:

Индивидуальные задания->проектирование цифровых систем->непростая арифметика->корректное время

Вроде подставляю в винтере все тестовые значения и все нормально работает, результаты правильные, в hlccad валится вроде как самый первый тест, не могу понять проблему, подскажите, пожалуйста
ссылка - http://dl.gsu.by/task.jsp?nid=1676647&cid=1061 

Исправлена задержка в тестах.
Никита Коротчиков

Темы: 3
Сообщений: 43

Мой профиль
Где-то видел на форуме, что в C-MPA поддерживается директива #define.
Она работает только для определения констант?

Т.е., я не могу написать что-то подобное:
#define max(a, b) (((a) < (b)) ? (a) : (b))
?
Михаил Долинский

Темы: 1984
Сообщений: 47219

Мой профиль
А давай ты сначала сам найдёшь то место, где видел.
И если вопрос останется - повторишь.


Михаил Долинский:

1. Микропрограммирование на С-МПА, генерация схем по микропрограммам. Разбор решений контрольной номер 1.

Примеры задач с решениями
Как работать с битами в С(С-МПА) - Антоненко Александр, ПМ-41, 13 февраля 2009
Синтезируемые конструкции С-МПА
Простейшие параллели Паскаль - С
Вопросы и ответы по С-МПА
Компилятор языка CMPDL
Учебник по работе с компилятором CMPDL + WInter
Учебник по построению схем MPA в HLCCAD
Никита Коротчиков

Темы: 3
Сообщений: 43

Мой профиль


Михаил Долинский:

А давай ты сначала сам найдёшь то место, где видел.
И если вопрос останется - повторишь.


Михаил Долинский:

1. Микропрограммирование на С-МПА, генерация схем по микропрограммам. Разбор решений контрольной номер 1.

Примеры задач с решениями
Как работать с битами в С(С-МПА) - Антоненко Александр, ПМ-41, 13 февраля 2009
Синтезируемые конструкции С-МПА
Простейшие параллели Паскаль - С
Вопросы и ответы по С-МПА
Компилятор языка CMPDL
Учебник по работе с компилятором CMPDL + WInter
Учебник по построению схем MPA в HLCCAD
 



Игорь Коршунов:

Демонстрационная программа показывающая конструкции языка С-МПА, которые можно использовать для синтеза HLCCAD-схем:

/*
Особености програмирования на CMPDL:

- для удобства работы контакты лучше объявлять как
  глобальные переменные

- программа никогда не завершается
  после завершения функция main начинает выполняться сначала
  Поэтому неправильно использовать выходной контакт для промежуточных 
  вычислений



Поддерживается:

- целые знаковые/беззнаковые типы произвольной размерности
- входные/выходные контакты
- арифметические (* / + -)и логические ( & | ^ ~) выражения  ~
- операторы:
	for
	if
	while
	do .. while
	switch
- функции
- директивы препроцессора
	#define
	#ifdef
	#elseif
	#endif

int x = -1; // размерность по умолчанию 32 бита
unsigned __bits(8) z = 0x5; // шестнадцатеричная константа
unsigned __bits(8) y = 05; // восьмеричная константа  - префикс буква 'O'

// входные контакты
unsigned __in __bits(16) A;
unsigned __in __bits(16) B;

// выходной контакт
unsigned __out __bits(16) O;

// функция
unsigned __bits(16) foo(unsigned __bits(16) p1, unsigned __bits(16) p2)
{
	return (p1 + p2) * (p1 + p2);
}

// функция main
void main()
{

	// вызов функции
	unsigned __bits(16)	t = foo(A, B);

	unsigned __bits(8) i;

	// цикл for
	for (i = 0; i < 5; i++)
	{
		if (i == 3) continue;
		t *= A;
		if (t > A * 10) break;
	}

	// цикл do .. while
	do
	{
		t /= 2;
		if (t == 3 * A) break;
	} while (t > 10);

	// цикл while
	while(t < 10)
	{
		t += A - B + 1;
	}

	unsigned __bits(8) a = (A +	B) / 5;

	// оператор switch
	switch(a)
	{
		case 0:
			t -= 5;
			break;
		case 1:
			t += A * B;
			break;
		case 2:
			t = 100;
		default:
			t--;
	}

	// оператор ветвления if else
	if (A + B > t && t != 6) t = -t;
	else if (A + B == t || t < A) t -= A;
	else
	{
		t &= A | B;
		t = ~t;
	}

	// в конце результат подаем на выходной контакт
	O = t;
}

 
Игорь Коршунов

Темы: 7
Сообщений: 2186

Мой профиль


Никита Коротчиков:

Где-то видел на форуме, что в C-MPA поддерживается директива #define.
Она работает только для определения констант?

Т.е., я не могу написать что-то подобное:
#define max(a, b) (((a) < (b)) ? (a) : (b))


Так нельзя.
Никита Коротчиков

Темы: 3
Сообщений: 43

Мой профиль
unsigned __in __bits(8) In = 143;

unsigned __out __bits(4) Out;

void main() {
	unsigned __bits(8) n = In;
	unsigned __bits(4) k = 0;
	unsigned __bits(4) t = 0;
	for (unsigned __bits(4) i = 0; i < 8; i++) {
		if (i % 2 == 0 && (1 & (n >> i))) {
			k |= 1 << t; // здесь
			t++;
		}
	}
	Out = k;
}

Вылетает exception EAccessViolation in module MPA.dll at 000259B0. Access violation at address 064C59B0 in module 'MPA.dll'. Read of address 065EFFFF.
UPDATE: скачал отсюда http://dl.gsu.by/NForum/posts/topicshow/1298.dl?&page=1 - код заработал
Александр Ковальчук

Темы: 0
Сообщений: 19

Мой профиль
Странная вещь.
http://dl.gsu.by/task.jsp?nid=1759006&cid=1099
Экзамен\Индивидуальные задания\Сконвертированные задания на программирование по схеме\Логические элементы\4 - "Программа по схеме 84266"
Ломается при отправке на втором тесте. Хотя локально правильно выполняются все тесты.


unsigned __in __bits(8) A;
unsigned __in __bits(8) B;

unsigned __out __bits(8) C;

void main()
{
	C |= ((A >> 0) ^ (B >> 0)) << 0;
	C |= ((A >> 1) ^ (B >> 1)) << 1;
	C |= ((A >> 2) ^ (B >> 2)) << 2;
	C |= ((A >> 3) ^ (B >> 3)) << 3;
	C |= ((A >> 4) ^ (B >> 4)) << 4;
	C |= ((A >> 5) ^ (B >> 5)) << 5;
	C |= ((A >> 6) ^ (B >> 6)) << 6;
	C |= ((A >> 7) ^ (B >> 7)) << 7;
}

Никита Коротчиков

Темы: 3
Сообщений: 43

Мой профиль


Александр Ковальчук:

Странная вещь.
http://dl.gsu.by/task.jsp?nid=1759006&cid=1099
Экзамен\Индивидуальные задания\Сконвертированные задания на программирование по схеме\Логические элементы\4 - "Программа по схеме 84266"
Ломается при отправке на втором тесте. Хотя локально правильно выполняются все тесты.


unsigned __in __bits(8) A;
unsigned __in __bits(8) B;

unsigned __out __bits(8) C;

void main()
{
	C |= ((A >> 0) ^ (B >> 0)) << 0;
	C |= ((A >> 1) ^ (B >> 1)) << 1;
	C |= ((A >> 2) ^ (B >> 2)) << 2;
	C |= ((A >> 3) ^ (B >> 3)) << 3;
	C |= ((A >> 4) ^ (B >> 4)) << 4;
	C |= ((A >> 5) ^ (B >> 5)) << 5;
	C |= ((A >> 6) ^ (B >> 6)) << 6;
	C |= ((A >> 7) ^ (B >> 7)) << 7;
}
 

Нельзя out контакт изменять больше одного раза. Т. е., нужно заводить отдельную переменную, где делать все вычисления, а в конце заносить в out.
unsigned __in __bits(8) A;
unsigned __in __bits(8) B;

unsigned __out __bits(8) C;

void main() {
	unsigned __bits(8) a = A;
	unsigned __bits(8) b = B;
	unsigned __bits(8) c = 0;
	c |= ((a >> 0) ^ (b >> 0)) << 0;
	c |= ((a >> 1) ^ (b >> 1)) << 1;
	c |= ((a >> 2) ^ (b >> 2)) << 2;
	c |= ((a >> 3) ^ (b >> 3)) << 3;
	c |= ((a >> 4) ^ (b >> 4)) << 4;
	c |= ((a >> 5) ^ (b >> 5)) << 5;
	c |= ((a >> 6) ^ (b >> 6)) << 6;
	c |= ((a >> 7) ^ (b >> 7)) << 7;
	C = c;
}

И лучше заносить все in-ы в локальные переменные.
Александр Ковальчук

Темы: 0
Сообщений: 19

Мой профиль


Никита Коротчиков:


Нельзя out контакт изменять больше одного раза. Т. е., нужно заводить отдельную переменную, где делать все вычисления, а в конце заносить в out.

И лучше заносить все in-ы в локальные переменные.
 


Я понял, спасибо. А есть ещё что-то странное с извлечением значений битов из чисел.
Экзамен\Индивидуальные задания\Сконвертированные задания на программирование\Логические элементы\6 - "Ключи и ящики"
http://dl.gsu.by/task.jsp?nid=1759783&cid=1099

В этой задаче при получении битов из первого и второго числа в цикле, когда i = 2, In0 >> 2 должно равняться 1 и In1 >> 2 должно равняться тоже 1. При отладке выяснилось, что In0 >> 2 равно 1, но In1 >> 2 равно 0. Хотя в этой позиции в двух числах одинаковые значения битов и равны единице.

unsigned __in __bits(8) in_0 = 11100100;
unsigned __in __bits(8) in_1 = 00000100;

unsigned __out __bits(1) out_0;

void main()
{
	unsigned __bits(8) In0 = in_0;
	unsigned __bits(8) In1 = in_1;
	unsigned __bits(1) f = 0;

	unsigned __bits(1) a;
	unsigned __bits(1) b;

	for(int	i = 0; i < 8; i++) {
		a = (In0 >> i);
		b = (In1 >> i);
		if (a == b & a == 1) {
			f = 1;
			break;
		}
	}
	out_0 = f;
}

Игорь Коршунов

Темы: 7
Сообщений: 2186

Мой профиль


Александр Ковальчук:


В этой задаче при получении битов из первого и второго числа в цикле, когда i = 2, In0 >> 2 должно равняться 1 и In1 >> 2 должно равняться тоже 1. При отладке выяснилось, что In0 >> 2 равно 1, но In1 >> 2 равно 0. Хотя в этой позиции в двух числах одинаковые значения битов и равны единице.

unsigned __in __bits(8) in_0 = 11100100;
unsigned __in __bits(8) in_1 = 00000100;

unsigned __out __bits(1) out_0;

void main()
{
	unsigned __bits(8) In0 = in_0;
	unsigned __bits(8) In1 = in_1;
	unsigned __bits(1) f = 0;

	unsigned __bits(1) a;
	unsigned __bits(1) b;

	for(int	i = 0; i < 8; i++) {
		a = (In0 >> i);
		b = (In1 >> i);
		if (a == b & a == 1) {
			f = 1;
			break;
		}
	}
	out_0 = f;
}
 

В Си если число начинается на ноль, то оно записано в 8-ричной системе, т.е. в твоем примере in_1 = 64 и в нем нет 1 во втором бите. В отладчике можно посмотреть чему равняются значения переменных.


in_0 = 11100100;
Компилятор Си воспринимает это число как десятичное.

В Си нет возможности записать число в двоичной системе. В таких случаях используют 16-ричную систему, т.к. легко перевести в двоичную и обратно.

in_0 = 0xE4;
Сергей Щукин

Темы: 0
Сообщений: 7

Мой профиль
http://dl.gsu.by/task.jsp?nid=1768088&cid=1099

Не проходит тесты, если переменные объявлять как int, нужно писать unsigned.
Игорь Коршунов

Темы: 7
Сообщений: 2186

Мой профиль
Условие:

На входе - IN дано 6-и разрядное число. Определить делится ли это число на 2,3,4,5. Если делится, то на соответствующий выход подавать 1, иначе - 0. 


Решение:
int __in __bits(6) IN;
int __out __bits(1) TWO;
int __out __bits(1) THREE;
int __out __bits(1) FOUR;
int __out __bits(1) FIVE;

void main() {
	int __bits(6) k = IN;
	if(k % 2 == 0) {
		TWO = 1;
	} else {
		TWO = 0;
	}

	if(k % 3 == 0) {
		THREE = 1;
	} else {
		THREE = 0;
	}
	
	if(k % 4 == 0) {
		FOUR = 1;
	} else {
		FOUR = 0;
	}

	if(k % 5 == 0) {
		FIVE = 1;
	} else {
		FIVE = 0;
	}
}


Сергей Щукин:

http://dl.gsu.by/task.jsp?nid=1768088&cid=1099

Не проходит тесты, если переменные объявлять как int, нужно писать unsigned. 

Игорь Коршунов

Темы: 7
Сообщений: 2186

Мой профиль
Для тех у кого проблемы с отображением русских букв можно включить в WInter поддержку английского языка. Для этого нужно скачать файл языка: English.lng (ссылка работает только из сети ГГУ) и скопировать его в папку \WINTER\bin\Languages\.

Или можно попробовать настроить отображение русского языка в ОС. Пример как это сделать в Windows 10:

1. Откройте панель управления, для этого можно начать набирать "Панель управления" или "Control Panel" в поиске на панели задач.
2. Убедитесь, что в поле "Просмотр" (View by) установлено "Значки" (Icons) и выберите пункт "Региональные стандарты" (Region).
3. На вкладке "Дополнительно" (Administrative) в разделе "Язык программ, не поддерживающих Юникод" (Language for non-Unicode programs) нажмите по кнопке "Изменить язык системы" (Change system locale).
4. Выберите русский язык, нажмите "Ок" и подтвердите перезагрузку компьютера.
 
Александр Ковальчук

Темы: 0
Сообщений: 19

Мой профиль
Экзамен\Индивидуальные задания\Сконвертированные задания на программирование\Простые устройства с памятью\2 - "Арифметика"
http://dl.gsu.by/task.jsp?nid=1760013&cid=1099

На сервере не проходит тест 7, хотя у меня локально проходит все тесты и вовремя. Что бы это могло быть?

int __in __bits(2) A;
int __in __bits(2) B;
int __in __bits(2) C;
int __out __bits(8) RES;
int __bits(8) k;

void main() {
	unsigned __bits(2) mya = A;
	unsigned __bits(2) myb = B;
	unsigned __bits(2) myc = C;
	if (mya * myb < myc + 1) {
		k = 0;
	} else if (mya * myb > myc + 1) {
		k = mya * myb - myc;
	}
	RES = k;
}

Михаил Долинский

Темы: 1984
Сообщений: 47219

Мой профиль
А ты всё по пунктам проверил здесь

В том числе:

"Решение проходит в отладчике, но не проходит тестирование":

Возьмите с DL и подключите тесты!
Скорей всего, Вы совершили одну из следующих ошибок:

1. НЕсоответствие названия выходной переменной условию задачи.

2. НЕсоответствие размерности элементов массива условиям задачи.
http://dl.gsu.by/NForum/posts/topicshow/46.dl?postid=44129#44129
http://dl.gsu.by/NForum/posts/topicshow/46.dl?postid=45926#45926

3. Неверный тип переменных (использовался int вместо unsigned)
http://dl.gsu.by/NForum/posts/topicshow/1792.dl?postid=46192#46192

4. Неинициализированная переменная
http://dl.gsu.by/NForum/posts/topicshow/46.dl?postid=55874#55874

"Решение проходит в Winter-е, но не проходит в HLCCAD":

1. Возьмите тесты из HLCCAD и подключите в Winter - прогоните программу на них.
2. Подключите тесты к сгенерированному проекту в HLCCAD - прогоните схему на них

Это позволит Вам диагностировать ситуацию:

Перечень возможных причин ситуации
1. Время, установленное в тесте для HLCCAD, недостаточно для выполнения Вашей микропрограммы.
- по истории изменения значений во время моделирования можно установить, в какое время на выходах Вашей схемы появляются правильные значения. И сравнить его со временем контроля этих же значений в тесте.

Если возможно оптимизировать программу, сделайте это
http://dl.gsu.by/NForum/posts/topicshow/46.dl?postid=46215#46215

Если Вы считаете невозможным написать программу, работающую быстрее - сообщите нам
(в теме "Ошибка в установке задачи - 201х")
или Вам подскажут как это сделать
или время на тест будет увеличено

2. В программе используются не синтезируемые (на текущий момент) конструкции:
- массивы
об этом выдается ПРЕДУПРЕЖДЕНИЕ во время синтеза - будьте внимательны!
Синтезируемые конструкции

3. В программе используются конструкции, которые требуют для обработки (генерации схемы) существенно больше времени, чем СЕЙЧАС отводится:
- сдвиг на переменное число разрядов
такие ситуации описываются в форуме, возможно в скором будущем они также будут протоколироваться во время синтеза
http://dl/NForum/posts/topicshow/46.dl?postid=3761#3761

4. Неоднократное занесение значений на выходные контакты. Изменение значений на входных контактах.
http://dl/NForum/posts/topicshow/46.dl?postid=224#224
http://dl/NForum/posts/topicshow/46.dl?postid=1937#1937
http://dl/NForum/posts/topicshow/46.dl?postid=3550#3550
http://dl/NForum/posts/topicshow/46.dl?postid=34228#34228
http://dl/NForum/posts/topicshow/46.dl?postid=44944#44944
http://dl/NForum/posts/topicshow/46.dl?postid=77048#77048

5. Асинхронная работа с входными контактами
http://dl/NForum/posts/topicshow/46.dl?postid=3646#3646

6. Ошибка в тестах
- если Вы это обнаружите и докажете, мы исправим

7. Ошибка в Вашей программе
Да, бывает и такое
Пользуйтесь отладчиком и режимами автоматического прогона ВСЕХ тестов!
 
Индекс форума ->Учебный процесс ГГУ/СШ 27 ->Проектирование цифровых систем 1, 2, 3, ... 16, 17, 18, 19, 20, ... 24, 25, 26
Time:0,046