Jump to content
    

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

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

Если решать немного другую задачу, то можно найти немного другое решение. В моем случае нужно было за 1 такт посчитать количество единиц. Задержка между появлением события и появлением результата влияла на общую производительность. (Я не про латентность). Способ, про который написал Vacik с высокой вероятность будет наилучшим, так как требует только один элемент. Про его универсальность никто не говорит.

Share this post


Link to post
Share on other sites

Какое другое решение? Какая "другая задача"?

за 1 такт посчитать количество единиц Nmax=10-12 . нужно 300-400МГц.

Приведенный выше код считает количество единиц дл яN=16за 1 такт на частоте 530. Зачем сюда еще память?

 

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

 

Но если вы предпочитаете вместо "estimated frequency" пользоваться терминами "с выской вероятностью будет" и "не будет быстро работать", то это конечно ваше дело.

Share this post


Link to post
Share on other sites

Но если вы предпочитаете вместо "estimated frequency" пользоваться терминами "с выской вероятностью будет" и "не будет быстро работать", то это конечно ваше дело.

Я предпочитаю, когда речь идет о частоте от 350МГц и выше иметь четкое представление, во что выливается моя схема, а не верить умному синтезатору с его колдовством и шаманством, который пишут те-же индусы люди. А критерий правильности решения один: результат. В случае с памятью схема работает на 420 МГц в железе. Мне достаточно. "С высокой вероятностью" имелось в виду, что память работает, а работают ли все остальные варианты мне неважно, я не исследовательскую работу пишу, а задачу решаю.

Чем не понравилась фраза "не будет быстро работать", не пойму. Она на основе опыта (тоже очень скромного).

Edited by crono

Share this post


Link to post
Share on other sites

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

 

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

 

Даже если нарисовать все в схемном редакторе, синтезатор все равно перемолотит ее так, как считает нужным и оптимальным, в соответствии с заданными пользователем настройками и в соответствии с имеющимися ресурсами на данной ПЛИС. А уж о том, что творит разводчик лучше не думать.

 

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

Share this post


Link to post
Share on other sites

Четкого представления во что выливается схема на ПЛИС к сожалению уже не может быть.

Я Вас умоляю! Это кто как пишет, и что оставляет на откуп синтезатора. В быстродействующих узлах схемы я синтезатору оставляю написать только логическую функцию для лута и то не всегда. И ему просто деваться некуда, он делает именно то, что я хочу.

А на счет анженеров... Слово "колдовство" должно быть им, по моему скромному мнению, классово-чуждо. Потому как Октябрьская социалистическая революция напрочь подорвала основы этому буржуазному явлению! Я свой шаманский бубен давно выкинул спрятал, ибо чужд:)

Edited by crono

Share this post


Link to post
Share on other sites

Скромный опыт такой скромный. И четкий.

 

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

 

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

 

Share this post


Link to post
Share on other sites

Fat Robot Четкое понимание кода да. И отдать на откуп автоматике, то, что должна делать автоматика и проверить ее. Или P&R тоже ручками делаете? Plan Ahead для ламеров, которые просто не понимают, как работает схемотехника старой школы.

 

crono Ради интереса - выложите свою реализацию на ROM памяти? Просто сравнить, на каком варианте будет обеспечиваться бОльшая частота после P&R.

Share this post


Link to post
Share on other sites

Ради интереса - выложите свою реализацию на ROM памяти? Просто сравнить, на каком варианте будет обеспечиваться бОльшая частота после P&R.

хм... Не совсем понимаю что выложить. Есть один блок DPRAM. На адрес подается входная шина, выход DPRAM (защелкнутый в самом блоке) и есть результат. И больше ничего. Его надо выложить? Или сами вставите в свою схему библиотечный элемент?

 

Plan Ahead для ламеров, которые просто не понимают, как работает схемотехника старой школы.

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

Share this post


Link to post
Share on other sites

Про план ахед шутка. Шутка в том, что довольно странно пытаться сделать руками что то начальном этапе, не замечая при этом, что вся последующая процедура делается в автоматическом режиме. То есть писать руками элементы - и-или-не (как там советовали выше по книге), не замечая, что синтезатор соберет лутами так, как посчитает нужным. Я не говорю о том, что надо писать все в матлабе и не лазить на RTL уровень. Надо лазить, смотреть и что то менять руками. Но многие вещи куда лучше (по всем параметрам) отдать автоматическому алгоритму.

 

Я вам предлагаю сравнить 2 реализации. Мне действительно интересно, какой вариант работает быстрее. И какие подводные камни у моего решения.

Минусы решения с памятью - выдача целого блока памяти на одну простую операцию и более низкая частота. Но оба "недостатки" работают только в крайних режимах, если будет нужна частота 500 или памяти будет впритык. Так что может ваше решение и лучше. Выложите пожалуйста свой вариант (сорец и если были настройки для синтеза), который работал в железе, сравним.

 

