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

Задача для начинающего плисовода

Задача такая. Есть вектор (N downto 0) неочень длинный, скажем Nmax=10-12 . Каждый такт клока вектор может принимать новое значение. Как за 1 такт подсчитать количество "единиц" ну или "нулей", кому что приятней, в векторе?

При этом N-1 раз написать "+" неинтересно, так как на высокой частоте работать будет плохо. А нужно 300-400МГц.

Или баян? Похожую тему видел, но там длинный вектор 64 бита.

Изменено пользователем crono

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


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

Задача такая. Есть вектор (N downto 0) неочень длинный, скажем Nmax=10-12 . Каждый такт клока вектор может принимать новое значение. Как за 1 такт подсчитать количество "единиц" ну или "нулей", кому что приятней, в векторе?

Ну например так как описано у Шевкопляса

post-51111-1354557260_thumb.jpg

Но насчет 300МГц, я не уверен

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


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

Ну например так как описано у Шевкопляса

Громоздко. Не будет быстро работать.

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


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

Если хотите более-менее быстро, то надо учитывать архитектурные особенности ПЛИС. К примеру, с 4-входовым LUT это будет одно, а с 8-входовым ALM - совсем другое.

Вы в каком ПЛИСе собираетесь эту задачу решать?

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


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

Если хотите более-менее быстро, то надо учитывать архитектурные особенности ПЛИС. К примеру, с 4-входовым LUT это будет одно, а с 8-входовым ALM - совсем другое.

Вы в каком ПЛИСе собираетесь эту задачу решать?

Я думаю, задача одинаково решится и для вертакса и для циклона. Ну, предположим Virtex-6. Архитектуру альтеровских микросхем я знаю хуже.

 

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


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

Громоздко. Не будет быстро работать.

Делал несколько лет назад чуть иначе. За базу взял ту же пару "2И"+"2ИЛИ", но всего на 4 разряда. поставил 2 штуки и сумматор. Вышло, насколько помню, меньше по ЛЭ.

Советовал как точку старта

 

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


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

Делаем 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 битного выхода.

Изменено пользователем Vacik

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


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

Делаем ROM на 10 или 12 разрядов, данные забиваем по адресам:

т.е. при обращении к памяти, на выходе будет нужное значение.

Да, а при том, что на Virtex-6 память можно сгенерировать в формате 4096x4 потребуется всего 1 блок RAM. И не требуется использование логики и быстродействие максимальное. К сожалению, для более длинных векторов решение уже не на столько изящное.

Изменено пользователем crono

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


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

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

 

Все зависит от начального условия (РАЗМЕРНОСТЬ) и требований по быстродействию.

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


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

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

 

Все зависит от начального условия (РАЗМЕРНОСТЬ) и требований по быстродействию.

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

Изменено пользователем crono

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


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

Хорошо бы начинающему, как Вы изволили выразиться, "плисоводу" научиться пользоваться открытыми источниками:

 

http://www.altera.com/literature/manual/cookbook.zip

 

там

/cookbook/arithmetic/thirtysix_six_comp.v

 

 

 

Кстати, Александр77, а Вы сами читали, что делает устройство из книги Шевкопляса? По-моему "ртутный столбик" с высотой в количество единиц - это совсем не то, что требуется. Т.е. после него конечно можно поставить приоритетный шифратор (что, кстати, тоже отдельная задача при требованиях к быстродействию), и получить искомое, но смысл такого решения не очевиден.

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


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

Вы сами читали, что делает устройство из книги Шевкопляса? По-моему "ртутный столбик" с высотой в количество единиц - это совсем не то, что требуется.

Да Вы правы в том, что я поторопился с советом. Но устройство из книгя я делал для определения числа исправных\неисправных устройств, прям как Вы и описали: сортировщик+ шифратор. Правда требований исполнения за такт не было.

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


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

Привету клубу изобретателей им. Артамонова!

 

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

Мне кажется, что для абсолютного большинства задач этот способ будет оптимальным, как по скорости работы, так и по времени разработки. Так как современные ПЛИС и работа синтезатора для них это очень сильное колдунство и методики оптимальные для "рассыпухи" там часто не работают.

Если хочется выше частоту, то добавляем на выходе триггеров и он сам сделает конвеер.

 

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 строк и синтезатор довольно быстро выдавал приемлемый результат.

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


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

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

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

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

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

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

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

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

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

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