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

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

Мой профиль
Вот некоторые ошибки:
unsigned char t[12]=''; - строковой литерал должен быть заключен в двойные кавычки, т.е. правильно так:
unsigned char t[12]="";

t += in1[2]; - нельзя присваивать массиву, правильно так:
t[i] = in1[2];

for (i;i<11,in1[i]!='#',in2[i]!='#';i++) - пропущена инициализация, в условии продолжения цикла скорее всего ошибка, т.к. все три условия вычисляются, но в итоге используется только результат третьего сравнения. Прочитайте о том, как работает оператор ','.
Игорь Коршунов

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

Мой профиль
Модификаторы __in, __out имеют значение только при автоматическом построении схемы по МПА-программе.
При написании программ для задач на программирование их можно не указывать.
Михаил Долинский (Online)

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

Мой профиль
Почему-то возникли проблемы с этим кодом. Не работает сравнение IN_0<IN_1. В IN_0 значение F4, а в IN_1 02.

int __in __bits(8) IN_0;
int __in __bits(8) IN_1;

int __out __bits(9) OUT_0;

void main()
{
  if (IN_0==IN_1)
	{OUT_0=IN_0+IN_1+1;}
  else
	{if (IN_0<IN_1)
	  {OUT_0=IN_0+!IN_1;}
	 else {OUT_0=!IN_0+IN_1;}
	}
}

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

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

Мой профиль
Возможно ошибка в этой строчке:
{OUT_0=IN_0+!IN_1;}

Наверное имелось в виду
{OUT_0 = IN_0 + ~IN_1;}
Игорь Коршунов

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

Мой профиль

Я считаю,что мое решение в Winter правильное,а в HLCCAD оно не проходит все
тесты

unsigned __in __bits(2) IN_0;
unsigned __in __bits(2) IN_1;

unsigned __out __bits(5) OUT_0;

void main()
{

OUT_0=1;
if (IN_1==0) OUT_0=1;
else
{
for (int i=1;i<(IN_1+1);i++)
OUT_0=OUT_0*IN_0;
}
}
 


Нелья сохранять промежуточный результаты в выходную переменную (OUT_0), т.к. это приводит к тому, что на выходе устройства значение постоянно изменяется. Соответсвенно устройство функционирует неверно - поэтому в HLCCAD тесты не проходят.
Игорь Коршунов

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

Мой профиль
При проектировании следует использовать знаковые целочисленные типы только тогда, когда они действительно нужны. В остальных случаях предпочтительно использование беззнаковых типов (unsigned перед названием типа).

Пример неправильного использования знаковых типов:
int __in __bits(1) in_2;
int __in __bits(1) in_1;
int __in __bits(1) in_0;
int __out __bits(1) out_3;
int __out __bits(1) out_2;
int __out __bits(1) out_1;
int __out __bits(1) out_0;
Александр Моисеенко

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

Мой профиль
Задача http://dl/task.jsp?nid=197493&cid=549
Решение, prd файл которого не успевает скомпилироваться и занимает ~300kb (Ошибка: "Чекер снят по абсолютному времени (>127 sec)" DelTA3 at Nit3):
unsigned __in __bits(1) x1;
unsigned __in __bits(1) x2;
unsigned __in __bits(1) x3;
unsigned __in __bits(1) x4;

unsigned __out __bits(1) y1;
unsigned __out __bits(1) y2;
unsigned __out __bits(1) y3;
unsigned __out __bits(1) y4;

int p = 0;

void main() {
	p = x1;
	p = (p<<1) + x2;
	p = (p<<1) + x3;
	p = (p<<1) + x4;

	if (p == 0) p = 0;
	if (p == 1) p = 10;
	if (p == 2) p = 1;
	if (p == 3) p = 11;
	if (p == 4) p = 3;
	if (p == 5) p = 1;
	if (p == 6) p = 8;
	if (p == 7) p = 10;
	if (p == 8) p = 3;
	if (p == 9) p = 11;
	if (p == 10) p = 1;
	if (p == 11) p = 8;
	if (p == 12) p = 2;
	if (p == 13) p = 1;
	if (p == 14) p = 10;
	if (p == 15) p = 8;

	y4 = p%2; p = p>>1;
	y3 = p%2; p = p>>1;
	y2 = p%2; p = p>>1;
	y1 = p%2;
}

