Мур 1 26 июля, 2017 Опубликовано 26 июля, 2017 · Жалоба Столкнулся с проблемой, когда потребовалось изменить ТЗ и беззнаковой математики (к которой привык) оказалось не достаточно. Суть в том, что нужен переход в знаковую математику(когда из входного сигнала вычитаю средний уровень). Заявил в начале library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; use ieee.numeric_std.all; В интернете посмотрел,- применяют тип signed(15 downto 0) вместо std_logic_vector(15 downto 0). Да не тут-то было!... анализатор кричит, что не понимает этот самый signed - сигнал... Народ! Ткните носом, какой инструментарий взять, примеры посмотреть..... ,чтобы потом полученный знаковый код еще и откалибровать... :tort: Дома сооружу пробный бенч для прогона вариантов, чтобы закрепить в голове новые знания.... Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tausinov 0 26 июля, 2017 Опубликовано 26 июля, 2017 (изменено) · Жалоба Столкнулся с проблемой, когда потребовалось изменить ТЗ и беззнаковой математики (к которой привык) оказалось не достаточно. Суть в том, что нужен переход в знаковую математику(когда из входного сигнала вычитаю средний уровень). Заявил в начале library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; use ieee.numeric_std.all; В интернете посмотрел,- применяют тип signed(15 downto 0) вместо std_logic_vector(15 downto 0). Да не тут-то было!... анализатор кричит, что не понимает этот самый signed - сигнал... Народ! Ткните носом, какой инструментарий взять, примеры посмотреть..... ,чтобы потом полученный знаковый код еще и откалибровать... :tort: Дома сооружу пробный бенч для прогона вариантов, чтобы закрепить в голове новые знания.... Спасибо! use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; use ieee.numeric_std.all; Не стоит смешивать первое со вторым. "Стоковой" считается именно numeric_std, но она в некотором смысле более избыточная по обвязке этой самой знаковой и беззнаковой арифметики. Так что выбирайте сами, но что-то одно. Скорее всего от сюда и ошибка, т.к. данный тип фигурирует и там и там. Ну и пусть меня поправят, если что, но для сложения и вычитания нет разницы между знаковыми и незнаковыми операндами с точки зрения результата. Разница лишь в трактовке этого самого результата и отлавливании переполнений. Изменено 26 июля, 2017 пользователем Tausinov Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 26 июля, 2017 Опубликовано 26 июля, 2017 · Жалоба Еще разница в том как расширять число. когда из Н битного надо сделать Н+М битное. Для беззнаковых добивают нулями, для знаковых Н-1 битом. Ну и конечно сложение Н битных беззнаковых дает Н+1 битный результат. А сложение Н битных знаковых дает Н битный результат. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tausinov 0 26 июля, 2017 Опубликовано 26 июля, 2017 · Жалоба Еще разница в том как расширять число. когда из Н битного надо сделать Н+М битное. Для беззнаковых добивают нулями, для знаковых Н-1 битом. Ну и конечно сложение Н битных беззнаковых дает Н+1 битный результат. А сложение Н битных знаковых дает Н битный результат. Да, про расширение совсем забыл, но это уже на уровне автоматизма должно быть) А вот на счет второго не совсем понял. Возьмем, скажем 8-битные числа. Для беззнаковых в пределе получаем 255 + 255 = 510 - 9 бит. Для знаковых в пределе получаем 127 + 127 = 254 - те же самые 9 бит - 8 на модуль и 1 на знак. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 26 июля, 2017 Опубликовано 26 июля, 2017 · Жалоба Возьмем, скажем 8-битные числа. Железо про числа ничего не знает. Оно работает с кодами, которые в соответствии с задчей можно представить как числа со знаком или без знака. Если Вы сами заботитесь о расширении разрядной сетки должным образом, то полученный код будет соответствовать Вашим представлением. Можно конечно воспользоваться указаниями синтезатору. Но нужно четко при этом понимать, что должно получиться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tausinov 0 26 июля, 2017 Опубликовано 26 июля, 2017 · Жалоба Железо про числа ничего не знает. Оно работает с кодами, которые в соответствии с задчей можно представить как числа со знаком или без знака. Если Вы сами заботитесь о расширении разрядной сетки должным образом, то полученный код будет соответствовать Вашим представлением. Можно конечно воспользоваться указаниями синтезатору. Но нужно четко при этом понимать, что должно получиться. Все так, я просто хотел на конкретном примере показать, что не совсем понял, о чем речь. В данном случае, если 9-го бита в железе нет, то переполнение наступит в обоих случаях. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 26 июля, 2017 Опубликовано 26 июля, 2017 · Жалоба Все так, я просто хотел на конкретном примере показать, что не совсем понял, о чем речь. В данном случае, если 9-го бита в железе нет, то переполнение наступит в обоих случаях. Если нет расширения разрядной сетки. Возьмем базовый примитив сумматора. Как известно у него разрядность суммы такая же как и разрядность слагаемых. Но у него при этом есть возможность активизировать выход или переноса, или переполнения. В зависимости от того как Вы воспринимаете входные коды. А если нет расширения разрядной сетки, значит Вы не получите правильный результат во всем диапазоне входных кодов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 26 июля, 2017 Опубликовано 26 июля, 2017 · Жалоба сложите 1 и -1 в тех же 8 битах, знаково 0000_0001 + 1111_1111 -> 1_0000_0000 переполняемый, девятый бит отбрасывается и получается верный результат 0. То есть бит переполнения при знаковой арифметике всегда есть, и его всегда надо отбросить, чтобы правильно обработать сложение с отрицательными числами. Этот бит не несет достоверной информации и его сохранения искажает результат. Знаковая арифметика при сложении 8 битных чисел не предполагает получение 9 битного числа. 9 битное число можно получить только после принудительного и правильного расширения изначальных 8 битных чисел до 9 битных. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tausinov 0 26 июля, 2017 Опубликовано 26 июля, 2017 (изменено) · Жалоба Знаковая арифметика при сложении 8 битных чисел не предполагает получение 9 битного числа. 9 битное число можно получить только после принудительного и правильного расширения изначальных 8 битных чисел до 9 битных. Понял, что вы имели в виду. Но, имхо, это не совсем так. При знаковом сложении положительных чисел этот бит как раз адекватно показывает переполнение. На счет остальных случаев точно уже не помню, но, вроде, как-то тоже его можно использовать для определения того же самого переполнения. Это я и имел в виду под Разница лишь в трактовке этого самого результата и отлавливании переполнений. P.S. Пока домой ехал понял, что бред написал. Все, что написано выше верно для знакового разряда, а не для "нового". Изменено 26 июля, 2017 пользователем Tausinov Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 26 июля, 2017 Опубликовано 26 июля, 2017 · Жалоба Столкнулся с проблемой... И я столкнулся - антивирус Avast ругается на ваш аватар, похоже! :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 26 июля, 2017 Опубликовано 26 июля, 2017 · Жалоба Это я и имел в виду под А зачем вам ловить переполнения. Расширяйте разрядную сетку. module sum_signed_unsigned ( input add, input [3:0] a, b, // unsigned input [3:0] aa, bb, // signed output [4:0] s, // unsigned output [4:0] ss // signed ); assign s = add ? {1'b0, a} + {1'b0, b} : {1'b0, a} - {1'b0, b}; assign ss = add ? {aa[3], aa} + {bb[3], bb} : {aa[3], aa} - {bb[3], bb}; endmodule Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Мур 1 26 июля, 2017 Опубликовано 26 июля, 2017 · Жалоба И я столкнулся - антивирус Avast ругается на ваш аватар, похоже! :laughing: Столько лет висела... что же это за хрень? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GriXa 0 26 июля, 2017 Опубликовано 26 июля, 2017 · Жалоба По поводу библиотек, как уже написал Tausinov, нельзя совместно использовать ieee.numeric_std и std_logic_arith. Как пишут здесь, "The alternative numeric package ieee.std_logic_arith should not be used for new designs" Ну и тут подробнее: http://insights.sigasi.com/tech/deprecated...-libraries.html. Для преобразовываете std_logic_vector в signed или unsigned и наоборот, удобно пользоваться шпаргалкой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tausinov 0 26 июля, 2017 Опубликовано 26 июля, 2017 · Жалоба шпаргалкой. О, знакомая картинка. Но через какое-то время уже даже не задумываешься - на мой взгляд, все довольно логично и запоминать почти ничего не нужно. В отличии от магии в arith, где результат +/- для signed/unsigned можно присваивать std_logic_vector'у напрямую. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 27 июля, 2017 Опубликовано 27 июля, 2017 (изменено) · Жалоба О, знакомая картинка. Но через какое-то время уже даже не задумываешься - на мой взгляд, все довольно логично и запоминать почти ничего не нужно. В отличии от магии в arith, где результат +/- для signed/unsigned можно присваивать std_logic_vector'у напрямую. А мне вот эта вот нравится. Распечатал и приклеил на видное место. https://www.doulos.com/knowhow/vhdl_designe...de/numeric_std/ Изменено 27 июля, 2017 пользователем Flip-fl0p Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться