crono 0 3 декабря, 2012 Опубликовано 3 декабря, 2012 (изменено) · Жалоба Задача такая. Есть вектор (N downto 0) неочень длинный, скажем Nmax=10-12 . Каждый такт клока вектор может принимать новое значение. Как за 1 такт подсчитать количество "единиц" ну или "нулей", кому что приятней, в векторе? При этом N-1 раз написать "+" неинтересно, так как на высокой частоте работать будет плохо. А нужно 300-400МГц. Или баян? Похожую тему видел, но там длинный вектор 64 бита. Изменено 3 декабря, 2012 пользователем crono Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Александр77 1 3 декабря, 2012 Опубликовано 3 декабря, 2012 · Жалоба Задача такая. Есть вектор (N downto 0) неочень длинный, скажем Nmax=10-12 . Каждый такт клока вектор может принимать новое значение. Как за 1 такт подсчитать количество "единиц" ну или "нулей", кому что приятней, в векторе? Ну например так как описано у Шевкопляса Но насчет 300МГц, я не уверен Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
crono 0 3 декабря, 2012 Опубликовано 3 декабря, 2012 · Жалоба Ну например так как описано у Шевкопляса Громоздко. Не будет быстро работать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
StewartLittle 41 3 декабря, 2012 Опубликовано 3 декабря, 2012 · Жалоба Если хотите более-менее быстро, то надо учитывать архитектурные особенности ПЛИС. К примеру, с 4-входовым LUT это будет одно, а с 8-входовым ALM - совсем другое. Вы в каком ПЛИСе собираетесь эту задачу решать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
crono 0 3 декабря, 2012 Опубликовано 3 декабря, 2012 · Жалоба Если хотите более-менее быстро, то надо учитывать архитектурные особенности ПЛИС. К примеру, с 4-входовым LUT это будет одно, а с 8-входовым ALM - совсем другое. Вы в каком ПЛИСе собираетесь эту задачу решать? Я думаю, задача одинаково решится и для вертакса и для циклона. Ну, предположим Virtex-6. Архитектуру альтеровских микросхем я знаю хуже. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Александр77 1 3 декабря, 2012 Опубликовано 3 декабря, 2012 · Жалоба Громоздко. Не будет быстро работать. Делал несколько лет назад чуть иначе. За базу взял ту же пару "2И"+"2ИЛИ", но всего на 4 разряда. поставил 2 штуки и сумматор. Вышло, насколько помню, меньше по ЛЭ. Советовал как точку старта Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vacikL 0 3 декабря, 2012 Опубликовано 3 декабря, 2012 · Жалоба А почему бы не сделать на памяти данную операцию? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
crono 0 3 декабря, 2012 Опубликовано 3 декабря, 2012 · Жалоба А почему бы не сделать на памяти данную операцию? подробней Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vacikL 0 3 декабря, 2012 Опубликовано 3 декабря, 2012 (изменено) · Жалоба Делаем ROM на 10 или 12 разрядов, данные забиваем по адресам: Например для 10 битной шины (нужно 4 бита выхода) adrr 0000000000 dann 0000 adrr 0000000001 dann 0001 adrr 0000000010 dann 0001 adrr 0000000011 dann 0010 ну и так далее т.е. при обращении к памяти, на выходе будет нужное значение. Для Virtex-6 нужен один внутренний блок памяти для реализации 12 битного адреса и 4 битного выхода. Изменено 3 декабря, 2012 пользователем Vacik Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
crono 0 3 декабря, 2012 Опубликовано 3 декабря, 2012 (изменено) · Жалоба Делаем ROM на 10 или 12 разрядов, данные забиваем по адресам: т.е. при обращении к памяти, на выходе будет нужное значение. Да, а при том, что на Virtex-6 память можно сгенерировать в формате 4096x4 потребуется всего 1 блок RAM. И не требуется использование логики и быстродействие максимальное. К сожалению, для более длинных векторов решение уже не на столько изящное. Изменено 3 декабря, 2012 пользователем crono Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vacikL 0 3 декабря, 2012 Опубликовано 3 декабря, 2012 · Жалоба Не понял чем не устраивает предложенный вариант, задача была на 12 битный вектор. Решение для длинных векторов должно быть комплексным, и память используем и логику. Все зависит от начального условия (РАЗМЕРНОСТЬ) и требований по быстродействию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
crono 0 3 декабря, 2012 Опубликовано 3 декабря, 2012 (изменено) · Жалоба Не понял чем не устраивает предложенный вариант, задача была на 12 битный вектор. Решение для длинных векторов должно быть комплексным, и память используем и логику. Все зависит от начального условия (РАЗМЕРНОСТЬ) и требований по быстродействию. Да я как раз и пишу, что всем устраивает! Я думаю, обеспечит максимальное быстродействие. Просто задача такая возникает часто, а данное решение я на форуме не нашел. Может, правда, искал плохо. Изменено 3 декабря, 2012 пользователем crono Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
FatRobot 0 4 декабря, 2012 Опубликовано 4 декабря, 2012 · Жалоба Хорошо бы начинающему, как Вы изволили выразиться, "плисоводу" научиться пользоваться открытыми источниками: http://www.altera.com/literature/manual/cookbook.zip там /cookbook/arithmetic/thirtysix_six_comp.v Кстати, Александр77, а Вы сами читали, что делает устройство из книги Шевкопляса? По-моему "ртутный столбик" с высотой в количество единиц - это совсем не то, что требуется. Т.е. после него конечно можно поставить приоритетный шифратор (что, кстати, тоже отдельная задача при требованиях к быстродействию), и получить искомое, но смысл такого решения не очевиден. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Александр77 1 4 декабря, 2012 Опубликовано 4 декабря, 2012 · Жалоба Вы сами читали, что делает устройство из книги Шевкопляса? По-моему "ртутный столбик" с высотой в количество единиц - это совсем не то, что требуется. Да Вы правы в том, что я поторопился с советом. Но устройство из книгя я делал для определения числа исправных\неисправных устройств, прям как Вы и описали: сортировщик+ шифратор. Правда требований исполнения за такт не было. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Muscat 0 10 декабря, 2012 Опубликовано 10 декабря, 2012 · Жалоба Привету клубу изобретателей им. Артамонова! Скромный опыт высказал мысль, что эту задачку стоит решать средствами синтезатора, так как не бог весть какая сложность. То есть описать поведенческую модель средствами языка и предложить синтезатору выбрать оптимальную схему. Мне кажется, что для абсолютного большинства задач этот способ будет оптимальным, как по скорости работы, так и по времени разработки. Так как современные ПЛИС и работа синтезатора для них это очень сильное колдунство и методики оптимальные для "рассыпухи" там часто не работают. Если хочется выше частоту, то добавляем на выходе триггеров и он сам сделает конвеер. library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity OnesCntr is generic( DATA_WIDTH : integer := 16; NUMBER_WIDTH:integer:=4 --log2(DATA_WIDTH) ); port( clk : in std_logic; InpVec: in std_logic_vector (DATA_WIDTH-1 downto 0); OnesNum: out std_logic_vector (NUMBER_WIDTH-1 downto 0) ); end OnesCntr; architecture beh of OnesCntr is signal InpVec_t: std_logic_vector (DATA_WIDTH-1 downto 0); begin process (clk) variable curr_num: std_logic_vector (NUMBER_WIDTH-1 downto 0); begin if rising_edge(clk) then InpVec_t<=InpVec; --Триггер нужен, тк без него не покажет частоты.Если ваш собственной вход с триггеров, это можно убрать. curr_num:=(others=>'0'); for i in 0 to DATA_WIDTH-1 loop if (InpVec_t(i)='0') then curr_num:=curr_num+1; end if; end loop; OnesNum<=curr_num; end if; end process; end architecture; Синтез SymplifyPro F-2012 (кристалл задан некий случайный Виртекс 6) Mapping to part: xc6vsx315tff1759-3 Requested Estimated Requested Estimated Clock Clock Starting Clock Frequency Frequency Period Period Slack Type Group ------------------------------------------------------------------------------------------------------------------------ OnesCntr|clk 621.2 MHz 528.0 MHz 1.610 1.894 -0.284 inferred Autoconstr_clkgroup_0 ====================================================================== Данный метод применим даже для достаточно длинных последовательностей, например для разрядности входной 64 частота была 304.2 MHz (синтез аж 6 секунд). Аналогично за такт решается задача нахождения минимального среди небольшого количества (4-5) чисел (10 разрядов). Входной триггер нужен, так как для одного слоя триггеров без обратной связи синтезатор не знает, от кого считать тайминг. Есть задачи, когда этот метод не работает, например когда делал умножитель в поле Галуа - 16 разрядов на входе, 8 на выходе, то даже редуцированную версию этой задачки (6000 строк кода таблицы истинност сгенеренного в Матлабе кода вместо нужных 64 000) синтезатор не переварил. Но например схему нахождения обратного к данному члену задавал таблицей истинности на 256 строк и синтезатор довольно быстро выдавал приемлемый результат. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться