Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Когда появляется знак, я использую бибиотеки...
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Языки проектирования на ПЛИС (FPGA)
Мур
Столкнулся с проблемой, когда потребовалось изменить ТЗ и беззнаковой математики (к которой привык) оказалось не достаточно.

Суть в том, что нужен переход в знаковую математику(когда из входного сигнала вычитаю средний уровень).
Заявил в начале
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.gif

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

Спасибо!
Tausinov
Цитата(Мур @ Jul 26 2017, 17:59) *
Столкнулся с проблемой, когда потребовалось изменить ТЗ и беззнаковой математики (к которой привык) оказалось не достаточно.

Суть в том, что нужен переход в знаковую математику(когда из входного сигнала вычитаю средний уровень).
Заявил в начале
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.gif

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

Спасибо!


use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

use ieee.numeric_std.all;

Не стоит смешивать первое со вторым. "Стоковой" считается именно numeric_std, но она в некотором смысле более избыточная по обвязке этой самой знаковой и беззнаковой арифметики. Так что выбирайте сами, но что-то одно.
Скорее всего от сюда и ошибка, т.к. данный тип фигурирует и там и там. Ну и пусть меня поправят, если что, но для сложения и вычитания нет разницы между знаковыми и незнаковыми операндами с точки зрения результата. Разница лишь в трактовке этого самого результата и отлавливании переполнений.
Golikov A.
Еще разница в том как расширять число.
когда из Н битного надо сделать Н+М битное. Для беззнаковых добивают нулями, для знаковых Н-1 битом.
Ну и конечно сложение Н битных беззнаковых дает Н+1 битный результат. А сложение Н битных знаковых дает Н битный результат.
Tausinov
Цитата(Golikov A. @ Jul 26 2017, 18:24) *
Еще разница в том как расширять число.
когда из Н битного надо сделать Н+М битное. Для беззнаковых добивают нулями, для знаковых Н-1 битом.
Ну и конечно сложение Н битных беззнаковых дает Н+1 битный результат. А сложение Н битных знаковых дает Н битный результат.


Да, про расширение совсем забыл, но это уже на уровне автоматизма должно быть)
А вот на счет второго не совсем понял. Возьмем, скажем 8-битные числа. Для беззнаковых в пределе получаем 255 + 255 = 510 - 9 бит. Для знаковых в пределе получаем 127 + 127 = 254 - те же самые 9 бит - 8 на модуль и 1 на знак.
sazh
Цитата(Tausinov @ Jul 26 2017, 18:31) *
Возьмем, скажем 8-битные числа.


Железо про числа ничего не знает. Оно работает с кодами, которые в соответствии с задчей можно представить как числа со знаком или без знака.
Если Вы сами заботитесь о расширении разрядной сетки должным образом, то полученный код будет соответствовать Вашим представлением.
Можно конечно воспользоваться указаниями синтезатору. Но нужно четко при этом понимать, что должно получиться.
Tausinov
Цитата(sazh @ Jul 26 2017, 18:50) *
Железо про числа ничего не знает. Оно работает с кодами, которые в соответствии с задчей можно представить как числа со знаком или без знака.
Если Вы сами заботитесь о расширении разрядной сетки должным образом, то полученный код будет соответствовать Вашим представлением.
Можно конечно воспользоваться указаниями синтезатору. Но нужно четко при этом понимать, что должно получиться.


Все так, я просто хотел на конкретном примере показать, что не совсем понял, о чем речь. В данном случае, если 9-го бита в железе нет, то переполнение наступит в обоих случаях.
sazh
Цитата(Tausinov @ Jul 26 2017, 18:56) *
Все так, я просто хотел на конкретном примере показать, что не совсем понял, о чем речь. В данном случае, если 9-го бита в железе нет, то переполнение наступит в обоих случаях.


Если нет расширения разрядной сетки.
Возьмем базовый примитив сумматора. Как известно у него разрядность суммы такая же как и разрядность слагаемых.
Но у него при этом есть возможность активизировать выход или переноса, или переполнения. В зависимости от того как Вы воспринимаете входные коды.
А если нет расширения разрядной сетки, значит Вы не получите правильный результат во всем диапазоне входных кодов.
Golikov A.
сложите 1 и -1 в тех же 8 битах, знаково
0000_0001 + 1111_1111 -> 1_0000_0000 переполняемый, девятый бит отбрасывается и получается верный результат 0. То есть бит переполнения при знаковой арифметике всегда есть, и его всегда надо отбросить, чтобы правильно обработать сложение с отрицательными числами. Этот бит не несет достоверной информации и его сохранения искажает результат. Знаковая арифметика при сложении 8 битных чисел не предполагает получение 9 битного числа. 9 битное число можно получить только после принудительного и правильного расширения изначальных 8 битных чисел до 9 битных.
Tausinov
Цитата(Golikov A. @ Jul 26 2017, 19:12) *
Знаковая арифметика при сложении 8 битных чисел не предполагает получение 9 битного числа. 9 битное число можно получить только после принудительного и правильного расширения изначальных 8 битных чисел до 9 битных.


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

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


P.S. Пока домой ехал понял, что бред написал. Все, что написано выше верно для знакового разряда, а не для "нового".
ViKo
Цитата(Мур @ Jul 26 2017, 17:59) *
Столкнулся с проблемой...

И я столкнулся - антивирус Avast ругается на ваш аватар, похоже! laughing.gif
sazh
Цитата(Tausinov @ Jul 26 2017, 20:15) *
Это я и имел в виду под


А зачем вам ловить переполнения. Расширяйте разрядную сетку.
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
Мур
Цитата(ViKo @ Jul 26 2017, 20:30) *
И я столкнулся - антивирус Avast ругается на ваш аватар, похоже! laughing.gif

Столько лет висела... что же это за хрень?
GriXa
По поводу библиотек, как уже написал 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
Цитата(GriXa @ Jul 26 2017, 22:53) *


О, знакомая картинка. Но через какое-то время уже даже не задумываешься - на мой взгляд, все довольно логично и запоминать почти ничего не нужно. В отличии от магии в arith, где результат +/- для signed/unsigned можно присваивать std_logic_vector'у напрямую.
Flip-fl0p
Цитата(Tausinov @ Jul 27 2017, 00:57) *
О, знакомая картинка. Но через какое-то время уже даже не задумываешься - на мой взгляд, все довольно логично и запоминать почти ничего не нужно. В отличии от магии в arith, где результат +/- для signed/unsigned можно присваивать std_logic_vector'у напрямую.

А мне вот эта вот нравится. Распечатал и приклеил на видное место.
https://www.doulos.com/knowhow/vhdl_designe...de/numeric_std/
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.