[Logo] Форум DL
  [DL]  Back to home page 
Forum Index ->Учебный процесс ГГУ/СШ 27 ->Проектирование цифровых систем 1, 2, 3, 4, ... 24, 25, 26
Author Message
Igor Korshunov

Topics: 7
Messages: 2186

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

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

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

Topics: 7
Messages: 2186

My Profile
Модификаторы __in, __out имеют значение только при автоматическом построении схемы по МПА-программе.
При написании программ для задач на программирование их можно не указывать.
Mihail Dolinskiy

Topics: 1985
Messages: 47294

My Profile
Почему-то возникли проблемы с этим кодом. Не работает сравнение 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;}
	}
}

Igor Korshunov

Topics: 7
Messages: 2186

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

Наверное имелось в виду
{OUT_0 = IN_0 + ~IN_1;}
Igor Korshunov

Topics: 7
Messages: 2186

My Profile

Я считаю,что мое решение в 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 тесты не проходят.
Igor Korshunov

Topics: 7
Messages: 2186

My Profile
При проектировании следует использовать знаковые целочисленные типы только тогда, когда они действительно нужны. В остальных случаях предпочтительно использование беззнаковых типов (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;
Aleksandr Moiseenko

Topics: 0
Messages: 3

My Profile
Задача 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.
Mihail Dolinskiy

Topics: 1985
Messages: 47294

My Profile
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
Mihail Dolinskiy

Topics: 1985
Messages: 47294

My Profile
Саша Громыко написал

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  


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

Topics: 1
Messages: 15

My Profile
Зачет\Индивидуальные задания\Проектирование цифровых устройств\Вычислить выражение\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]
Aleksandr Gromyko

Topics: 0
Messages: 12

My Profile
В задаче "Зачет\Контроль практики\Проектирование\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; 

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

Topics: 1
Messages: 26

My Profile
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
Slava Konoplev

Topics: 1
Messages: 15

My Profile
unsigned __bits(5) t;
unsigned __bits(3) c1=3;
...

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


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

Topics: 1
Messages: 26

My Profile
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.
в ХЛСКАДе естессно не работает)
Mihail Dolinskiy

Topics: 1985
Messages: 47294

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