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

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

Мой профиль


Александр Дудинский:

Здравствуйте, я занимался разработкой мультиплексора в C-MPA для обучения ИИ бота. Задача состоит в том, что на выход подаётся a+b+c+d, если a>b; в остальных случаях на выход подаётся a-b-c-d.
Код программы:

unsigned __in __bits(16) a=10;
unsigned __in __bits(16) b=1;
unsigned __in __bits(8) c=3;
unsigned __in __bits(8) d=4;

unsigned __out __bits(16) RES;

unsigned __bits(16) ms(unsigned __bits(1) A, unsigned __bits(16) X[2]){
	unsigned __bits(16) otvet;
	switch(A){
		case 0:	otvet=X[0]; break;
		case 1: otvet=X[1]; break;
	}
	return otvet;
}

void main(){
	unsigned __bits(1) A;
	unsigned __bits(16) X[2];

	X[0]=a+b+c+d;
	X[1]=a-b-c-d;

	if(a>b) A=1;
	else A=0;
	RES=ms(A,X[2]);
}


Выдаёт ошибку на 11-ой строке: This variable is not array: X.
По сути, проблема состоит в передаче массива в функцию. 

Передача массивов в функцию не работает, но можно так:
unsigned __bits(16) ms(unsigned __bits(1) A, unsigned __bits(16) X0, unsigned __bits(16) X1)

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

Темы: 2072
Сообщений: 49883

Мой профиль
Получается есть два рабочих варианта

unsigned __bits(16) MS(unsigned __bits(3) A, 
                       unsigned __bits(16) X0, 
                       unsigned __bits(16) X1,
                       unsigned __bits(16) X2
                       ...
                      )
       ...
       if (A==0) MS = X0;
       if (A==1) MS = X1;
       if (A==2) MS = X2;
       ...

и когда X передаётся как 2^A-битный вектор (с выделением сдвигами отдельных элементов).
Наверно первый удобнее.

для арифметических схем нужно ещё реализовать
x16=CBW(x8) 
x32=CWD(x16)
s16=SUM(A16,B16)
s16=ISUB(A16,B16)
p32=iMUL(A16,B16) 
d16=iDIV(A32,B16)
x16=x32                 // скорей всего уже правильно работает
R16=MS(A1,X16_0,X16_1)

Тогда схема условного арифметического выражения реализуется в С-МПА
как последовательность этих операторов 
в порядке вычислений
и с правильными названиями переменных, чтобы передавать сигналы 
с верхних блоков в нижние (в программе)
как с левых на правые (в схеме)


Для реализации всех остальных схем нужно
сделать также блоки
DC
CD
MS
(Матафонов Юра, ПИ-21 уже занимается)
Тогда для того, чтобы добиться от ИИ помощи в генерации схем для HLCCAD,
достаточно научить его писать С-МПА программы, вызывающие такие блоки
в нужной последовательности и правильно называя переменные.

Программы можно будет проверять, автоматически генерируя схемы
и отправляя их на тестирование.

Рисовать схему в HLCCAD можно глядя на текст такой программы.
Нарисованную схему тоже потом можно отправлять на тестирование.

Совсем круто, чтобы ИИ писал такую программу прямо с условия задачи.
Иван Гейко

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

Мой профиль
Ошибка компилятора
unsigned __in __bits(1) A;
unsigned __in __bits(1) B;
unsigned __in __bits(1) C;
unsigned __in __bits(1) D;
unsigned __in __bits(1) E;
unsigned __in __bits(1) F;
unsigned __out __bits(1) Q;
unsigned __bits(1) k;
void main()
{
unsigned __bits(1) kA;
unsigned __bits(1) kB;
unsigned __bits(1) kC;
unsigned __bits(1) kD;
unsigned __bits(1) kE;
unsigned __bits(1) kF;
kA = A; kB = B; kC = C; kD = D; kE = E; kF = F;
unsigned __bits(3) sum;
sum = kA;
sum += kB;
sum += kC;
sum += kD;
sum += kE;
sum += kF;
if((sum % 2) == 0) {
 k = 0;
 }
else if(sum > 3) {
 k = kD;
 }
else {
Q = k;
}
}

Иван Гейко

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

Мой профиль
после перезахода ошибка пропала
Глеб Тищенко

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

Мой профиль
http://dl.gsu.by/task.jsp?nid=2423960&cid=1370
char in1[128];
char out1[128];
unsigned __out __bits(8) y;

