Jump to content

    

numeric_std

11 часов назад, yes сказал:

... а с 31-битом в VHDL-ной математике неоднократно - наверно все на этот костыль наступали :)

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

А можно немного раскрыть детали этой темы? Желательно с конкретными примерами...

Share this post


Link to post
Share on other sites
3 часа назад, Самурай сказал:

А можно немного раскрыть детали этой темы?

А что тут раскрывать? Стандарт гарантирует 32-битные целые. Можно больше, но это на усмотрение вендоров. Фактически все и поддреживают только 32 бита.

Теперь у нас есть VHDL-2019, а он устанавливает 64-битные целые, но поддержку этого стандарта ждать мы будем долго. Очень долго.

Share this post


Link to post
Share on other sites
1 минуту назад, andrew_b сказал:

А что тут раскрывать? Стандарт гарантирует 32-битные целые. Можно больше, но это на усмотрение вендоров. Фактически все и поддреживают только 32 бита.

Теперь у нас есть VHDL-2019, а он устанавливает 64-битные целые, но поддержку этого стандарта ждать мы будем долго. Очень долго.

Спасибо, но что такое integer в VHDL-е я знаю. Я не знаю, почему пользователь ыыыыы.... yes неоднократно наступал на костыль с 31-м битом в VHDL, почему он считает, что все на этот костыль наступали тоже, и самое интересное - откуда у этого пользователя такая трагичность и безысходность в голосе за судьбу несчастной арифметики в VHDL??? Неужели он и правда считает, что в VHDL-е нельзя сложить, к примеру, два 40-а битных числа???? Умножить? Поделить? Выполнить логическую операцию наконец???? Может это просто не получилось только у него одного? Да... жаль бедолагу...    

Share this post


Link to post
Share on other sites
On 10/11/2019 at 10:53 PM, MrGalaxy said:

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

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

Share this post


Link to post
Share on other sites
On 10/12/2019 at 7:51 AM, Самурай said:

Спасибо, но что такое integer в VHDL-е я знаю. Я не знаю, почему пользователь ыыыыы.... yes неоднократно наступал на костыль с 31-м битом в VHDL, почему он считает, что все на этот костыль наступали тоже, и самое интересное - откуда у этого пользователя такая трагичность и безысходность в голосе за судьбу несчастной арифметики в VHDL??? Неужели он и правда считает, что в VHDL-е нельзя сложить, к примеру, два 40-а битных числа???? Умножить? Поделить? Выполнить логическую операцию наконец???? Может это просто не получилось только у него одного? Да... жаль бедолагу...    

ну так попробуйте обойтись без сахаровской демагогии и напишите, например, 29-ти разрядный аккумулятор, который каждый такт прибавляет константу, задаваемую при инстанциации (generic), каждый такт и имеет два входных 25-ти беззнаковых числа со стробами, одно вычитается, другое прибавляется по соответствующему стробу, на выход три старших бита (задание бредовое, чтоб не нагуглилось сразу, но тем не менее - это будет NCO, три бита можно на таблицу синусов подавать, число код частоты, два входа коррекции...)

напишите и посмотрим, наступите или нет. а потом уже будем рассуждать про 40 бит и т.п.

------------------

уж не знаю, чем я обидел пользователя на сахаре, лет 5 там уже не писал. но мое мнение, сорри за офтоп, что сахара это зеркало деградации отечественной электроники. там кстати и сократились всякие "наукоемкие" конференции типа dsp, плис и т.п.

-----------------

я вообще-то имел роль VHDL-гуру :), как это ни смешно, в одной конторе и студенты и начинающие авторы с этим вопросом обращались, и у Гейслера в его либе есть такая ошибка

собственно там все просто и скучно весьма, но хотелось бы увидеть ответ, если пользователь Самурай сумеет не наступить - я тогда напишу (может кстати и поправили это в тулзах современных - я давно не брал в руки шашки)

On 10/12/2019 at 7:19 AM, andrew_b said:

А что тут раскрывать? Стандарт гарантирует 32-битные целые. Можно больше, но это на усмотрение вендоров. Фактически все и поддреживают только 32 бита.

Теперь у нас есть VHDL-2019, а он устанавливает 64-битные целые, но поддержку этого стандарта ждать мы будем долго. Очень долго.

речь про 31 бит. и я вобщем-то дал вредный совет выше :)

наверно, всю интригу погубил этим коментом.

