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

Just now, andrew_b said:

legacy std_logic_arith

Этого ьявола нельзя пользовать впринципе!

1 minute ago, andrew_b said:

Если это математика, то unsigned и signed без вариантов.

я и сказал - без крайней необходимости. Обычно  для простых задач математика не нужна - там сдвиг и логические операции охватывают 100% потребностей.

3 minutes ago, andrew_b said:

unsigned и signed это однозначно числа. std_logic_vector в общем случае числом не является.

после синтеза, что так, что этак - это всё массив бит. С небольшим исключением: integer значально имеет длинну 32 бита и уже потом оптимизируется. Или не оптимизируется :smile:

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


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

---- Описывает логический элемент, который считает число единиц во входных данных.
---- Объяснение:
---- Нулевая ступень - суммируем группы по 4 бита, каждому такому сумматору должно потребоваться 3 LUT и никаких переносов. 
---- Дальше суммируем обычным деревом сумматоров. Но - старшие биты в каждом из сумматоров обладают свойством, назовем, "исключительности". 
---- То есть, если этот бит в 1, то все остальные младшие биты в 0 (максимальные числа в ступенях s0, s1, s2, s3 будут 4, 8, 16 и 32). 
---- Поэтому для вычисления старшего бита не нужны переносы из младших. Вот на этих переносах задержки и экономятся.
---- Дальше - нужно применить схемы параллельных переносов, когда для их формирования используются только входные сигналы. 
---- Только нужно еще определить, в каком случае параллельные переносы будут эффективнее последовательных. 
---- Надеюсь, если правильно все написать, то быстродействие будет не меньше, чем при игнорировании carry. 


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;

entity sum1_std_logic_vector is
    Port ( clk : in std_logic;
	 rst : in std_logic;
           d : in std_logic_vector(63  downto 0);
           sum : out std_logic_vector(6  downto 0));
end sum1_std_logic_vector;

architecture behavioral of sum1_std_logic_vector is

type ARRAY_TYPE_s0 is array (0 to 15) of std_logic_vector(2 downto 0);
type ARRAY_TYPE_s1 is array (0 to 7) of std_logic_vector(3 downto 0);
type ARRAY_TYPE_s2 is array (0 to 3) of std_logic_vector(4 downto 0);
type ARRAY_TYPE_s3 is array (0 to 1) of std_logic_vector(5 downto 0);

signal s0 : ARRAY_TYPE_s0;
signal s1 : ARRAY_TYPE_s1;
signal s2 : ARRAY_TYPE_s2;
signal s3 : ARRAY_TYPE_s3;

signal dc : std_logic_vector(63  downto 0);
signal sumc : std_logic_vector(6 downto 0);

