реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Первые пробы в TimeQuest, Асинхронный дизайн
Reanimator++
сообщение Jun 5 2012, 09:51
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 399
Регистрация: 1-01-06
Из: Волгоград
Пользователь №: 12 763



Собственно задача измерение времени и частоты.
Нужно посчитать число импульсов высокой частоты проходящей во временные ворота.
Высокую частоту делаю в 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-ом? С временными диаграммами и подробным описанием.
Спасибо!
Go to the top of the page
 
+Quote Post
KPiter
сообщение Jun 8 2012, 10:12
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 22-09-06
Из: NN
Пользователь №: 20 592



Цитата(Reanimator++ @ Jun 5 2012, 13:51) *
Как я понимаю это связано с тем что он хочет довести клок синхронно до всех счетчиков,

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

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

Развести (copy-past) остальные 149 вручную. без гарантии от Квартуса
Go to the top of the page
 
+Quote Post
Kuzmi4
сообщение Jun 8 2012, 15:41
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



2 Reanimator++
Судя по тому что вы написали - у вас один generated_clock и куча счётчиков которые на нём висят. В первом же случае у вас был только 1 из 150 счётчиков. Как вариант - вам нужно сделать 150 generated_clock-ов и прописать что они асинхронные между собой - тогда у вас будет как раз ваш первый случай.
Однако не совсем ясно как проходил этот ваш процесс "размножения" и зачем нужны (то есть ф-циональность) эти 150 счётчиков (на счёт последнего - это больше касательно связи их между собой) , потому могу ошибаться в предыдущем "телепатировании".
Go to the top of the page
 
+Quote Post
Reanimator++
сообщение Jun 9 2012, 13:00
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 399
Регистрация: 1-01-06
Из: Волгоград
Пользователь №: 12 763



Пока телепатия работала разобрался самостоятельно )
Проблемы было две. Квартус заменил группу реклокеров-синхронизаторов в куче счетчиков на мегафункцию altshift_tap, которая реализуется на блоке памяти. Соответственно к этому блоку потянулись связи со всего дизайна и частота снизилась.
Вторая проблема была в том что у меня все клоки асинхронны и я задал их в констрейнах с ключем -exclusive, как описано в п.3 гайда от des00 - http://embedders.org/content/timequest-dly...i-kak-vas-mnogo
Почему-то это не сработало и квартус пытался оптимизировать передачу сигналов между клоками считая их синхронными.
Помогло задание -set_false_path между клоками туда и обратно как по п.2 гайда des00.

Что же касается синхронности подвода клока от PLL к счетчикам то по всей видимости эта синхронность осталась, но способностей глобального клокового дерева хватило на более чем 400 МГц, а большую частоту пускать внутрь квартус не дает, так что это тоже отпало.
А насчет ручного размножения copy/paste можно более подробную информацию? Хотя бы где почитать. Спасибо!
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 23:44
Рейтинг@Mail.ru


Страница сгенерированна за 0.014 секунд с 7
ELECTRONIX ©2004-2016