А теперь решение, которое проходит и prd весит всего лишь 100kb:
unsigned __in __bits(1) x1;
unsigned __in __bits(1) x2;
unsigned __in __bits(1) x3;
unsigned __in __bits(1) x4;

unsigned __out __bits(1) y1;
unsigned __out __bits(1) y2;
unsigned __out __bits(1) y3;
unsigned __out __bits(1) y4;

int p = 0;

void main() {
	p = x1;
	p = (p<<1) + x2;
	p = (p<<1) + x3;
	p = (p<<1) + x4;

	switch (p) {
		case 0: p = 0; break;
		case 1: p = 10; break;
		case 2: p = 1; break;
		case 3: p = 11; break;
		case 4: p = 3; break;
		case 5: p = 1; break;
		case 6: p = 8; break;
		case 7: p = 10; break;
		case 8: p = 3; break;
		case 9: p = 11; break;
		case 10: p = 1; break;
		case 11: p = 8; break;
		case 12: p = 2; break;
		case 13: p = 1; break;
		case 14: p = 10; break;
		case 15: p = 8; break;
	};

	y4 = p; p >>= 1;
	y3 = p; p >>= 1;
	y2 = p; p >>= 1;
	y1 = p;
}

Различие в том, что следует:
1. Если есть множество if-ов объединять их по возможности в единый switch;
2. Если нужен сдвиг на константу, то помнить, что p = p>>1, порождает больше кода для HLCCAD, т.к. требуется сделать сдвиг p>>1, а затем присвоение результата снова p. Поэтому нужно писать p >>= 1, эта операция производит просто сдвиг, без дополнительного присваивания;
3. Если нужно получить последний бит числа, то писать y4 = p, где y4 - однобитовая переменная, а p - многобитная, но не писать y4 = p%2;
4. Отказаться вообще от p%2, лучше писать (p & 1), т.к. эта операция порождает более компактное выходное устройство;
5. Помнить о приоритете операции >> и <<, т.к. можно ошибиться и написать p = p<<1 + x, а на самом деле оно означает p = p<<(1+x), т.к. приоритет '+' выше. В следствии этого можно "убить много времени" на поиск, почему программа не проходит по времени. Результатом тайм лимита на самом деле будет то, что сдвиг на переменную "очень дорогая операция" для генератора. Лучше сдвиг на константу всегда брать в скобки, т.е. писать p = (p<<1) + x.
Михаил Долинский (Online)

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

Мой профиль
unsigned __in __bits(8) in_0;
unsigned __in __bits(8) in_1;

unsigned __out __bits(9) out_0;

void main() {
	if (in_0 == in_1) 
	  out_0=1+2*in_0;
	else
	  if (in_0>in_1) out_0=in_1+(~in_0);
	  else out_0=in_0+(~in_1);
}
Катя Калачева написала такое решение задачи 8. Антисумматор.
Нам показалось, что программа симулируется с ошибкой - обнуляется In_1 перед первым else
Михаил Долинский (Online)

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

Мой профиль
Саша Громыко написал

unsigned __in __bits(1) x1;
unsigned __in __bits(1) x2;
unsigned __in __bits(1) x3;
unsigned __in __bits(1) x4;

unsigned __out __bits(1) y1;
unsigned __out __bits(1) y2;
unsigned __out __bits(1) y3;
unsigned __out __bits(1) y4;

