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

 
 
> Первые пробы в 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



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

 


RSS Текстовая версия Сейчас: 3rd July 2025 - 19:52
Рейтинг@Mail.ru


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