Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Первые пробы в TimeQuest
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Reanimator++
Собственно задача измерение времени и частоты.
Нужно посчитать число импульсов высокой частоты проходящей во временные ворота.
Высокую частоту делаю в PLL.

Сделал пробный проект с таким счетчиком:
Код
module piezo_test (
    input clk,
    input clk_en,
    input reset,
    output [47:0]cntout
    );

wire en_sync;

    
enable_sync enable_sync_inst
    (
    .enable_in (clk_en),
    .clk (clk),
    .reset (reset),
    .enable_out (en_sync)
    );
    
sync_counter_en #(2) sync_counter_en_inst
    (
    .clk (clk),
    .reset (reset),
    .enable_sync (en_sync),
    .cnt (cntout[1:0])
    );

sync_counter #(46) sync_counter_inst
    (
    .clk (cntout[1]),
    .reset (reset),
    .cnt (cntout[47:2])
    );
    
        
endmodule

// enable synchronizer with counter and asynchronous RESET
module enable_sync
    (
    input enable_in,
    input clk,
    input reset,
    output enable_out
    );
        
    reg [2:0] reclocker;

    always @ (posedge clk, posedge reset)
    begin
        if (reset)
        begin
            reclocker <= 0;
        end
        else
        begin
            reclocker <= {reclocker[1], reclocker[0], enable_in};
        end    

    end

    assign enable_out = reclocker[2];

endmodule

// synchrous counter with synchrous enable
module sync_counter_en #(parameter WIDTH = 8)
    (
    input clk,
    input reset,
    input enable_sync,
    output reg [WIDTH-1:0] cnt
    );

    always @ (posedge clk, posedge reset)
    begin
        if (reset)
            cnt <= 0;
        else if (enable_sync)
            cnt <= cnt + 1'b1;
    end
        
endmodule

// synchrous counter
module sync_counter #(parameter WIDTH = 8)
    (
    input clk,
    input reset,
    output reg [WIDTH-1:0] cnt
    );

    always @ (posedge clk, posedge reset)
    begin
        if (reset)
            cnt <= 0;
        else
            cnt <= cnt + 1'b1;
    end
        
endmodule

По порядку идут реклокер, делитель на 4, длинный счетчик. Разбивал на куски чтобы поднять частоту заполнения.
Констрейны сделал вот такие:
Код
create_clock -period 2.500 -name hifreq [get_ports {clk}]

create_generated_clock \
-divide_by 4 \
-source [get_ports {clk}] \
-name clkdiv \
[get_registers {sync_counter_en_inst|cnt[1]}]

TimeQuest показал почти 700МГц по входу и 150 для поделенной частоты.

Таких счетчиков мне надо 150 штук )
Когда я их размножил то таймквест выдал ограничение по частоте заполнения 160 МГц вместо 700 как было для одного счетчика. Частоту эту он положил конечно на глобальный клок но тем не менее.
Ограничение было по параметру Minimum Pulse Width.
Как я понимаю это связано с тем что он хочет довести клок синхронно до всех счетчиков, а даже у глобальной цепи есть свои задержки.
В результате дизайн был аккуратно слеплен могучей кучкой по центру плисины.

Вопросы:
1) Как объяснить квартусу что мне не нужна синхронизация всех счетчиков вместе? А надо только чтобы регистры каждого счетчика получали свои клоки синхронно (т.е. были расположены рядом), а их задержки относительно друг друга мне неинтересны.

2) Где прочитать подробное толкование всех времянок рассчитываемых TimeQuest-ом? С временными диаграммами и подробным описанием.
Спасибо!
KPiter
Цитата(Reanimator++ @ Jun 5 2012, 13:51) *
Как я понимаю это связано с тем что он хочет довести клок синхронно до всех счетчиков,

ИМХО он хочет довести клок синхронно до всех триггеров. Ему не важно счетчики это или еще что-то.

Цитата
TimeQuest показал почти 700МГц по входу и 150 для поделенной частоты.

Развести (copy-past) остальные 149 вручную. без гарантии от Квартуса
Kuzmi4
2 Reanimator++
Судя по тому что вы написали - у вас один generated_clock и куча счётчиков которые на нём висят. В первом же случае у вас был только 1 из 150 счётчиков. Как вариант - вам нужно сделать 150 generated_clock-ов и прописать что они асинхронные между собой - тогда у вас будет как раз ваш первый случай.
Однако не совсем ясно как проходил этот ваш процесс "размножения" и зачем нужны (то есть ф-циональность) эти 150 счётчиков (на счёт последнего - это больше касательно связи их между собой) , потому могу ошибаться в предыдущем "телепатировании".
Reanimator++
Пока телепатия работала разобрался самостоятельно )
Проблемы было две. Квартус заменил группу реклокеров-синхронизаторов в куче счетчиков на мегафункцию altshift_tap, которая реализуется на блоке памяти. Соответственно к этому блоку потянулись связи со всего дизайна и частота снизилась.
Вторая проблема была в том что у меня все клоки асинхронны и я задал их в констрейнах с ключем -exclusive, как описано в п.3 гайда от des00 - http://embedders.org/content/timequest-dly...i-kak-vas-mnogo
Почему-то это не сработало и квартус пытался оптимизировать передачу сигналов между клоками считая их синхронными.
Помогло задание -set_false_path между клоками туда и обратно как по п.2 гайда des00.

Что же касается синхронности подвода клока от PLL к счетчикам то по всей видимости эта синхронность осталась, но способностей глобального клокового дерева хватило на более чем 400 МГц, а большую частоту пускать внутрь квартус не дает, так что это тоже отпало.
А насчет ручного размножения copy/paste можно более подробную информацию? Хотя бы где почитать. Спасибо!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.