void main() {
	     if (x1 == 0 && x2 == 0 && x3 == 0 && x4 == 0) { y1 = 0; y2 = 0; y3 = 0; y4 = 1; }
	else if (x1 == 0 && x2 == 0 && x3 == 0 && x4 == 1) { y1 = 0; y2 = 0; y3 = 1; y4 = 0; }
	else if (x1 == 0 && x2 == 0 && x3 == 1 && x4 == 0) { y1 = 0; y2 = 0; y3 = 1; y4 = 1; }
	else if (x1 == 0 && x2 == 0 && x3 == 1 && x4 == 1) { y1 = 0; y2 = 1; y3 = 0; y4 = 0; }
	else if (x1 == 0 && x2 == 1 && x3 == 0 && x4 == 0) { y1 = 0; y2 = 1; y3 = 0; y4 = 1; }
	else if (x1 == 0 && x2 == 1 && x3 == 0 && x4 == 1) { y1 = 0; y2 = 1; y3 = 1; y4 = 0; }
	else if (x1 == 0 && x2 == 1 && x3 == 1 && x4 == 0) { y1 = 0; y2 = 1; y3 = 1; y4 = 1; }
	else if (x1 == 0 && x2 == 1 && x3 == 1 && x4 == 1) { y1 = 1; y2 = 0; y3 = 0; y4 = 0; }
	else if (x1 == 1 && x2 == 0 && x3 == 0 && x4 == 0) { y1 = 1; y2 = 0; y3 = 0; y4 = 1; }
	else if (x1 == 1 && x2 == 0 && x3 == 0 && x4 == 1) { y1 = 1; y2 = 0; y3 = 1; y4 = 0; }
	else if (x1 == 1 && x2 == 0 && x3 == 1 && x4 == 0) { y1 = 1; y2 = 0; y3 = 1; y4 = 1; }
	else if (x1 == 1 && x2 == 0 && x3 == 1 && x4 == 1) { y1 = 1; y2 = 1; y3 = 0; y4 = 0; }
	else if (x1 == 1 && x2 == 1 && x3 == 0 && x4 == 0) { y1 = 1; y2 = 1; y3 = 0; y4 = 1; }
	else if (x1 == 1 && x2 == 1 && x3 == 0 && x4 == 1) { y1 = 1; y2 = 1; y3 = 1; y4 = 0; }
	else if (x1 == 1 && x2 == 1 && x3 == 1 && x4 == 0) { y1 = 1; y2 = 1; y3 = 1; y4 = 1; }
	else if (x1 == 1 && x2 == 1 && x3 == 1 && x4 == 1) { y1 = 0; y2 = 0; y3 = 0; y4 = 0; }
}


При переводе такого решения в схему мне выдается запись в протоколе:
6.2 10:03 2. Котенок 0 / 100 Чекер снят по времени (>117 sec) Arifm2.prd DelTA3 at Nit3 HLCCAD project  


На мой взгляд, такое решение по времени сниматься не может.
Слава Коноплев

Темы: 1
Сообщений: 15

Мой профиль
Зачет\Индивидуальные задания\Проектирование цифровых устройств\Вычислить выражение\6 - "Инкрементор на 3" 41247 Ходорич Дмитрий, ПОИТ-36, апрель 2006 Баллов: 300

В винтере все тесты проходят.
В HLCCAD'e проверить не смог. В половине случаев просто Программа не отвечает, в другой половине значения на выходе отличались от правильного ответа.
При проверке выдается ошибка.

unsigned __in __bits(4) IN_1;
unsigned __out __bits(4) OUT_1;


void main()
{
	OUT_1 = IN_1+3;

}


Ошибка: Несовпадение OUT_1:0000=0011 [11 ps]
Александр Громыко

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

Мой профиль
В задаче "Зачет\Контроль практики\Проектирование\1\10 - "Сдвиг" 42659" я нашел странности.

Вот код который прошел при решении задачи:
unsigned __in __bits(8) A;
unsigned __in __bits(4) Y;

unsigned __out __bits(8) B;

void main() {
	unsigned __bits(32) a1 = A;
	unsigned __bits(32) a2 = A;
	if ((Y & 1) == 1) {
		B = a1 >> 1;
	} else if ((Y & 2) == 2) {
		B =	a1 << 1;
	} else if ((Y & 4) == 4) {
		a2 <<= 7;
		B = a2 | (a1 >> 1);
	} else if ((Y & 8) == 8) {
		a2 >>= 7;
		B = a2 | (a1 << 1);
	} else {
		B = A;
	}
}


Этот код был изначально(он не проходил):
unsigned __in __bits(8) A;
unsigned __in __bits(4) Y;

unsigned __out __bits(8) B;

