реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Когда появляется знак, я использую бибиотеки..., "Жизнь диктует свои законы"..Подскажите выход
Мур
сообщение Jul 26 2017, 14:59
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 753
Регистрация: 7-06-06
Из: Харьков
Пользователь №: 17 847



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

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

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

Спасибо!
Go to the top of the page
 
+Quote Post
Tausinov
сообщение Jul 26 2017, 15:20
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 112
Регистрация: 19-10-13
Пользователь №: 78 795



Цитата(Мур @ 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, но она в некотором смысле более избыточная по обвязке этой самой знаковой и беззнаковой арифметики. Так что выбирайте сами, но что-то одно.
Скорее всего от сюда и ошибка, т.к. данный тип фигурирует и там и там. Ну и пусть меня поправят, если что, но для сложения и вычитания нет разницы между знаковыми и незнаковыми операндами с точки зрения результата. Разница лишь в трактовке этого самого результата и отлавливании переполнений.

Сообщение отредактировал Tausinov - Jul 26 2017, 15:20
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jul 26 2017, 15:24
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 4 210
Регистрация: 17-02-06
Пользователь №: 14 454



Еще разница в том как расширять число.
когда из Н битного надо сделать Н+М битное. Для беззнаковых добивают нулями, для знаковых Н-1 битом.
Ну и конечно сложение Н битных беззнаковых дает Н+1 битный результат. А сложение Н битных знаковых дает Н битный результат.
Go to the top of the page
 
+Quote Post
Tausinov
сообщение Jul 26 2017, 15:31
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 112
Регистрация: 19-10-13
Пользователь №: 78 795



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


Да, про расширение совсем забыл, но это уже на уровне автоматизма должно быть)
А вот на счет второго не совсем понял. Возьмем, скажем 8-битные числа. Для беззнаковых в пределе получаем 255 + 255 = 510 - 9 бит. Для знаковых в пределе получаем 127 + 127 = 254 - те же самые 9 бит - 8 на модуль и 1 на знак.
Go to the top of the page
 
+Quote Post
sazh
сообщение Jul 26 2017, 15:50
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 431
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



Цитата(Tausinov @ Jul 26 2017, 18:31) *
Возьмем, скажем 8-битные числа.


Железо про числа ничего не знает. Оно работает с кодами, которые в соответствии с задчей можно представить как числа со знаком или без знака.
Если Вы сами заботитесь о расширении разрядной сетки должным образом, то полученный код будет соответствовать Вашим представлением.
Можно конечно воспользоваться указаниями синтезатору. Но нужно четко при этом понимать, что должно получиться.
Go to the top of the page
 
+Quote Post
Tausinov
сообщение Jul 26 2017, 15:56
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 112
Регистрация: 19-10-13
Пользователь №: 78 795



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


Все так, я просто хотел на конкретном примере показать, что не совсем понял, о чем речь. В данном случае, если 9-го бита в железе нет, то переполнение наступит в обоих случаях.
Go to the top of the page
 
+Quote Post
sazh
сообщение Jul 26 2017, 16:06
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 431
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



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


Если нет расширения разрядной сетки.
Возьмем базовый примитив сумматора. Как известно у него разрядность суммы такая же как и разрядность слагаемых.
Но у него при этом есть возможность активизировать выход или переноса, или переполнения. В зависимости от того как Вы воспринимаете входные коды.
А если нет расширения разрядной сетки, значит Вы не получите правильный результат во всем диапазоне входных кодов.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jul 26 2017, 16:12
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 4 210
Регистрация: 17-02-06
Пользователь №: 14 454



сложите 1 и -1 в тех же 8 битах, знаково
0000_0001 + 1111_1111 -> 1_0000_0000 переполняемый, девятый бит отбрасывается и получается верный результат 0. То есть бит переполнения при знаковой арифметике всегда есть, и его всегда надо отбросить, чтобы правильно обработать сложение с отрицательными числами. Этот бит не несет достоверной информации и его сохранения искажает результат. Знаковая арифметика при сложении 8 битных чисел не предполагает получение 9 битного числа. 9 битное число можно получить только после принудительного и правильного расширения изначальных 8 битных чисел до 9 битных.
Go to the top of the page
 
+Quote Post
Tausinov
сообщение Jul 26 2017, 17:15
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 112
Регистрация: 19-10-13
Пользователь №: 78 795



Цитата(Golikov A. @ Jul 26 2017, 19:12) *
Знаковая арифметика при сложении 8 битных чисел не предполагает получение 9 битного числа. 9 битное число можно получить только после принудительного и правильного расширения изначальных 8 битных чисел до 9 битных.


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

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


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

Сообщение отредактировал Tausinov - Jul 26 2017, 20:54
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 26 2017, 17:30
Сообщение #10


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 7 579
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Мур @ Jul 26 2017, 17:59) *
Столкнулся с проблемой...

И я столкнулся - антивирус Avast ругается на ваш аватар, похоже! laughing.gif
Go to the top of the page
 
+Quote Post
sazh
сообщение Jul 26 2017, 17:37
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 431
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



Цитата(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
Go to the top of the page
 
+Quote Post
Мур
сообщение Jul 26 2017, 17:49
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 753
Регистрация: 7-06-06
Из: Харьков
Пользователь №: 17 847



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

Столько лет висела... что же это за хрень?
Go to the top of the page
 
+Quote Post
GriXa
сообщение Jul 26 2017, 19:53
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 35
Регистрация: 22-05-09
Пользователь №: 49 385



По поводу библиотек, как уже написал 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 и наоборот, удобно пользоваться шпаргалкой.
Go to the top of the page
 
+Quote Post
Tausinov
сообщение Jul 26 2017, 20:57
Сообщение #14


Частый гость
**

Группа: Участник
Сообщений: 112
Регистрация: 19-10-13
Пользователь №: 78 795



Цитата(GriXa @ Jul 26 2017, 22:53) *


О, знакомая картинка. Но через какое-то время уже даже не задумываешься - на мой взгляд, все довольно логично и запоминать почти ничего не нужно. В отличии от магии в arith, где результат +/- для signed/unsigned можно присваивать std_logic_vector'у напрямую.
Go to the top of the page
 
+Quote Post
Flip-fl0p
сообщение Jul 27 2017, 05:10
Сообщение #15


Местный
***

Группа: Участник
Сообщений: 395
Регистрация: 11-06-13
Пользователь №: 77 140



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

А мне вот эта вот нравится. Распечатал и приклеил на видное место.
https://www.doulos.com/knowhow/vhdl_designe...de/numeric_std/

Сообщение отредактировал Flip-fl0p - Jul 27 2017, 05:10
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th September 2017 - 03:23
Рейтинг@Mail.ru


Страница сгенерированна за 0.0149 секунд с 7
ELECTRONIX ©2004-2016