Jump to content

    
Sign in to follow this  
Мур

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

Recommended Posts

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

 

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

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

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:

 

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

 

Спасибо!

Share this post


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

 

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

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

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

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

Edited by Tausinov

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites
Еще разница в том как расширять число.

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

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

 

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

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

Share this post


Link to post
Share on other sites
Возьмем, скажем 8-битные числа.

 

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

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

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

Share this post


Link to post
Share on other sites
Железо про числа ничего не знает. Оно работает с кодами, которые в соответствии с задчей можно представить как числа со знаком или без знака.

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

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

 

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

Share this post


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

 

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

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

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

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

 

Share this post


Link to post
Share on other sites

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

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

Share this post


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

 

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

 

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

 

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

Edited by Tausinov

Share this post


Link to post
Share on other sites
Это я и имел в виду под

 

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

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

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

 

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

 

Share this post


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

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

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

Edited by Flip-fl0p

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this