это естественно не проблема языка, и она обходится, но я сталкивался с тем, что люди пишут с этой ошибкой. по-моему и сюда писал (давно было и не уверен), ну и мне объяснили, что так и должно быть

 

Share this post


Link to post
Share on other sites

--------------

чего-то у меня так сразу не получилось вспомнить код - смысл: в VHDL integer всегда знаковый, и максимальное значение +2**31, но к/из нему/него можно приводить и беззнаковые числа. но как это должно быть сделано, чтобы сразу было не видно - я сейчас не смог написать. мне казалось, что в операциях с generic-ом это могло проявится достаточно просто, но так сразу не вспомнил. попозже попробую найти как это у Гейслера было, но опять же тех версий библиотек уже нету... то есть признаю - специально написать так, чтобы терялся знаковый бит у меня не получилось

 

Share this post


Link to post
Share on other sites

пример сумматора с разрядностью более 32 бита

 

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity adder_half_unsigned_reg is
generic(
  N       : integer := 256);
port (
  i_clk     : in     std_logic;
  i_add1    : in     std_logic_vector(N-1 downto 0);
  i_add2    : in     std_logic_vector(N-1 downto 0);
  o_sum     : out    std_logic_vector(N-1 downto 0));
end adder_half_unsigned_reg;
architecture rtl of adder_half_unsigned_reg is
signal r_add1    : unsigned(N-1 downto 0);
signal r_add2    : unsigned(N-1 downto 0);
signal w_sum     : unsigned(N-1 downto 0);
begin
-- combinatorial adder
  w_sum <= r_add1 + r_add2;
r_process : process(i_clk)
begin
  if(rising_edge(i_clk)) then
  
  -- register input
    r_add1      <=  unsigned(i_add1);
    r_add2      <=  unsigned(i_add2);
    
  -- register output
    o_sum       <= std_logic_vector(w_sum);
    
  end if;
end process r_process;

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

Share this post


Link to post
Share on other sites
5 минут назад, Maverick_ сказал:

пример сумматора с разрядностью более 32 бита

С векторами ограничений на разрядность нет. Речь идёт о типе integer.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Можно предположить, что проблемы могут происходить при совершении каких-либо операций с преобразованием через integer. У меня есть подсознательное ощущение что в каких-то арифметических пакетах я встречал подобное. Правда сейчас поковырял исходники библиотек и ничего не смог найти.

Share this post


Link to post
Share on other sites

извиняюсь за суету. то есть проблему я помню, так как меня это сильно удивило в свое время. но вчера попробовал код написать, как запомнил - либо работает, либо компиляция с ошибкой (был вариант с варнингом и правильным результатом)

сам по себе знаковый бит (в сложении/вычитании) вобщем-то только для красоты, не должно быть разницы между signed и unsigned. то есть это в какой-то последовательности преобразований типов возникало...

может я еще маски упускаю - насколько помню, тогда всякие DMA и арбитры шины писали, и неоднократно (то есть разные люди) сталкивались с проблемами 31-го бита адреса.

Share this post


Link to post
Share on other sites

Не сочтите за оффтоп =)

А есть хоть одно существенное преимущество или удобство в использовании integer, а не signed/unsigned? Просто практически никогда integer не использую(ну кроме счетчиков и мест когда надо обращаться к массивам). Полный контроль разрядностей, все видно, прозрачно. Чем инты так хороши?

Share this post


Link to post
Share on other sites
18 minutes ago, Strob said:

А есть хоть одно существенное преимущество или удобство в использовании integer, а не signed/unsigned?

константы удобнее задавать

Share this post


Link to post
Share on other sites
10 часов назад, Strob сказал:

Не сочтите за оффтоп =)

А есть хоть одно существенное преимущество или удобство в использовании integer, а не signed/unsigned? Просто практически никогда integer не использую(ну кроме счетчиков и мест когда надо обращаться к массивам). Полный контроль разрядностей, все видно, прозрачно. Чем инты так хороши?

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

И при описании сигналов явно указываешь integer range 0 to 15 или range -8 to 7 , и сразу понятно есть там знак или нет, а порт при этом один и тот же [3..0].

Share this post


Link to post
Share on other sites

Я в VHDL использовал integer только для индексов, а собственно арифметику только на  numeric_std.signed/unsigned, так что никаких проблем с длиной и 31-м битом не было. Правда, пришлось сделать свою библиотеку для удобных преобразований векторов и ещё всякой всячины. При этом арифметика на VHDL внезапно получается проще и надёжнее, чем на Верилог, но вот про чистую логику этого сказать нельзя.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now