void main() {
	char temp[128];
	int i = 0;

	while(in1[i] != '#') {
	  if(in1[i] == 'A' || in1[i] == 'U' ||
		in1[i] == 'O' || in1[i] == 'Y' || in1[i] == 'E' ||
		in1[i] == 'I') {
		  temp += "$$" ;
		  }else {
		  temp += in1[i];
		  temp += in1[i];
		}
	}

	out1 = temp;
}

Внутренняя ошибка компилятора: Unsupported node type.
Матвей Пинчуков

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

Мой профиль
Организация и функционирование ЭВМ (ПО2) - 2024
Контрольные срезы\21 ноября\Программирование\Цифры числа\14 - "Приличная задача" (809)
http://dl.gsu.by/task.jsp?nid=2409999&cid=1371

не прошел секретный тест
Михаил Долинский

Темы: 2072
Сообщений: 49883

Мой профиль
Report = report.txt
StopOnError = false
Statistics = false
WatchReport = false
ShowReport = false

[1]
Cycles = 1000
CheckCycles = true
Segment - 0
Offset - 0


n1 dec: 218

R dec: 107

[2]
Cycles = 1000
CheckCycles = true
Segment - 0
Offset - 0


n1 dec: 100

R dec: 100

[3]
Cycles = 1000
CheckCycles = true
Segment - 0
Offset - 0


n1 dec: 1

R dec: 0

[4]
Cycles = 1000
CheckCycles = true
Segment - 0
Offset - 0


n1 dec: 132

R dec: 21

[5]
Cycles = 1000
CheckCycles = true
Segment - 0
Offset - 0


n1 dec: 55

R dec: 0
Денис Сероженко

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

Мой профиль
https://dl.gsu.by/task.jsp?nid=2428545&cid=1370

int __in __bits(2) IN_0;
int __in __bits(2) IN_1;
int __out __bits(5) OUT_0;

void main()
{
	int i,g = 1;
	for (i = 0; i < IN_1; i++){
		g = g*IN_0;
	}
	OUT_0 = g;
}


На тесте 0 0 пишет, что мой ответ = 0, а в программе он равен 1.
Денис Сероженко

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

Мой профиль
https://dl.gsu.by/task.jsp?nid=2428545&cid=1370

int __in __bits(2) IN_0;
int __in __bits(2) IN_1;
int __out __bits(5) OUT_0;

void main()
{
	if (IN_0 == 0){
		if(IN_1 == 0) OUT_0 = 1;
		else OUT_0 = 0;
	}
	if (IN_0 == 1) OUT_0 = 1;
	if (IN_0 == 2){
	if (IN_1 == 0) OUT_0 = 1;
	else if (IN_1 == 1) OUT_0 = 2;
	else if (IN_1 == 2) OUT_0 = 4;
	else if (IN_1 == 3) OUT_0 = 8;
	}
   	if (IN_0 == 3){
	if (IN_1 == 0) OUT_0 = 1;
	else if (IN_1 == 1) OUT_0 = 3;
	else if (IN_1 == 2) OUT_0 = 9;
	else if (IN_1 == 3) OUT_0 = 27;
	}
}


На тесте 0 0 выдает ответ 0, а в программе ответ = 1.
Денис Сероженко

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

Мой профиль
https://dl.gsu.by/task.jsp?nid=2428545&cid=1370

unsigned __in __bits(2) IN_0;
unsigned __in __bits(2) IN_1;
unsigned __out __bits(5) OUT_0;

void main()
{
	if (IN_0 == 0){
		if(IN_1 == 0) OUT_0 = 1;
		else OUT_0 = 0;
	}
	if (IN_0 == 1) OUT_0 = 1;
	if (IN_0 == 2){
	if (IN_1 == 0) OUT_0 = 1;
	else if (IN_1 == 1) OUT_0 = 2;
	else if (IN_1 == 2) OUT_0 = 4;
	else if (IN_1 == 3) OUT_0 = 8;
	}
   	if (IN_0 == 3){
	if (IN_1 == 0) OUT_0 = 1;
	else if (IN_1 == 1) OUT_0 = 3;
	else if (IN_1 == 2) OUT_0 = 9;
	else if (IN_1 == 3) OUT_0 = 27;
	}
}


В тесте 00 выдает ответ 0, а в программе ответ = 1.
Денис Сероженко

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

