МАСТЕР LO 0 23 марта, 2022 Опубликовано 23 марта, 2022 (изменено) · Жалоба Уважаемые форумчане. Не так давно столкнулся с такой проблемой, нужно складывать два числа. Как работать с отрицательными числами понятно, получаем дополнительный код и вперёд. И всё как бы просто. Однако, возникает некоторая тонкость, до тех пор пока нет переполнения, нет проблем, однако в случае переполнения начинает возникать чехарда и полная неразбериха, ну если это делать на "простой" логике и побитовых сумматорах с переносом. Вопрос. Как контролировать переполнения при работе с отрицательными числами? Для примера, если на 13 битной шине (12 бит данных +знак) складывать (-4000) + (-4000) получается переполнение и если 4000 + 4000 тоже получается переполнение, однако с положительными числами всё понятно, а вот с отрицательными числами результат переполнения не так очевиден, потому что переполнение начинает "лезть" в знак. Вот такой вот у меня вопрос, девчонки и парни. Изменено 23 марта, 2022 пользователем МАСТЕР LO Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 23 марта, 2022 Опубликовано 23 марта, 2022 · Жалоба Используется знаковое расширение слагаемых. 12 разрядов расширяем до 13. 5 минут назад, МАСТЕР LO сказал: девчёнки В суффиксах после шипящих под ударением пишется о, без ударения е. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 23 марта, 2022 Опубликовано 23 марта, 2022 · Жалоба 9 minutes ago, МАСТЕР LO said: Как контролировать переполнения при работе с отрицательными числами? классика, знаковое расширение + 1 бит, сложение, анализ двух старших бит(если 01 - положительное переполнение, 10 отрицательное), усечение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
МАСТЕР LO 0 23 марта, 2022 Опубликовано 23 марта, 2022 · Жалоба 8 минут назад, andrew_b сказал: Используется знаковое расширение слагаемых. 12 разрядов расширяем до 13. В суффиксах после шипящих под ударением пишется о, без ударения е. опечатка, принято 2 минуты назад, des00 сказал: классика, знаковое расширение + 1 бит, сложение, анализ двух старших бит(если 01 - положительное переполнение, 10 отрицательное), усечение. Спасибо, а под знак необходимо теперь тоже два бита? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 23 марта, 2022 Опубликовано 23 марта, 2022 · Жалоба 4 minutes ago, МАСТЕР LO said: Спасибо, а под знак необходимо теперь тоже два бита? Почему, также один знак. Число то вышло за пределы входной разрядной сетки. По выходу либо увеличиваете разрядность на 1 бит, либо добавляйте логику ограничения максимального диапазона чисел на входной разрядности Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
МАСТЕР LO 0 23 марта, 2022 Опубликовано 23 марта, 2022 · Жалоба 1 час назад, des00 сказал: Почему, также один знак. Число то вышло за пределы входной разрядной сетки. По выходу либо увеличиваете разрядность на 1 бит, либо добавляйте логику ограничения максимального диапазона чисел на входной разрядности Тогда получается для сложения 12 разрядов чисел необходимо, собственно 12 разрядов, то 13й разряд это переполнение 12 разрядных вычислений, 14й разряд - это сам знак. 15й разряд признак того, что число в дополнительном коде. Только при такой конфигурации переполнение не "лезет в знаковый разряд". Правильно я понял? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 23 марта, 2022 Опубликовано 23 марта, 2022 · Жалоба 20 minutes ago, МАСТЕР LO said: Тогда получается.... складывается ощущение что вам надо учебник по компьютерной математике в дополнительном коде изучить. берем ваш пример знаковое число 13 бит, дополнительный код s12, диапазон чисел -4096...4095, в hex формате это 13'h1000 и 13'h01111 соответственно. считаем -4096(13'h1000) - 4096(13'h1000). Для этого знаково расширяем число до 14 бит. 14'h3000 (-4096) + 14'h3000(-4096) = 14'h2000 (-8192) старшие биты 14ый и 13ый == 2'h2 == 2'b10 - есть отрицательное переполнение: 1. если решаем что теперь работаем в 14 бит сетке, то не делаем ничего, результат 14'h2000 (-8192) 2. если сетка должна остаться 13 бит, то нужно сделать ограничение и результат 13'h1000 (-4096) тетрадь, карандаш и потренируйтесь на кошках. для начала рекомендую взять 4-х битные числа -8..+7. так быстрее. потом распишите как будет выглядеть -4096(13'h1000) - 1 (13'h1FFFF) в 13 битной сетке. ну и положительные числа посмотреть. ЗЫ. Если вы работает прямом или обратном коде, тогда переведите его в дополнительный и считайте. Но так вроде уже давно никто не работет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
МАСТЕР LO 0 23 марта, 2022 Опубликовано 23 марта, 2022 · Жалоба 1 минуту назад, des00 сказал: складывается ощущение что вам надо учебник по компьютерной математике в дополнительном коде изучить. берем ваш пример знаковое число 13 бит, дополнительный код s12, диапазон чисел -4096...4095, в hex формате это 13'h1000 и 13'h01111 соответственно. считаем -4096(13'h1000) - 4096(13'h1000). Для этого знаково расширяем число до 14 бит. 14'h3000 (-4096) + 14'h3000(-4096) = 14'h2000 (-8192) старшие биты 10 - есть отрицательное переполнение: 1. если решаем что теперь работаем в 14 бит сетке, то не делаем ничего, результат 14'h2000 (-8192) 2. если сетка должна остаться 13 бит, то нужно сделать ограничение и результат 13'h1000 (-4096) тетрадь, карандаш и потренируйтесь на кошках. для начала рекомендую взять 4-х битные числа -8..+7. так быстрее. потом распишите как будет выглядеть -4096(13'h1000) - 1 (13'h1FFFF) в 13 битной сетке. ну и положительные числа посмотреть. ЗЫ. Если вы работает прямом или обратном коде, тогда переведите его в дополнительный и считайте. Но так вроде уже давно никто не работет. да, книжка по компьютерной математике мне бы не помешала, если порекомендуете такую буду благодарен, а то я весь запутался с этими знаками и переполнениями 5 минут назад, des00 сказал: 1. если решаем что теперь работаем в 14 бит сетке, то не делаем ничего, результат 14'h2000 (-8192) 2. если сетка должна остаться 13 бит, то нужно сделать ограничение и результат 13'h1000 (-4096) в целом всё понятно, поэтому конечно спасибо за подробное объяснение, всё логично Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 23 марта, 2022 Опубликовано 23 марта, 2022 · Жалоба 4 minutes ago, МАСТЕР LO said: да, книжка по компьютерной математике мне бы не помешала, если порекомендуете такую буду благодарен, а то я весь запутался с этими знаками и переполнениями Ну например Цифровая схемотехника и архитектура компьютера второе издание Дэвид М. Харрис и Сара Л. Харрис. раздел "СИСТЕМЫ СЧИСЛЕНИЯ" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
МАСТЕР LO 0 23 марта, 2022 Опубликовано 23 марта, 2022 · Жалоба 16 минут назад, des00 сказал: Ну например Цифровая схемотехника и архитектура... спасибо, уже скачиваю.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
МАСТЕР LO 0 23 марта, 2022 Опубликовано 23 марта, 2022 · Жалоба 28 минут назад, МАСТЕР LO сказал: Ну например Цифровая схемотехника и архитектура... ещё раз спасибо, вообще всё отлично написано, а то я весь гугл перерыл, а толку не было Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
МАСТЕР LO 0 24 марта, 2022 Опубликовано 24 марта, 2022 (изменено) · Жалоба 21 час назад, МАСТЕР LO сказал: Ну например Цифровая схемотехника и архитектура... Книжка в целом хорошая и замечательная, но там не написано ничего, чего бы я не изучал в институте... Ответа на главный вопрос, как складывать два отрицательных числа там увы нет. И чёткой логики, когда отбрасываем старший, он же знаковый, он же разряд переполнения там нет. И получается в итоге, что единого алгоритма сложения двух знаковых чисел нет. Точнее, получается нужно делать несколько сумматоров, для положительных чисел, для положительных и отрицательных, а для сложения собственно отрицательных чисел, те чисел представленных в дополнительных кодах ещё один. И в каждом сумматоре необходимо учитывать, когда перенос работает, а когда перенос не работает. И в дополнение к этому ещё лепить блоки определения положительное число или отрицательное, естественно с конвертацией в дополнительный код и запуском соответствующей ветки... Ну не ужели нету другого какого-то алгоритма попроще. Или я смотрел в книгу и видел фигу? Ну очень хочется попроще..... Изменено 24 марта, 2022 пользователем МАСТЕР LO Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
novikovfb 17 24 марта, 2022 Опубликовано 24 марта, 2022 · Жалоба 14 minutes ago, МАСТЕР LO said: Точнее, получается нужно делать несколько сумматоров, для положительных чисел, для положительных и отрицательных, а для сложения собственно отрицательных чисел, те чисел представленных в дополнительных кодах ещё один. И в каждом сумматоре необходимо учитывать, когда перенос работает, а когда перенос не работает. Странно. Вроде всегда был один и тот же алгоритм для сложения чисел, независимо от их знака. Хватало бы разрядности в сумматоре. Как вариант - сначала расширить разрядность операндов до требуемой (копированием знакового разряда во все более старшие разряды), а потом складывать их. Вам уже советовали взять бумагу в клеточку и расписать сложение двоичных чисел столбиком, станет всё понятно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 24 марта, 2022 Опубликовано 24 марта, 2022 · Жалоба 20 minutes ago, МАСТЕР LO said: Ответа на главный вопрос, как складывать два отрицательных числа там увы нет. Эммм, Quote Неоспоримым преимуществом дополнительного кода является то, что привычный способ сложения работает как в случае положительных, так и отрицательных чисел. (с) Глава 1 книги Вы в тетради примеры делали? по битно, в столбик? я же не зря вам предложил взять 4-х битные числа -8..+7 и перебрать все возможные комбинации сложения с учетом знакового расширения. Ну или хотя бы взяли стандартный калькулятор виндовз в режиме "программист" и посмотрели битики? сложение/вычитание любых чисел в дополнительном коде с ростом разрядности результата для борьбы с переполнениями: на каждое сложение/вычитание разрядность результата растет на 1 бит. bit [7 : 0] a, b; bit [8 : 0] sum; bit [8 : 0] rslt; always_comb begin sum = {a[7], a} + {b[7], b}; // {a[7], a} - {b[7], b}; rslt = sum; end сложение/вычитание любых чисел в дополнительном коде без роста разрядности с обработкой переполнений: на каждое сложение/вычитание разрядность результата сохраняется bit [7 : 0] a, b, rslt; bit [8 : 0] sum; always_comb begin sum = {a[7], a} + {b[7], b}; // {a[7], a} - {b[7], b}; if (sum[8] ^ sum[7]) begin rslt = sum[8] ? 8'h80 : 8'h7F; end else begin rslt = sum[7 : 0]; end end Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
МАСТЕР LO 0 24 марта, 2022 Опубликовано 24 марта, 2022 (изменено) · Жалоба 22 часа назад, МАСТЕР LO сказал: Ну например Цифровая схемотехника и архитектура... Тогда вот такой пример: берём 5 + 5 = 10, знаковый разряд 0 числовые разряды 101, получаем 0101 + 0101 = 1010, в знаковом разряде переполнение, результат ошибка, его пропускать нельзя. Другой пример, -7 + 2 = 5, считаем снова : 7 в знаковом разряде 1 числовые разряды 001, 1001 + 0101 = 1110, здесь в знаковом разряде присутствует 1, которая является знаком минус.... вот и получается, что в одном случае у нас переполнение, в другом отрицательное число и получается, что ветки расчёта необходимо на начальном этапе разделять... за примеры спасибо, хочу сказать, что мне необходимо реализовать это действие не на аппаратном сумматоре в плис, а булевой "на рассыпухе", в виде побитового сложения с переносом. module module_summ_1_bit // модуль сумматора 2х двоичных чисел / вычисление суммы нулевых (1) разрядов / вычисление переноса суммы нулевых (1) разрядов ( input a, // вход разряда a input b, // вход разряда b input p_in, // вход переноса предыдущего разряда p_in output c, // выход разряда с output p_out // выход переноса предыдущего разряда output p_out ); wire k, l, m, n, o, p, r; // вот так // вычисление суммы разрядов assign k = ~ a & ~ b & p_in; assign l = b & ~ a & ~ p_in; assign m = ~ b & a & ~ p_in; assign n = b & a & p_in; assign c = k | l | m | n; // вычисление переноса суммы разрядов assign o = a & b; assign p = a & p_in; assign r = b & p_in; assign p_out = o | p | r; endmodule Изменено 24 марта, 2022 пользователем МАСТЕР LO Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться