Nick_K 0 11 октября, 2019 Опубликовано 11 октября, 2019 · Жалоба 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 бита и уже потом оптимизируется. Или не оптимизируется Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 11 октября, 2019 Опубликовано 11 октября, 2019 · Жалоба ---- Описывает логический элемент, который считает число единиц во входных данных. ---- Объяснение: ---- Нулевая ступень - суммируем группы по 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 16 11 октября, 2019 Опубликовано 11 октября, 2019 · Жалоба 11 минут назад, Maverick_ сказал: sum1_std_logic_vector Извините, но код страшен как моя смерть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 11 октября, 2019 Опубликовано 11 октября, 2019 · Жалоба 3 minutes ago, andrew_b said: Извините, но код страшен как моя смерть. предложите лучшее решение если критикуете то хотя бы давайте объяснение... единственный минус это использование библиотеки " use IEEE.STD_LOGIC_UNSIGNED.ALL; " Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 16 11 октября, 2019 Опубликовано 11 октября, 2019 · Жалоба 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 ЛУТа, но не сумматор. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yes 7 11 октября, 2019 Опубликовано 11 октября, 2019 · Жалоба 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-ный код Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 11 октября, 2019 Опубликовано 11 октября, 2019 · Жалоба 7 minutes ago, yes said: если только не придется поддерживать и развивать чей-то старый VHDL-ный код Тут вы немного ошибаетесь. Есть достаточно много организаций которые продолжают и требуют разрабатывать компоненты на чистом VHDL из-за его однозначной трактовки и понятности. В основном это конторы с системами безопасности и защиты. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yes 7 11 октября, 2019 Опубликовано 11 октября, 2019 · Жалоба 58 minutes ago, Nick_K said: Тут вы немного ошибаетесь. Есть достаточно много организаций которые продолжают и требуют разрабатывать компоненты на чистом VHDL из-за его однозначной трактовки и понятности. В основном это конторы с системами безопасности и защиты. ну вот я не разу не сталкивался с ошибками в нетитизированной математике (то есть синтез каких-то узлов с арифметическими операциями) верилога, а с 31-битом в VHDL-ной математике неоднократно - наверно все на этот костыль наступали :) и вполне возможно, что 32-х битов недостаточно уже будет для арифметики - что тогда делать? ------------------------ ну а то что VHDL где-то продолжает использоваться, я не сомневаюсь. но потребность в узкоспециализированных специалистах в VHDL, по моему, гораздо ниже чем SV. особенно если брать "модные" методологии верификации основанные на SV Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 11 октября, 2019 Опубликовано 11 октября, 2019 · Жалоба Язык это как карандаш, если умеешь рисовать то и с другим карандашом будешь рисовать... Мое мнение (Verilog я читаю без проблем). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 11 октября, 2019 Опубликовано 11 октября, 2019 · Жалоба @yes Вы всё правильно говорите, но есть одно НО. Ваша математика будет работать ровно до тех пор пока синтезатор среды сможет её проглотить. И не важно Verilod или VHDL. ИМХО инженер отличается от аматора, именно тем, что может с говна и палок примитивов создать нужное готовое решение. И тут мы приходим к следющему пункту, либо использовать разного рода Матлабы, которые сильно упрощают жизнь, либо писать вручную с использованием мегафункций и DSP примитивов. И никакие средства языка не спасут в этом месте. А по поводу SV vs VHDL и да и нет. Давайте не будем забывать, что VHDL - это изначально язык проектрования систем FPGA. А Verilog(SV) - это изначально Си-подобное средство моделирования, которое позволяло больше вольностей ибо обрабатывалось в виртуальной среде исключительно. И как заметил уважаемый @Maverick_ Языки - это и вправду карандаши. Просто кому-то нравится рисовать синими, а кому-то красными Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrGalaxy 9 11 октября, 2019 Опубликовано 11 октября, 2019 · Жалоба 7 часов назад, SII сказал: 1. В моём примере складываются UNSIGNED'ы и приводятся к INTEGER'у. Какая ошибка у человека возникла, он не сообщил, так что я предположил, что дело было в несоответствии типов. 2. Есть сложение STD_LOGIC_VECTOR.. 1. Да, несоответствие типов. Точно процитировать не могу, ошибка на работе, сейчас сижу в гостинице, эвм нету под рукой. Завтра перепишу на бумагу и здесь процитирую. 2. Да, только логическое, а мне надо арифметическое. 11 часов назад, des00 сказал: VHDL просто космос....я бы функцию написал, а там классически sum = 0; for (blablabla) if bit(i) sum = sum + 1 Это типичный ошибочный подход программиста. Нельзя в плис так делать, работать не будет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrGalaxy 9 11 октября, 2019 Опубликовано 11 октября, 2019 · Жалоба 6 часов назад, Nick_K сказал: один элетент - std_logic. Или просто bit. разница не очень большая для синтезатора p.s. Лучше не использовать векторы unsigned и signed без крайней необходимости, а оставаться в пределах std_logic. Будет меньше мороки Теперь буду знать, спасибо. Я-то мечтал, что подмножество вектора unsigned тоже будет unsigned. Хотел ведь изначально оформить это дело как массивы однобитных целых чисел, да вот леший попутал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yes 7 11 октября, 2019 Опубликовано 11 октября, 2019 · Жалоба 1 hour ago, MrGalaxy said: Это типичный ошибочный подход программиста. Нельзя в плис так делать, работать не будет. а посмотрите как оно сделано в библиотеке, которая в исходнике даётся и в ПЛИС синтезируется - в том самом numeric_std. программистский подход ни разу не ошибочный, а единственно верный. просто не все программисты, а уж тем более "электронщики" им владеют. 3 hours ago, Nick_K said: @yes Вы всё правильно говорите, но есть одно НО. Ваша математика будет работать ровно до тех пор пока синтезатор среды сможет ...... И как заметил уважаемый @Maverick_ Языки - это и вправду карандаши. Просто кому-то нравится рисовать синими, а кому-то красными вопрос еще в продуктивности, то есть времени требуемом на исполнение работы с одинаковым QoR - если карандаш кривой и все время ломается, то его нужно менять. а в свободное время (в качестве аматера, если так нравится) можно хоть на брейнфаке писать - существует множество специальных дисциплин --------------- upd: возможно, что в 80-х, когда еще синтезаторов не было, писать на VHDL было гораздо круче - так как это специальный академический язык, разработанный учОными для красоты и удовольствия смотреть на него (ни симуляторов, ни синтезаторов еще не было). а Verilog возник как некий внутрефирменный язык управления симулятором, то есть чисто инструмент, без красоты и какой-то структуры. но, как говорится, время все расставило по местам :) btw: в VHDL-2008 по моему есть целые произвольной длины Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 16 11 октября, 2019 Опубликовано 11 октября, 2019 · Жалоба А недавно официально вышел VHDL-2019, это прошло незамеченным. https://groups.google.com/forum/#!topic/comp.lang.vhdl/3O7VYoNtiuo Только толку с той новости, если 2008 вендоры толком не поддерживают. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 11 октября, 2019 Опубликовано 11 октября, 2019 · Жалоба 3 минуты назад, andrew_b сказал: А недавно официально вышел VHDL-2019, это прошло незамеченным. https://groups.google.com/forum/#!topic/comp.lang.vhdl/3O7VYoNtiuo Только толку с той новости, если 2008 вендоры толком не поддерживают. И не говорите... В 2019 году не полностью поддерживать VHDL2008... Они там сговорились что-ли ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться