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

считаем единички в векторе за один такт

Я бы переписал так

 

MEASUREMENT : PROCESS (nRESET, compared_sig)
variable temp    :integer range 0 to 2047
begin
IF nRESET = '0' THEN
temp := 0;
ELSE
sum: for i in 1 to 2047 loop
  temp := temp + to_integer(compared_sig(i));
end loop sum;
END IF;

amplitude_sig <= temp;

END PROCESS MEASUREMENT;

 

Но что-то я невижу клока?

Может будет правильней так:

MEASUREMENT : PROCESS (clk)
variable temp    :integer range 0 to 2047
begin
IF (clk = '1' and clk'event)  THEN
temp := 0;
sum: for i in 1 to 2047 loop
  temp := temp + to_integer(compared_sig(i));
end loop sum;
END IF;

amplitude_sig <= temp;

END PROCESS MEASUREMENT;

 

Может где и ошибся, но суть помоему понятна. По идее должно считаться за один клок, только какой он должен быть по длительности? Уж не один ли герц? :rolleyes:

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


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

это когда считаешь - один,два,три,четыре,пять,шесть,семь,восемь,девять,десять - только в 10 раз меньше, наверное, еще умноженное на период тактирования, который автора по всей видимости волнует мало :) (и будет оч смешно если порядок этого периода он оценивает как десятки МГц)

 

а вообще нескромный вопрос: вам такое чудовище для чего (в плане прикладной задачи)?

 

 

Поясню:

Данные обновляются на каждом фронте 2.048 МГц клока.

А мне нужно оценить амплитуду ошибки (пересчитать эти самые единички) и сравнить с порогом.

 

А задача такая: нужно протестировать канал связи nx64 кбит/с. По теории, для этого заряжают ПСП (2^11)-1, пропускают через канал и считают корреляционную функцию. И еще обычно этим занимаются специализированные микросхемы (у них эта функция как бонус), но та микрушка ,которую поставили мы....в общем работает не так, как хотелось бы.

Битовые ошибки легко отлавливать (хоть и получается небольшая погрешность) , а вот со слипами совсем плохо.

 

Если это канал связи, то данные должны приходить в последовательном коде, следовательно так их можно и считать.

А если нет, то поднять частоту на DCM до сотни мегагерц и по-частям проталкивать через блок памяти.

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


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

Хочу добавить свои пять копеек в эту дискуссию. А что мешает законвеййеризировать процесс? Хлопните всю шину в регистр, поставьте n-разрядные сумматоры и сложите данные по их выходу. Результат суммирования снова в регистры, потом сложили регистры между собой и получили результат. Таких стадий можно сделать достаточно много. Будет несколько "жирнее" по ресурсам чем чисто ассинхронный сумматор, но будет эффективно и разводчик не запарится впихивать эту всю логику в кристалл.

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


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

Хочу добавить свои пять копеек в эту дискуссию. А что мешает законвеййеризировать процесс? Хлопните всю шину в регистр, поставьте n-разрядные сумматоры и сложите данные по их выходу. Результат суммирования снова в регистры, потом сложили регистры между собой и получили результат. Таких стадий можно сделать достаточно много. Будет несколько "жирнее" по ресурсам чем чисто ассинхронный сумматор, но будет эффективно и разводчик не запарится впихивать эту всю логику в кристалл.

 

Все сводится к тому, что так и нужно сделать

спасибо!

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


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

Конвеерно складывать это конечно выход, но что-то тут не то в самом алгоритме... Неужели весь вектор в 2048 бит полностью обновляется за один такт 2.048 МГц? Сам ведь сказал, что шина последовательная (как я понимаю, что-то вроде Е1), значит за один такт измениться значение только одного бита в твоем векторе (вернее 2-х: один "вдвинется", один "выдвинется"). Считать надо последовательно - по мере поступления битов. Кстате все микрухи, которые это делают, так и считают.

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


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

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

 

module test(d, o); // synthesis loop_limit 4000

input [2047:0] d;

output [ 11:0] o;

wire [2047:0] d;

reg [ 11:0] o;

 

integer i;

 

always @(d) begin

o=0;

for (i=0; i<=2047; i=i+1)

if (d==1'b1) o=o+1;

end

 

endmodule

 

синтезится синплифаем на ура, результат занимает 5567 ячеек в циклоне (код был переписан на верилог, т.к. на vhdl не были включены заголовки модуля, а у меня verilog "на кончиках пальцев" и было лень лезть в справочники по vhdl и самому дописывать недостающие куски).

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


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

синтезится синплифаем на ура, результат занимает 5567 ячеек в циклоне (код был переписан на верилог, т.к. на vhdl не были включены заголовки модуля, а у  меня verilog "на кончиках пальцев" и было лень лезть в справочники по vhdl  и самому дописывать недостающие куски).

а задержка от входа до выхода какая?

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


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

синтезится синплифаем на ура, результат занимает 5567 ячеек в циклоне (код был переписан на верилог, т.к. на vhdl не были включены заголовки модуля, а у  меня verilog "на кончиках пальцев" и было лень лезть в справочники по vhdl  и самому дописывать недостающие куски).

а задержка от входа до выхода какая?

 

Для EP1C20F324C6 без оптимизаций (хотя какие здесь могут быть оптимизации? разве что балансировка дерева и оптимизация роутинга) и при запрошенной частоте 10 МГц:

 

Path information for path number 1:

Requested Period: 100.000

= Required time: 100.000

 

- Propagation time: 29.857

= Slack : 70.143

 

Number of logic level(s): 42

Starting point: d[2047:0] / d[1]

Ending point: o[11:0] / o[11]

The start point is clocked by System [rising]

The end point is clocked by System [rising]

 

Total path delay (propagation time + setup) of 29.857 is 20.930(70.1%) logic and 8.927(29.9%) route

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


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

SM на телесистемах как то в качестве примера на AHDL подсчитывал количество единичек в 64-разрядном векторе за один такт. Может это чем-то поможет.

 

http://www.telesys.ru/wwwboards/vhdl/44/messages/11989.shtml

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


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

попробуй код для своей шины переделать

 

.

.

счетчик числа единиц в 32-разрядном слове

.

.

port(D : in std_logic_vector(31 downto 0);

sum : out std_logic_vector(4 downto 0));

 

 

process(D)

variable s:std_logic_vector(4 downto 0);

 

begin

s:="00000";

for i in 0 to 31 loop

if D(i) = '1' then

s:= s+ "00001";

end if;

end loop;

sum <= s;

end process;

 

 

 

 

 

Есть шина compared_sig : std_logic_vector(1 to 2047).

Нужно  посчитать, сколько '1' в этом векторе (ну и присвоить это сигналу  amplitude_sig: integer range 0 to 2047).

Вроде бы просто, но нужно это сделать за один такт.

Вот я написал, но что-то симуляция этого дела уходит "в себя"  :(

MEASUREMENT : PROCESS (nRESET, compared_sig)
begin
IF nRESET = '0' THEN
 amplitude_sig <= 0;
ELSE
 sum: for i in 0 to 2048 loop
    if i = 0 then
       amplitude_sig <= 0;
    elsif (i < 2048) then
       amplitude_sig <= amplitude_sig + to_integer(compared_sig(i));
    else
       exit sum;    
    end if;    
 end loop sum;
END IF;
END PROCESS MEASUREMENT;

 

Какие есть идеи?

Может я что-то не так нарулил? И как тогда надо?

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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