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

SergeyF

Свой
  • Постов

    345
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные SergeyF


  1. Можно так:

    wire [31:0] q;

    assign q[31:18] = data1[13:0];

    ...

    Или так:

    reg [31:0] q;

    always @(*)

    begin

    q[31:18] = data1[13:0];

    ...

    end

     

    Еще проще так:

    wire [31:0] q;

    assign q={data1,addr,data2};

    Или так:

    reg [31:0] q;

    always @(*) q={data1,addr,data2};

     

    Мультиплексировать оператором case.

     

  2. Если я не снес в гневе Q10, посмотрю, так как это очень интересно.

    Либо они накосячили в синтезе (это уже перебор), либо скорректировали временные модели (что довольно странно для вполне зрелого семейства).

     

  3. Задача далеко за рамками обычного промышленного синтеза.

    Без учета архитектуры ячейки и интерконнекта получить результаты немногим лучше 100MHz трудно.

    Ну это уже не смешно. Извините, Вы то, что я выше написал, читали?

     

    Повторюсь:

    QII 9.1, Таймквест, медленная модель, 85С. На любом Cyclone III градации 6 и 7, что я пробовал, укладывается в 125МГц. Код с разбрасыванием 8 бит из 64 по входам дерева сумматоров приводить не буду - это тривиально. Он ненамного быстрее того, что я привел. Самое быстрое, что я получил на нем - 159МГц.

     

    Это не значит, что нельзя сделать лучше - просто дальше нет интереса идти. И никаких LogicLock, архитектурно зависимых примитивов и т.д.. Чем и хороша Altera по сравнению с некоторыми другими производителями. :)

     

    По поводу идей:

    Четырехвходовые LUT на первом уровне как раз очень подходят. В отличие от предлагаемых Вами трехвходовых, они уменьшают глубину дерева сумматоров на один уровень и сами обрабатывают 4 бита в один слой логики, без переносов, которые, хоть и быстрые, но вносят задержку. Замечу, что синтезатор все синтезирует как написано без всяких примитивов - на первом уровне под каждую группу из 4 бит по 3 LUT, а далее складываем 16 (в случае с разбросом 8 бит - 14) таких сумм на 4 уровнях сумматоров. Кстати, если не разбрасывать, он очень четко делает первый уровень в нормальном режиме, а все следующие с цепями переноса.

  4. Так Вы проверяете на C6, а автор просил на С8.  :)

    Вроде как сначала были неопровергнутые сомнения, что получится и на быстрой градации. :) На 6 и 7 градации получается. На EP3C5 даже на 8 градации модификация с разбросом 8 бит из 64-х по входам переноса в дереве сумматоров укладывается в 125МГц. Можно и дальше поколдовать с архитектурой и попробовать выжать на больших микросхемах. Но разница в стоимости между 7 и 8 градацией меня в данном случае не мотивирует. :)

     

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

  5. Судя по Вашим оценкам экспертов, если и будет на 125МГц работать, то с натягом, сильным, и ресурсов это как-то много займет. А мне как-то не нравится, когда с натягом работает. Я спокоен только когда 1,5 кратный запас :biggrin: .

    Вам же дали ссылки. Первая ссылка немного о другом, там поиск лидирующей единицы, а вторая как раз в тему. Там много вариантов.

    alexPec, уважаемый des00 был как всегда точен, тем было несколько, ищутся легко, вот пара на вскидку:

    Сумма единиц

    Есть ли стандартная функция

    Я из интереса проделал аналогичный эксперимент с CycloneIII. На медленной модели при 85С получилась частота 143,5МГц. По-моему, достаточный запас. И сама схема занимает всего 119 логических элементов (не учитывая входные регистры, без которых не посчитать тактовую частоту).

    module cnt64(clk,rst,din,cnt);
    
    input clk,rst;
    input  [63:0] din;
    output reg [6:0] cnt;
    
    reg [63:0] dreg;
    reg [6:0] comb_cnt;
    
    wire [2:0] s[15:0];
    reg [3:0] s0[7:0];
    reg [4:0] s1[3:0];
    reg [5:0] s2[1:0];
    
    //ones in four bits
    function [2:0] cnt8;
    input [3:0] din;
    integer i;
    begin
    	cnt8=0;
    	for(i=0; i<=3; i=i+1) if (din[i]) cnt8=cnt8+1;
    end
    endfunction
    
    //registers
    always @(posedge clk or negedge rst) begin
    	if (!rst) 
    	begin
    		cnt<=0; dreg<=0;
    	end
    	else 
    	begin
    		cnt<=comb_cnt; dreg<=din;
    	end
    end
    
    //adder tree
    always @(*)
    begin
    	//first level
    	s0[0]=s[0]+s[1]; s0[1]=s[2]+s[3]; s0[2]=s[4]+s[5]; s0[3]=s[6]+s[7];
    	s0[4]=s[8]+s[9]; s0[5]=s[10]+s[11]; s0[6]=s[12]+s[13]; s0[7]=s[14]+s[15];
    	//second level
    	s1[0]=s0[0]+s0[1]; s1[1]=s0[2]+s0[3]; s1[2]=s0[4]+s0[5]; s1[3]=s0[6]+s0[7];
    	//third level
    	s2[0]=s1[0]+s1[1]; s2[1]=s1[2]+s1[3];
    	//fourth level
    	comb_cnt=s2[0]+s2[1];
    end
    
    //preadders
    genvar j;
    generate
    	for(j=0; j<=15; j=j+1) 
    	begin : os
    		assign s[j]=cnt8(dreg[j*4+:4]);
    	end
    endgenerate
    
    endmodule
    

    P.S. При включении Fitter effort = Standard получается 156МГц, а при задействовании входных переносов в дереве сумматоров (как предложено в указанной выше теме) и избавления, таким образом, от одного сумматора первого уровня, комбинаторика получается еще на 7 элементов меньше и частота поднимается до 159МГц. Можно и дальше оптимизировать и искать варианты, но требования и так выполняются с запасом.

  6. Как будет верно?

    Для однобитной переменной, конечно, без разницы, как. IMHO, ptr1=~ptr1 как-то понятнее, так как в случае с if Вы присваиваете однобитной переменной 32-х разрядное целое число. Оно обрезается до 1 бита. В обоих случаях получается 0-1-0-.... Я при беглом просмотре кода подумал, что и ptr1, и ptr2 многоразрядные. Там, естественно, получается по разному. Кстати, в плане читаемости не стоило так называть два указателя с разной разрядностью и объявлять их в разных местах.

     

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

     

    Как определить способ реализации памяти?

    Посмотреть отчет компилятора или в навигаторе проекта в иерархии.

     

    Вы делаете два буфера, которые пишете/читаете пинг-понгом. Один, насколько понимаю, выводите на шину системы на кристалле как avalon slave. Вам правильно посоветовали запустить мегавизард и настроить RAM, dual-port. В данном модуле останется только адресация и создание экземпляра модуля памяти.

     

    Но так как сейчас у Вас описана асинхронная память, а в StratixII это сделать не получится, то логику управления адресами придется переработать на чтение/запись памяти с синхронными входами.

     

  7. По крайней мере, результат работы в обоих случаях одинаков.

    В смысле результат одинаков? Без модификации ptr1 и с ней? И он правильный? И объем проекта тоже одинаков? Буфера ложатся в блочную память или реализуются в регистрах?

    По ptr1 - да, перепутал с ptr2. :rolleyes:

    Если я хочу что-то положить в блочную память, я делаю мастером модуль памяти. :)

  8. Сорри, пример оказался рабочим.

    Жестко Вы с буферами. Они же не влезут сами в блоки памяти. А по времени компиляции, думается, он в первом случае выкидывал весь Ваш декодер (так как указатель не менялся) и компилировал проект системы на кристалле, а во втором старательно рассовывал ~30 тысяч триггеров по кристаллу в дополнение к этому.

     

    И еще я на всякий случай хотел уточнить. Вот это:

    //ptr1 <= ~ptr1;

    //if (ptr1==1) ptr1<=0; else ptr1<=1;

    Это же разные вещи...

  9. Стоит для начала разобраться с примерами на основе NiosII. На всякий случай уточню - а как Вы без процессора собираетесь TCP/IP стек поднимать? Или у Вас в системе уже процессорное ядро есть?

  10. а 4в1 это два, а не три слоя %) Хотя некоторые синтезаторы считают по другому %)

    Интересно, это у каких синтезаторов все так плохо?

     

    А 32 в 1 - это пять слоев! А по-проще - никак?

    А если каждый N объединить с входным сигналом, а потом всех их объединить по И с применением цепей каскадирования (а в Циклоне их, кажется, уже нет :( ) - то будет 2 (два) слоя.

    Ну в какой-то степени настройка Restructure Multiplexers дает возможность поиграть с ними. Но не радикально. А в цепи каскадирования в FLEX/ACEX, помнится, задержка была порядка задержки на одном элементе, так что это ничего не даст. :) Поможет ALM в Stratix, там как раз 4 в 1 вроде бы в один ALM влезает. :)

  11. Вообще-то это играет роль. Не вдаваясь в то, как работает PLL, скажу, что Quartus это контролирует при моделировании. Посмотрите повнимательнее. В Вашем же проекте при подаче 50МГц начиная примерно со 100нс на выходе появляется нормальный сигнал 100МГц. До этого - X.

  12. Ну вот опять :) Вот тема про нахождение старшего значащего бита. IMHO, простой путь добиться разумного соотношения быстродействия/объема - факторизовать схему на модули, аналогичные приведенному топикстартером.

     

    А мультиплексоры в базисе ПЛИС это все же не самая эффективная с точки зрения быстродействия функция (т.е. стремиться выделить мультиплексоры при описании схемы - не всегда лучший путь при ручной оптимизации). Грубо говоря - 2 в 1 - и вот уже один слой логики в ПЛИС с четырехвходовой таблицей перекодировки.

     

  13. во-во, уже 2 темы точно было, про LVDS и про PLL, сильно различаются документы. посмотрел последний даташит - там от раздела 1 страница осталась, типа "квартус сам за всем следит, в нем и копайтесь"

    Точно, а в документации на Квартус в главе 5 приводят примеры и пишут : For more detailed information about each I/O rule, refer to the appropriate device handbook. :smile3046:

     

  14. Если используете CIII, то в описании сказано, что нужно для стандартов 3,0V и 3,3V иметь одну разделительную площадку между DCLK и прочими I/O для минимизации шумов (корпус QFP). Quartus всегда проверяет это ограничение.

    Кстати, интересно. Это в какой версии документации и Quartus?

     

    Я просмотрел документацию на CycloneIII и в конце раздела 6 I/O Features в списке изменений нашел только одно упоминание от 2008 года о внесении в документацию раздела DCLK Pad Placement Guidelines. В текущей версии этого раздела таких ограничений нет.

     

    Попробовал - в корпусе TQFP144 первый попавшийся проект лег нормально как с входом, так и с выходом на ножке 11, как в стандарте 2.5В, так и 3.3В в этом банке. Это в QII 9.1.

     

  15. "Error: Cannot place I/O pin sdram_dq[8] with I/O standard 3.3-V LVTTL in pin location 11 -- possible switch coupling with I/O pin epcs_dclk in pin location 12."

    можно это как-нибудь обойти? epcs_dclk используется только при конфигурации.

    Может, подойдет настройка для снятия ограничения на расположение рядом с дифф. линиями - I/O Maximum Toggle Rate? Поставить 0 МГц.

     

     

  16. Дааа.... более сырой версии QII я не припомню. Про установку я не говорю, заливка рабочей области логотипом - это мелочи, придирка эстета. То, что русские комментарии вообще не дает вводить - может, это и правильно. :)

     

    Открыл проект в NiosII SBT for Eclipse - при компиляции пошли ошибки запуска процессов, которые были и раньше под Windows 7.

     

    Решил перегенерировать/перекомпилировать проект аппаратуры - SOPC Builder ругнулся на устаревший тип компонента PLL. Удалил (зря, теперь его в списке компонент нет, даже устаревших, без манипуляций ручками не вернуть). Поставил компонент Avalon ALTPLL - при генерации вылетают предупреждения по поводу несоответствия портов модуля TCL описанию, после генерации тащит на верхний уровень системы порты clkena, о которых его никто не просил...

     

    Дальше не пошел. Жду SP1. Ужас.

     

  17. Очередной раз нуждаюсь в помощи! Мне нужно создать асинхронную ПМК (память микрокоманд), так что бы пришел адрес - вышла нужная микроинструкция, пишу на VHDL, работаю в Quartus. Знаю что в MegaWizard есть синхронные памяти, но они мну не подходят. и с исходниками тяжело разбираться. Есть *.hex файлы, я не знаю как их подключать и производить чтение, помогите пожалуйста разобраться, дайте пример или ссылку на литературу, что бы почитать, я сам не нашел. За ранее благодарю!!!

    Разумнее адаптировать структуру микропрограммного устройства под архитектуру ПЛИС. Сделайте регистр адреса на встроенных в блок памяти триггерах, а выход памяти в асинхронном режиме. Будет асинхронная ПМК. Для этого запускаем мастер ROM, 1-port, настраиваем соответствующим образом регистры и указываем файл инициализации .hex.

     

     

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

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

     

    И не подходит это для учебных проектов! Чтобы было нагляднее: если студенту-двигателисту дадут учебный проект, в котором бензиновый двигатель будет заправляться дизельным топливом - это будет правильно методически?

     

    P.S. Поправка : начиная со Stratix III, а не Stratix II

  18. да-да. "вычислительная" действительно лишнее слово, но термин "управляющая система" обычно употребляют для управления каким-либо физ.объектами (станками самолётами), а более важно, что есть некоторое качество обслуживания - вот например сетевой коммутатор вряд ли будет ассоциироваться с термином "управляющая система", хотя они фактически братья близнецы с управляющей системой в плане организации процессов.

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

     

  19. понятно объяснился?

    Ну тогда логично. Как вариант - система потоковой обработки данных и управляющая система, без слова "вычислительная". Всплывает еще термин "reactive system", но у него тоже нет достойного перевода - "реагирующая система" звучит плохо.

  20. Может быть, сделать достаточно общепринятую кальку - система с управлением последовательностью команд/с управлением потоком данных?

    Вроде бы так так обычно переводится dataflow/control flow.

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

     

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