Перейти к содержанию
    

Когда появляется знак, я использую бибиотеки...

Столкнулся с проблемой, когда потребовалось изменить ТЗ и беззнаковой математики (к которой привык) оказалось не достаточно.

 

Суть в том, что нужен переход в знаковую математику(когда из входного сигнала вычитаю средний уровень).

Заявил в начале

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:

 

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

 

Спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Столкнулся с проблемой, когда потребовалось изменить ТЗ и беззнаковой математики (к которой привык) оказалось не достаточно.

 

Суть в том, что нужен переход в знаковую математику(когда из входного сигнала вычитаю средний уровень).

Заявил в начале

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, но она в некотором смысле более избыточная по обвязке этой самой знаковой и беззнаковой арифметики. Так что выбирайте сами, но что-то одно.

Скорее всего от сюда и ошибка, т.к. данный тип фигурирует и там и там. Ну и пусть меня поправят, если что, но для сложения и вычитания нет разницы между знаковыми и незнаковыми операндами с точки зрения результата. Разница лишь в трактовке этого самого результата и отлавливании переполнений.

Изменено пользователем Tausinov

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Еще разница в том как расширять число.

когда из Н битного надо сделать Н+М битное. Для беззнаковых добивают нулями, для знаковых Н-1 битом.

Ну и конечно сложение Н битных беззнаковых дает Н+1 битный результат. А сложение Н битных знаковых дает Н битный результат.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Еще разница в том как расширять число.

когда из Н битного надо сделать Н+М битное. Для беззнаковых добивают нулями, для знаковых Н-1 битом.

Ну и конечно сложение Н битных беззнаковых дает Н+1 битный результат. А сложение Н битных знаковых дает Н битный результат.

 

Да, про расширение совсем забыл, но это уже на уровне автоматизма должно быть)

А вот на счет второго не совсем понял. Возьмем, скажем 8-битные числа. Для беззнаковых в пределе получаем 255 + 255 = 510 - 9 бит. Для знаковых в пределе получаем 127 + 127 = 254 - те же самые 9 бит - 8 на модуль и 1 на знак.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возьмем, скажем 8-битные числа.

 

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

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

Можно конечно воспользоваться указаниями синтезатору. Но нужно четко при этом понимать, что должно получиться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Можно конечно воспользоваться указаниями синтезатору. Но нужно четко при этом понимать, что должно получиться.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Если нет расширения разрядной сетки.

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

Но у него при этом есть возможность активизировать выход или переноса, или переполнения. В зависимости от того как Вы воспринимаете входные коды.

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

сложите 1 и -1 в тех же 8 битах, знаково

0000_0001 + 1111_1111 -> 1_0000_0000 переполняемый, девятый бит отбрасывается и получается верный результат 0. То есть бит переполнения при знаковой арифметике всегда есть, и его всегда надо отбросить, чтобы правильно обработать сложение с отрицательными числами. Этот бит не несет достоверной информации и его сохранения искажает результат. Знаковая арифметика при сложении 8 битных чисел не предполагает получение 9 битного числа. 9 битное число можно получить только после принудительного и правильного расширения изначальных 8 битных чисел до 9 битных.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Знаковая арифметика при сложении 8 битных чисел не предполагает получение 9 битного числа. 9 битное число можно получить только после принудительного и правильного расширения изначальных 8 битных чисел до 9 битных.

 

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

 

Разница лишь в трактовке этого самого результата и отлавливании переполнений.

 

P.S. Пока домой ехал понял, что бред написал. Все, что написано выше верно для знакового разряда, а не для "нового".

Изменено пользователем Tausinov

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Столкнулся с проблемой...

И я столкнулся - антивирус Avast ругается на ваш аватар, похоже! :laughing:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это я и имел в виду под

 

А зачем вам ловить переполнения. Расширяйте разрядную сетку.

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И я столкнулся - антивирус Avast ругается на ваш аватар, похоже! :laughing:

Столько лет висела... что же это за хрень?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По поводу библиотек, как уже написал 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 и наоборот, удобно пользоваться шпаргалкой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

О, знакомая картинка. Но через какое-то время уже даже не задумываешься - на мой взгляд, все довольно логично и запоминать почти ничего не нужно. В отличии от магии в arith, где результат +/- для signed/unsigned можно присваивать std_logic_vector'у напрямую.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

О, знакомая картинка. Но через какое-то время уже даже не задумываешься - на мой взгляд, все довольно логично и запоминать почти ничего не нужно. В отличии от магии в arith, где результат +/- для signed/unsigned можно присваивать std_logic_vector'у напрямую.

А мне вот эта вот нравится. Распечатал и приклеил на видное место.

https://www.doulos.com/knowhow/vhdl_designe...de/numeric_std/

Изменено пользователем Flip-fl0p

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...