Fat Robot, вы кстати открывали те сорцы, которые предлагали? Там есть ведь волшебная штука. Он состоит из 1 сумматора и 9 загаоднчых блоков. Знаете что внутри этих блоков?

always @(data) begin
    case (data)
      0: sum=0;
      1: sum=1;
      2: sum=1;
      3: sum=2;
.....
      63: sum=6;
      default: sum=0;
    endcase

 

Внутри этих блоков созданная скриптом таблица истинности. Да да, та сама таблица истинности, которая просто говорит синтезатору " у меня есть вот такой вход, вот такой выход, колдуй мне схему". О чем я и писал выше.

Share this post


Link to post
Share on other sites

Выложите пожалуйста свой вариант (сорец и если были настройки для синтеза), который работал в железе, сравним.

Ну если так настойчиво...

Поясните, как настройки синтеза могут повлиять на сгенерированный блок памяти и подключаемый только на этапе P&R?

test_rom.zip

Share this post


Link to post
Share on other sites

Muscat,

 

1. Если Вы посмотрите чуть глубже, то окажется, что при использовании указанного семейства (Altera Stratix-II), путь максимальной длины для блока проходит сквозь 4 6-ти входовых LUT. RTL oписание оптимизировано под использование этих 6-ти входовых LUTов, которые есть у Str-II. Посмотрите на досуге, какой длины получается критический путь в случае Вашего описания с "прямым" подсчетом количества "1". То, что для Вас Verilog-описание ассоциируется с волшебством и колдовством, - повод насторожиться.

 

2. Насчет P&R я Вам ничего не скажу. FPGA не является для меня целевой техноголией. Для P&R в компании, в которой я работаю, есть backend-инженеры.

 

Успехов.

Share this post


Link to post
Share on other sites

Fat Robot,

1) Понятно, что вручную указано разбиение на луты. Но это не отменяет того, что логика минимального блока задается таблицей. То есть "магией" (где там моя настойка на змеях?) Вместо таблицы можно было написать гораздо более короткий скрипт с использованием variable, loop и конвертирования векторов друг в друга. Синтезатор схавает оба варианта. И сделать код портируемым и настраиваемым.

 

2) Мой критикал Path на картинке 3 лута, я посмотрел его до того, как написать первое сообщение

114a4d82f4309a0ac08fcc3fd5639231.png

По коду ваш критикал path тоже 3 лута (1 слой из 6ти блоков подсчета +3 блока подсчета + 1 сумматор результатов оных). Если в лоб смотреть на код. Если не верить в деда мороза и в то, что синтезатор действительно колдует со схемой.

Но вот если добавить триггеры на входе и выходе (чтобы узнать частоту) и включить retiming, то для этой схемы синтезатор выдает совершенно фантастические 1700МГц. Очевидным образом это слишком много даже 1 слоя логики. Даже для 4 разрядного счетчика частота меньше.

Надо будет засунуть оба варианта в P&R и посмотреть, кто будет быстрее, посимулить эту схему (есть сомнения в работоспособности).

 

И вам всего доброго.

Share this post


Link to post
Share on other sites

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

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

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

parameter N=12;

reg [N-1:0] input_vector;

reg [3:0] one_output;

reg [3:0] zero_output;

 

int i;

one_output ='h0;zero_output='h0;

 

for(i=0; i<N; i++)

begin

if(input_vector) one_output ++;

else zero_output ++;

end

 

Это два уровня логики - будет работать на 300МHz и выше

Edited by agate

Share this post


Link to post
Share on other sites

Есть задачи, когда этот метод не работает, например когда делал умножитель в поле Галуа - 16 разрядов на входе, 8 на выходе, то даже редуцированную версию этой задачки (6000 строк кода таблицы истинност сгенеренного в Матлабе кода вместо нужных 64 000) синтезатор не переварил.

 

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

Тоже делал такой умножитель, на 170 Mhz (может и больше ) точно работает на cyclone 3, вроде не было проблем. Откуда взялись у вас 6000 строк кода что-то не пойму?

Edited by Gold777

Share this post


Link to post
Share on other sites

agate, тот же алгоритм на VHDL чуть выше, результат синтеза - 3 уровня логики, Симплифай для 6 виртекса, 500МГц. Подскажите, как вы получаете 2 уровня?

 

Gold777 Умножитель в поле Галу был сделан путем генерации кода в Матлабе по неким хитрым матрицам.

Делаось по статье "Low Complexity Bit Parallel Architectures for Polynomial Basis Multiplication over GF(2m)"

То есть на HDL прямо описывается комбинационная логика на всех этих и-или-не этот провод воткнуть сюда.Думаю, вы тоже делали этим путем.

 

Но была попытка решить эту задачу "в лоб". поскольку умножитель есть просто комбинационная схема, то можно сгенерить таблицу истинности. Эта таблица содержала 2^16 строк, что конечно оказалось непосильной задачей для синтезатора. Даже 6000 строк таблицы истинности оказались чрезмерными. А вот 256 строк очень даже.

 

Вы вот как делали блок нахождения обратного к данному члену?

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...