[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
Сообщений: 49900

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

01.unsigned __bits(16) MS(unsigned __bits(3) A,
02.                       unsigned __bits(16) X0,
03.                       unsigned __bits(16) X1,
04.                       unsigned __bits(16) X2
05.                       ...
06.                      )
07.       ...
08.       if (A==0) MS = X0;
09.       if (A==1) MS = X1;
10.       if (A==2) MS = X2;
11.       ...

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

для арифметических схем нужно ещё реализовать
01.x16=CBW(x8)
02.x32=CWD(x16)
03.s16=SUM(A16,B16)
04.s16=ISUB(A16,B16)
05.p32=iMUL(A16,B16)
06.d16=iDIV(A32,B16)
07.x16=x32                 // скорей всего уже правильно работает
08.R16=MS(A1,X16_0,X16_1)
09. 
10.Тогда схема условного арифметического выражения реализуется в С-МПА
11.как последовательность этих операторов
12.в порядке вычислений
13.и с правильными названиями переменных, чтобы передавать сигналы
14.с верхних блоков в нижние (в программе)
15.как с левых на правые (в схеме)


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

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

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

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

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

Мой профиль
Ошибка компилятора
01.unsigned __in __bits(1) A;
02.unsigned __in __bits(1) B;
03.unsigned __in __bits(1) C;
04.unsigned __in __bits(1) D;
05.unsigned __in __bits(1) E;
06.unsigned __in __bits(1) F;
07.unsigned __out __bits(1) Q;
08.unsigned __bits(1) k;
09.void main()
10.{
11.unsigned __bits(1) kA;
12.unsigned __bits(1) kB;
13.unsigned __bits(1) kC;
14.unsigned __bits(1) kD;
15.unsigned __bits(1) kE;
16.unsigned __bits(1) kF;
17.kA = A; kB = B; kC = C; kD = D; kE = E; kF = F;
18.unsigned __bits(3) sum;
19.sum = kA;
20.sum += kB;
21.sum += kC;
22.sum += kD;
23.sum += kE;
24.sum += kF;
25.if((sum % 2) == 0) {
26. k = 0;
27. }
28.else if(sum > 3) {
29. k = kD;
30. }
31.else {
32.Q = k;
33.}
34.}

Иван Гейко

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

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

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

Мой профиль
http://dl.gsu.by/task.jsp?nid=2423960&cid=1370
01.char in1[128];
02.char out1[128];
03.unsigned __out __bits(8) y;
04. 
05.void main() {
06.    char temp[128];
07.    int i = 0;
08. 
09.    while(in1[i] != '#') {
10.      if(in1[i] == 'A' || in1[i] == 'U' ||
11.        in1[i] == 'O' || in1[i] == 'Y' || in1[i] == 'E' ||
12.        in1[i] == 'I') {
13.          temp += "$$" ;
14.          }else {
15.          temp += in1[i];
16.          temp += in1[i];
17.        }
18.    }
19. 
20.    out1 = temp;
21.}

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

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

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

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

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

Мой профиль
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

01.int __in __bits(2) IN_0;
02.int __in __bits(2) IN_1;
03.int __out __bits(5) OUT_0;
04. 
05.void main()
06.{
07.    int i,g = 1;
08.    for (i = 0; i < IN_1; i++){
09.        g = g*IN_0;
10.    }
11.    OUT_0 = g;
12.}


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

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

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

01.int __in __bits(2) IN_0;
02.int __in __bits(2) IN_1;
03.int __out __bits(5) OUT_0;
04. 
05.void main()
06.{
07.    if (IN_0 == 0){
08.        if(IN_1 == 0) OUT_0 = 1;
09.        else OUT_0 = 0;
10.    }
11.    if (IN_0 == 1) OUT_0 = 1;
12.    if (IN_0 == 2){
13.    if (IN_1 == 0) OUT_0 = 1;
14.    else if (IN_1 == 1) OUT_0 = 2;
15.    else if (IN_1 == 2) OUT_0 = 4;
16.    else if (IN_1 == 3) OUT_0 = 8;
17.    }
18.    if (IN_0 == 3){
19.    if (IN_1 == 0) OUT_0 = 1;
20.    else if (IN_1 == 1) OUT_0 = 3;
21.    else if (IN_1 == 2) OUT_0 = 9;
22.    else if (IN_1 == 3) OUT_0 = 27;
23.    }
24.}


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

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

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

01.unsigned __in __bits(2) IN_0;
02.unsigned __in __bits(2) IN_1;
03.unsigned __out __bits(5) OUT_0;
04. 
05.void main()
06.{
07.    if (IN_0 == 0){
08.        if(IN_1 == 0) OUT_0 = 1;
09.        else OUT_0 = 0;
10.    }
11.    if (IN_0 == 1) OUT_0 = 1;
12.    if (IN_0 == 2){
13.    if (IN_1 == 0) OUT_0 = 1;
14.    else if (IN_1 == 1) OUT_0 = 2;
15.    else if (IN_1 == 2) OUT_0 = 4;
16.    else if (IN_1 == 3) OUT_0 = 8;
17.    }
18.    if (IN_0 == 3){
19.    if (IN_1 == 0) OUT_0 = 1;
20.    else if (IN_1 == 1) OUT_0 = 3;
21.    else if (IN_1 == 2) OUT_0 = 9;
22.    else if (IN_1 == 3) OUT_0 = 27;
23.    }
24.}


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

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

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

01.unsigned __in __bits(2) IN_0;
02.unsigned __in __bits(2) IN_1;
03.unsigned __out __bits(5) OUT_0;
04. 
05.void main()
06.{
07.    int i,g = 1;
08.    for (i = 0; i < IN_1; i++){
09.        g = g*IN_0;
10.    }
11.    OUT_0 = g;
12.}


На тесте 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

01.unsigned __in __bits(2) IN_0;
02.unsigned __in __bits(2) IN_1;
03.unsigned __out __bits(5) OUT_0;
04. 
05.void main()
06.{
07.    int i,g = 1;
08.    for (i = 0; i < IN_1; i++){
09.        g = g*IN_0;
10.    }
11.    OUT_0 = g;
12.}


На тесте 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

01.unsigned __in __bits(2) IN_0;
02.unsigned __in __bits(2) IN_1;
03.unsigned __out __bits(5) OUT_0=1;
04. 
05.void main(){
06.    unsigned i;
07.    for(i=0;i<IN_1;i++){
08.        OUT_0*=IN_0;
09.    }
10.}


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

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