LINUX.ORG.RU
решено ФорумTalks

Сумматор на логике

 , ,


0

1

Чтобы разгрузить мозг в перерывах между написанием диплома пишу реализацию всех действий на mov и nor. Пока всё шло нормально, пока я не уперся в загвоздку в сложении. Однобитный сумматор трудностей не представил. A, B на входе, Q (результат) и R (флаг переноса) на выходе:

[1, 1] -> [0, 1].
Проблемы начались, когда я попытался объединить его в 32х битный сумматор. Если использовать последовательную схему, то нам нужно, чтобы флаг переноса был на один разряд старше:
[10, 10] -> [00, 100].
И тут начались проблемы. Мне нужен <<. СПВ, можно ли на голой логике (not, and, or, xor, nor, nand) и присваивании (mov) сделать перенос влево?. Я бы мог сделать через умножение/деление, но для умножения нужно сложение. Here we go again.

Линукс тут притом, что если дойдут руки - сделаю интерпретатор на православной сишечке под линукс.

★★★

Последнее исправление: AlexCones (всего исправлений: 2)

можно ли на голой логике (not, and, or, xor, nor, nand) и присваивании (mov) сделать перенос влево?

Пусть имеется три входа {0,1,2} и три выхода {0,1,2}.

Присвоим выходу 0 значение входа 1. Присвоим выходу 1 значение входа 2. Присвоим выходу 2 значение 0.

Sadler ★★★
()
Последнее исправление: Sadler (всего исправлений: 1)
Ответ на: комментарий от quickquest

Там тоже нужны переносы при реализации не на железе, а программно.

Вот схема последовательного, которая у меня намечается.

# A + B

Over = 0;
TempRes = 0;

T1 = A;
T2 = B;
T1 &= 0x00000001;
T2 &= 0x00000001;
TempRes |= SUM1Bit(T1, T2 /* in */, Over /* out */);

T1 = A;
T2 = B;
T1 &= 0x00000002;
T2 &= 0x00000002;
TempRes |= SUM1Bit(T1, T2 /* in */, Over /* out */);

T1 = A;
T2 = B;
T1 &= 0x00000004;
T2 &= 0x00000004;
TempRes |= SUM1Bit(T1, T2 /* in */, Over /* out */);

// ...

T1 = A;
T2 = B;
T1 &= 0x80000000;
T2 &= 0x80000000;
TempRes |= SUM1Bit(T1, T2 /* in */, Over /* out */);

return TempRes;
Вот в таком виде надо, чтобы SUM1bit возвращал Over на один разряд левее.

AlexCones ★★★
() автор топика
Последнее исправление: AlexCones (всего исправлений: 2)
Ответ на: комментарий от AlexCones

Не канает, если у нас простое присваивание без битовых операций

(X or 0) в наличии? Значит, A[3] = A[4] проканает. Или я не совсем врубился в суть схемы.

Sadler ★★★
()
Последнее исправление: Sadler (всего исправлений: 1)
Ответ на: комментарий от Sadler

Эм... Как-то не въехал. OR, NOT, AND, XOR, NAND реализованы из начальных NOR и MOV. Как вы предлагаете перенести разряд, если все битовые операции работают только со своим битом? Вот как здесь: Сумматор на логике (комментарий) описать сможете?

AlexCones ★★★
() автор топика
Ответ на: комментарий от AlexCones

Как вы предлагаете перенести разряд, если все битовые операции работают только со своим битом?

А как же SUM1Bit(T1, T2... в коде выше ? Очевидно, это нечто должно работать не с одним битом, а с двумя входными битами. И уметь выдавать результат в другой произвольный бит. Этого достаточно, чтобы перекинуть данные из одного бита в другой.

A => B: B = SUM1Bit(A,0)

Sadler ★★★
()
Последнее исправление: Sadler (всего исправлений: 1)
Ответ на: комментарий от Sadler

Очевидно, это нечто должно работать не с одним битом, а с двумя входными битами.

показываю, как оно должно работать по задумке:

# Пишу 8 разрядов, включите воображение, их там 32

A: 0b00000010
B: 0b00000010
Q: 0b00000000
R: 0b00000100 // в другой разряд

A: 0b00100000
B: 0b00000000
Q: 0b00100000
R: 0b00000000

Как оно работает сейчас:

# Пишу 8 разрядов, включите воображение, их там 32

A: 0b00000010
B: 0b00000010
Q: 0b00000000
R: 0b00000010 // Тот же разряд :(

A: 0b00100000
B: 0b00000000
Q: 0b00100000
R: 0b00000000

AlexCones ★★★
() автор топика
Ответ на: комментарий от AlexCones

Да я понял. Я предлагаю забыть на время о мультибитном сумматоре и решить проблему битового сдвига. Если

Однобитный сумматор трудностей не представил

То, очевидно, моя схема в предыдущем посте позволит реализовать сдвиг. Если нет, то я тут уже ничем не помогу — отсутствие по условию задачи возможности копирования значения одного бита в другой кажется мне достаточно странным. Чисто физически непонятно, почему я не могу соединить проводниками пары входов и выходов, чтобы получить элементарный сдвиг.

Sadler ★★★
()
Ответ на: комментарий от Sadler

Если нет, то я тут уже ничем не помогу

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

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

Просто мне хотелось сделать тьюринг полноту как можно меньшим количеством исходных параметров. Раньше было два - mov и nor, теперь придется, наверное, делать три: mov, nor и shl.

AlexCones ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.