void main() {
	unsigned __bits(8) a1 = A;
	unsigned __bits(8) a2 = A;
	if ((Y & 1) == 1) {
		B = a1 >> 1;
	} else if ((Y & 2) == 2) {
		B =	a1 << 1;
	} else if ((Y & 4) == 4) {
		a2 <<= 7;
		B = a2 | (a1 >> 1);
	} else if ((Y & 8) == 8) {
		a2 >>= 7;
		B = a2 | (a1 << 1);
	} else {
		B = A;
	}
}


Разницы заключается в том, что в первом коде объявил переменные по 32 бита
unsigned __bits(32) a1 = A;
unsigned __bits(32) a2 = A; 
, а во втором коде переменные были объявлены по 8 бит
unsigned __bits(8) a1 = A;
unsigned __bits(8) a2 = A; 

С идеологической точки зрения я не вижу тут ошибки все должно работать.
Александр Гладченко

Темы: 1
Сообщений: 26

Мой профиль
unsigned __in __bits(8)	a;
unsigned __in __bits(8)	b;
unsigned __in __bits(8)	c;
unsigned __in __bits(8)	d;
unsigned __out __bits(16) z;
unsigned __out __bits(8) s;

void main()
{
	unsigned __bits(8) min=65535;
	unsigned __bits(8) max=0;
	unsigned __bits(8)	a1=a;
	unsigned __bits(8)	b1=b;
	unsigned __bits(8)	c1=c;
	unsigned __bits(8)	d1=d;
	unsigned __bits(8)	n=0;
	if (min>a1) min=a1; 	if (max<a1) max=a1;
	if (min>b1) min=b1; 	if (max<b1) max=b1;
	if (min>c1) min=c1; 	if (max<c1) max=c1;
	if (min>d1) min=d1; 	if (max<d1) max=d1;
	if (min==a1 && n==0) {a1=0; n=1;}
	if (min==b1 && n==0) {b1=0; n=1;}
	if (min==c1 && n==0) {c1=0; n=1;}
	if (min==d1 && n==0) {d1=0; n=1;}
	n=0;
    if (max==a1 && n==0) {a1=0; n=1;}
	if (max==b1 && n==0) {b1=0; n=1;}
	if (max==c1 && n==0) {c1=0; n=1;}
	if (max==d1 && n==0) {d1=0; n=1;}

	z=min*max; s=a1+b1+c1+d1;
}

Написал слегка страшненький код но все же, он в винтере работает а при переходе в ХЛСКАД не работает.

Задача номер 56926
Слава Коноплев

Темы: 1
Сообщений: 15

Мой профиль
unsigned __bits(5) t;
unsigned __bits(3) c1=3;
...

void main()
{unsigned __bits(3) c2=3;
 ....
}


В винтере в списке переменных будут видны только t и с1. c2 не видно. При добавлении вручную окошко с переменной отображается, но изменение переменной там не отражаются. Также при наведении мышкой на переменную в процессе работы программы на с2 пишет неизвестный идентификатор. При переносе описания из функции в описание глобальных переменных, все становится нормально
Александр Гладченко

Темы: 1
Сообщений: 26

Мой профиль
unsigned __in __bits(8) in_0;
unsigned __in __bits(8) in_1;
unsigned __out __bits(8) out_0;

void main()
{
	unsigned __bits(4) i=0;
	unsigned __bits(1) x1=0;
	unsigned __bits(1) x2=0;
	out_0=0;
	for(i=0;i<8;i++)
	{
	    x1=in_0>>i; x2=in_1>>i;
		if(x1==1 && x2==1) out_0++;
	}
}

этот чудо-код проходит все тесты в винтере на задаче номер 39263.
в ХЛСКАДе естессно не работает)
Михаил Долинский (Online)

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

Мой профиль
В последнем случае ошибка известная
На выходной контакт (переменная out_0) значение нужно подавать только один раз. В программе Саши Гладченко это не так, и поэтому на выходе схемы все время появляются разные значения ...
 
Индекс форума ->Учебный процесс ГГУ/СШ 27 ->Проектирование цифровых систем 1, 2, 3, 4, ... 24, 25, 26
Time:0,054