begin 
process (clk, rst)
begin
if (clk'event and clk = '1') then
    dc <= d;
   sum <= sumc;
end if;
end process;

process (dc, d, s0, s1, s2, s3)
 begin
  
	for i in 0 to 15 loop
      s0(i) <= conv_std_logic_vector( conv_integer(dc(4*i)) + conv_integer(dc(4*i + 1)) + conv_integer(dc(4*i + 2)) + conv_integer(dc(4*i + 3)), 3) ;
   
	for j in 0 to 7 loop
      s1(j)(2 downto 0) <= conv_std_logic_vector( conv_integer(s0(2*j)) + conv_integer(s0(2*j +1)), 3);
      s1(j)(3) <= s0(2*j)(2) and s0(2*j +1)(2);
    end loop;
  
   for k in 0 to 3 loop
      s2(k)(3 downto 0) <= s1(2*k) + s1(2*k +1);
      s2(k)(4) <= s1(2*k)(3) and s1(2*k +1)(3);
    end loop;
    
	for m in 0 to 1 loop
      s3(m)(4 downto 0) <= conv_std_logic_vector( conv_integer(s2(2*m)) + conv_integer(s2(2*m +1)), 5);
      s3(m)(5) <= s2(2*m)(4) and s2(2*m +1)(4);
    end loop;
  sumc(5 downto 0) <= conv_std_logic_vector (conv_integer(s3(0)) + conv_integer(s3(1)), 6);
  sumc(6) <= s3(0)(5) and s3(1)(5);
  end loop;

end process;

end behavioral;

 

-- сумматор
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

entity ADDER is

generic(n: natural :=2);
port(	
	A:	in std_logic_vector(n-1 downto 0);
	B:	in std_logic_vector(n-1 downto 0);
	sum:	out std_logic_vector(n-1 downto 0);
	carry:	out std_logic	);

end ADDER;

architecture behv of ADDER is

signal result: std_logic_vector(n downto 0);
 
begin					  
       
    result <= ('0' & A)+('0' & B);
    sum <= result(n-1 downto 0);
    carry <= result(n);

end behv;

 

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


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

11 минут назад, Maverick_ сказал:

sum1_std_logic_vector

Извините, но код страшен как моя смерть.

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


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

3 minutes ago, andrew_b said:

Извините, но код страшен как моя смерть.

предложите лучшее решение

если критикуете то хотя бы давайте объяснение...

 

единственный минус это использование библиотеки "

use IEEE.STD_LOGIC_UNSIGNED.ALL;

"

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


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

13 минут назад, Maverick_ сказал:

если критикуете то хотя бы давайте объяснение...

 

 

use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
USE ieee.numeric_std.ALL;

Вот это всё вместе зачем? Тут что-то явно лишнее.

 

31 минуту назад, Maverick_ сказал:

суммируем группы по 4 бита, каждому такому сумматору должно потребоваться 3 LUT и никаких переносов.

Количество единиц в 4-х битах считается в одном ЛУТе. Это простая логическая функция 4 переменных, которая ложится в 4-входовый ЛУТ как влитая. Тут вообще нет никаких сумматоров.

31 минуту назад, Maverick_ сказал:

Дальше суммируем обычным деревом сумматоров.

Дерево простых сумматоров (carry-propagation) не лучшая идея. Если надо просуммировать много чисел, лучше воспользоваться деревом Уоллеса, состоящим из сумматоров с сохранением переносов (CSA, carry-save adder). Там элементарная комбинаторика за исключением последнего сумматора.

 

Upd. "Количество единиц в 4-х битах считается в одном ЛУТе". Тут я поспешил. Да, таки 3 ЛУТа, но не сумматор.

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


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

6 hours ago, andrew_b said:

В отличие от Верилога, где вся математика прибита гвоздями намертво сидит в ядре, в VHDL математика вынесена во внешние библиотеки (то самый numeric std, который оперирует типом std_logic_vector, который в свою очередь тоже определён во внешней библиотеке).

да там не только математика, но и электричество отсутствует, иначе зачем аяяй стд логик 1164 цеплять в каждый файл?

по хорошему, для всей этой математической фигни нужно из std_numeric три функции to_signed/unsigned и to_integer, а размеры в интегерах сохраняются через 'range атрибут

ну и std_logic_vector(to_signed/unsigned "ис коропки" работает

.....

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

вобщем: юноше желающему постичь HDL на профессиональном (или даже продвинутолюбительском) уровне я бы советовал SV. а VHDL забыть, ну если только не придется поддерживать и развивать чей-то старый VHDL-ный код

 

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


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

7 minutes ago, yes said:

если только не придется поддерживать и развивать чей-то старый VHDL-ный код

Тут вы немного ошибаетесь. Есть достаточно много организаций которые продолжают и требуют разрабатывать компоненты на чистом VHDL из-за его однозначной трактовки и понятности. В основном это конторы с системами безопасности и защиты.

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


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

58 minutes ago, Nick_K said:

Тут вы немного ошибаетесь. Есть достаточно много организаций которые продолжают и требуют разрабатывать компоненты на чистом VHDL из-за его однозначной трактовки и понятности. В основном это конторы с системами безопасности и защиты.

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

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

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

ну а то что VHDL где-то продолжает использоваться, я не сомневаюсь. но потребность в узкоспециализированных специалистах в VHDL, по моему, гораздо ниже чем SV. особенно если брать "модные" методологии верификации основанные на SV  

 

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


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

Язык это как карандаш, если умеешь рисовать то и с другим карандашом будешь рисовать...

Мое мнение (Verilog я читаю без проблем).

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


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

@yes Вы всё правильно говорите, но есть одно НО. Ваша математика будет работать ровно до тех пор пока синтезатор среды сможет её проглотить. И не важно Verilod или VHDL. ИМХО инженер отличается от аматора, именно тем, что может с говна и палок примитивов создать нужное готовое решение. И тут мы приходим к следющему пункту, либо использовать разного рода Матлабы, которые сильно упрощают жизнь, либо писать вручную с использованием мегафункций и DSP примитивов. И никакие средства языка не спасут в этом месте.

А по поводу SV vs VHDL и да и нет. Давайте не будем забывать, что VHDL - это изначально язык проектрования систем FPGA. А Verilog(SV) - это изначально Си-подобное средство моделирования, которое позволяло больше вольностей ибо обрабатывалось в виртуальной среде исключительно.

И как заметил уважаемый @Maverick_ Языки - это и вправду карандаши. Просто кому-то нравится рисовать синими, а кому-то красными :smile:

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


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

7 часов назад, SII сказал:

1. В моём примере складываются UNSIGNED'ы и приводятся к INTEGER'у. Какая ошибка у человека возникла, он не сообщил, так что я предположил, что дело было в несоответствии типов.

2. Есть сложение STD_LOGIC_VECTOR..

1. Да, несоответствие типов. Точно процитировать не могу, ошибка на работе, сейчас сижу в гостинице, эвм нету под рукой. Завтра перепишу на бумагу и здесь процитирую.

2. Да,  только логическое, а мне надо арифметическое.

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

VHDL просто космос....я бы функцию написал, а там классически sum = 0; for (blablabla) if bit(i)  sum = sum + 1

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

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


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

6 часов назад, Nick_K сказал:

 

один элетент -  std_logic. Или просто bit. разница не очень большая для синтезатора

p.s. Лучше не использовать векторы unsigned и signed без крайней необходимости, а оставаться в пределах std_logic. Будет меньше мороки

Теперь буду знать, спасибо. Я-то мечтал, что подмножество вектора unsigned тоже будет unsigned. Хотел ведь изначально оформить это дело как массивы однобитных целых чисел, да вот леший попутал.:dash1:

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


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

1 hour ago, MrGalaxy said:

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

а посмотрите как оно сделано в библиотеке, которая в исходнике даётся и в ПЛИС синтезируется - в том самом numeric_std.

программистский подход ни разу не ошибочный, а единственно верный. просто не все программисты, а уж тем более "электронщики" им владеют.

3 hours ago, Nick_K said:

@yes Вы всё правильно говорите, но есть одно НО. Ваша математика будет работать ровно до тех пор пока синтезатор среды сможет

......

И как заметил уважаемый @Maverick_ Языки - это и вправду карандаши. Просто кому-то нравится рисовать синими, а кому-то красными :smile:

вопрос еще в продуктивности, то есть времени требуемом на исполнение работы с одинаковым QoR - если карандаш кривой и все время ломается, то его нужно менять. а в свободное время (в качестве аматера, если так нравится) можно хоть на брейнфаке писать - существует множество специальных дисциплин

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

upd: возможно, что в 80-х, когда еще синтезаторов не было, писать на VHDL было гораздо круче - так как это специальный академический язык, разработанный учОными для красоты и удовольствия смотреть на него (ни симуляторов, ни синтезаторов еще не было). а Verilog возник как некий внутрефирменный язык управления симулятором, то есть чисто инструмент, без красоты и какой-то структуры. но, как говорится, время все расставило по местам :)

btw: в VHDL-2008 по моему есть целые произвольной длины

 

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


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

А недавно официально вышел VHDL-2019, это прошло незамеченным.

https://groups.google.com/forum/#!topic/comp.lang.vhdl/3O7VYoNtiuo

Только толку с той новости, если 2008 вендоры толком не поддерживают.

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


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

3 минуты назад, andrew_b сказал:

А недавно официально вышел VHDL-2019, это прошло незамеченным.

https://groups.google.com/forum/#!topic/comp.lang.vhdl/3O7VYoNtiuo

Только толку с той новости, если 2008 вендоры толком не поддерживают.

И не говорите... В 2019 году не полностью поддерживать VHDL2008... Они там сговорились что-ли ?

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


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

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

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

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

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

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

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

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

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

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