Мой профиль
https://dl.gsu.by/task.jsp?nid=2428545&cid=1370

unsigned __in __bits(2) IN_0;
unsigned __in __bits(2) IN_1;
unsigned __out __bits(5) OUT_0;

void main()
{
	int i,g = 1;
	for (i = 0; i < IN_1; i++){
		g = g*IN_0;
	}
	OUT_0 = g;
}


На тесте 0 0 пишет, что мой ответ = 0, а в программе он равен 1.
Екатерина Киптик

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

Мой профиль
https://dl.gsu.by/task.jsp?nid=2416138&cid=1371

unsigned __in __bits(1) m1;
unsigned __in __bits(1)  m2;
unsigned __in __bits(1) start;
unsigned __in __bits(1) C;
unsigned __out __bits(4) R;

unsigned cnt;
unsigned last_C;

void main() {
    unsigned __bits(1) m1i = m1;
    unsigned __bits(1) m2i = m2;
    unsigned __bits(1) sti = start;
    unsigned __bits(1) Ci = C;

    if (sti == 1) {
        cnt = 0;
    } else if (Ci == 1 && last_C == 0) {
        if (m1i == 1 && m2i == 1) {
            cnt++;
        } else if (m1i == 0 && m2i == 0) {
            cnt--;
        }
    }

  last_C=Ci;

  R = cnt;
}


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

cnt: глобальная переменная, которая используется для хранения текущего значения счетчика. Она сохраняет свое значение между вызовами функции main().

last_C: переменная, которая также сохраняет свое состояние между вызовами функции main(). Она необходима для отслеживания предыдущего значения сигнала C и обнаружения переднего фронта (логика обновления счетчика осуществляется только при переходе C из 0 в 1).

Так же не стоит забывать, что в начале функции main() входные значения (m1, m2, start, C) необходимо сохранять в промежуточные переменные (m1i, m2i, sti, Ci). Это позволяет избежать гонок сигналов, так как входные значения могут измениться в процессе вычисления.
Игорь Коршунов

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

Мой профиль


Денис Сероженко:

https://dl.gsu.by/task.jsp?nid=2428545&cid=1370

unsigned __in __bits(2) IN_0;
unsigned __in __bits(2) IN_1;
unsigned __out __bits(5) OUT_0;

void main()
{
	int i,g = 1;
	for (i = 0; i < IN_1; i++){
		g = g*IN_0;
	}
	OUT_0 = g;
}


На тесте 0 0 пишет, что мой ответ = 0, а в программе он равен 1. 

Этот вариант программы правильный.

Но присланный на тестирование проект сгенерирован был по другой программе:

unsigned __in __bits(3) in_0;
unsigned __in __bits(3) in_1;
unsigned __in __bits(3) in_2;
unsigned __in __bits(3) in_3;

unsigned __out __bits(1) out_0;
unsigned __out __bits(1) out_1;
unsigned __out __bits(1) out_2;

void main()
{
    int sum1;
    if (!in_0 || !in_1) sum1 = 0;
    else sum1 = in_0 + in_1;
 
    int sum2;
    if (!in_2 || !in_3) sum2 = 0;
    else sum2 = in_2 + in_3;

    if (sum1 > sum2)
    {
        out_0 = 1;
        out_1 = 0;
        out_2 = 0;
    }
    else if (sum1 < sum2)
    {
        out_0 = 0;
        out_1 = 1;
        out_2 = 0;
    }
    else
    {
        out_0 = 0;
        out_1 = 0;
        out_2 = 1;
    }
}

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

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

Мой профиль
Чтобы увидеть исходник по которому генерировалась схема нужно нажать правую кнопку мыши над корпусом МПА и выбрать "Список параметров -> Source".
Иван Морозов

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

Мой профиль
https://dl.gsu.by/task.jsp?nid=2411200&cid=1371

unsigned __in __bits(2) IN_0;
unsigned __in __bits(2) IN_1;
unsigned __out __bits(5) OUT_0=1;

void main(){
	unsigned i;
	for(i=0;i<IN_1;i++){
		OUT_0*=IN_0;
	}
}


Ошибка: Несовпадение OUT_0:00100=01000 [9 ns]

В Winter же результат равен 8, что является правильным ответом
 
Индекс форума ->Учебный процесс ГГУ/СШ 27 ->Проектирование цифровых систем 1, 2, 3, ... 24, 25, 26, 27, 28
Time:0,066