Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: TimeQuest, вопросы новичка
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Языки проектирования на ПЛИС (FPGA)
Sprite
Доброго всем времени суток!

Изучаю TimeQuest, есть несколько вопросов.
Есть модуль:
Код
module adc
(
    input    clk,
    input    clk_32MHz,
    input     ena,
    input    [7:0]data,

    output     reg alarm
);
    reg        [1:0]    state;
    parameter s0=0, s1=1, s2=2, s3=3;
    reg     [7:0]    data_ch1[2:0];
    reg        [1:0]     clk_32MHz_reg;
    initial
    begin
        state = 0;
        data_ch1[0] = 8'd0;
        data_ch1[1] = 8'd0;
        data_ch1[2] = 8'd0;
        clk_32MHz_reg = 2'b00;
        alarm = 0;
    end
    
    wire clk_32MHz_risingEdge;
    wire clk_32MHz_fallingEdge;

    //---------------------------------
    // Select front and fall moment
    //---------------------------------
    always @(posedge clk)
    begin
        clk_32MHz_reg <= {clk_32MHz_reg[0], clk_32MHz};
    end
    assign clk_32MHz_risingEdge = (clk_32MHz_reg == 2'b01);
    assign clk_32MHz_fallingEdge = (clk_32MHz_reg == 2'b10);
        
    //----------------------------------------
    always @ (posedge clk)
    begin
        if (ena)
        begin
            case (state)
                //============================    
                //Channel process
                //============================
                s0:
                begin
                    state <= clk_32MHz_risingEdge? s1:s0;
                end
                //----------------------------
                s1:
                begin
                    if (clk_32MHz_fallingEdge)
                    begin
                        data_ch1[0] <= data;
                        state <= s2;
                    end
                    else
                        state <= s1;
                end
                //----------------------------
                s2:    
                begin    
                    if ((data_ch1[0] > data_ch1[1]) && (data_ch1[1] > data_ch1[2]))
                        alarm = 1;
                    else
                        alarm = 0;
                    state <= s3;
                end
                //----------------------------
                s3:    
                begin    
                    data_ch1[2] <= data_ch1[1];
                    data_ch1[1] <= data_ch1[0];
                    state <= s0;
                end                                
                //----------------------------
                default:
                begin
                    alarm <= 0;
                    state <= s0;
                end
                //----------------------------
            endcase
        end
        else
        begin
            alarm <= 0;
            state <= s0;
        end
    end
    //----------------------------------------        
endmodule


И есть pll с входной частотой 36МГц (clk) и двумя выходными частотами: 216 (с0) и 32МГц (с1). В общем виде это выглядит вот так:


В двух словах: сигнал с выхода c1 pll (32MГц) поступает на детектор фронта/спада сигнала модуля, тактовая частота которого 216Мгц.
Написал вот такой констрейн:
Код
derive_clock_uncertainty
create_clock -name clk -period 36.1MHz [get_ports {clk}]
create_generated_clock -name clk_216MHz -source [get_ports {clk}] -multiply_by 6 [get_nets {pll1|altpll_component|auto_generated|wire_pll1_clk[0]}]
create_generated_clock -name clk_32MHz -source [get_ports {clk}] -divide_by 17 -multiply_by 15 [get_nets {pll1|altpll_component|auto_generated|wire_pll1_clk[1]}]

После компиляции TimeQuest выдает слаки:


Прошу знающих людей объяснить на что ругается TimeQuest.
Заранее спасибо!
_Anatoliy
Цитата(Sprite @ May 31 2018, 16:32) *

У вас частоты не кратные, надо бы зафальспасить переходы в этих доменах. Ну и о синхронизаторах не забывать.
Flip-fl0p
Цитата(Sprite @ May 31 2018, 16:32) *
Прошу знающих людей объяснить на что ругается TimeQuest.
Заранее спасибо!

TimeQuest ругается на временные нарушения при передачи сигнала с1 из домена 32 Мгц в регистр clk_32MHz_reg(0) в домене 216 Мгц. В частности происходит нарушения по времени удержания.
Как говорил уважаемый _Anatoliy исключите эти пути из анализа TimeQuest, и передавайте сигнал в другой домен через синхронизатор.
Я привык задавать пути, которые не нужно анализировать, путем команды:
Код
set_clock_groups -exclusive -group [get_clocks {clk1}] \
                            -group [get_clocks {clk2}] \
                            -group [get_clocks {clk3}] \
                            -group [get_clocks {clk4}]

где каждая группа асинхронные клоки.
Вот хорошая ссылка, много интересного там: http://www.alterawiki.com/wiki/Timing_Constraints
Sprite
_Anatoliy, Flip-fl0p спасибо за советы!
Поставил синхронизатор между выходом pll c1 и входом clk_32MHz и прописал false_path:
Код
set_false_path -from [get_clocks {clk_adc}] -to [get_clocks {clk_216MHz}]

Предупреждения ушли. Но в списке Unconstreined Ports стоит несколько (все кроме клоков) сигналов. Насколько я понимаю нужно задать параметры set_input_delay и set_output_delay. Но какие значения выставлять не понятно. Например, в этом документе указаны значения 3,75, но откуда берется эта цифра не объясняется. Какие параметры помимо create_clock нужно задавать в констрейнах?
Flip-fl0p
Цитата(Sprite @ Jun 1 2018, 13:13) *
_Anatoliy, Flip-fl0p спасибо за советы!
Поставил синхронизатор между выходом pll c1 и входом clk_32MHz и прописал false_path:
Код
set_false_path -from [get_clocks {clk_adc}] -to [get_clocks {clk_216MHz}]

Предупреждения ушли. Но в списке Unconstreined Ports стоит несколько (все кроме клоков) сигналов. Насколько я понимаю нужно задать параметры set_input_delay и set_output_delay. Но какие значения выставлять не понятно. Например, в этом документе указаны значения 3,75, но откуда берется эта цифра не объясняется. Какие параметры помимо create_clock нужно задавать в констрейнах?

Ознакомьтесь с серией статей : http://caxapa.ru/thumbs/442268/TimeQuest_for_dummies.pdf
Sprite
Спасибо, ознакомлюсь!
В тестбенче, в зависимости от дефайна, включаются или не включаются в проект некоторые блоки, в частности pll, но файл констрейна один, поэтому при комментировании дефайна и компиляции проекта в квартусе выскакивают несколько десятков варнингов касательно настроек pll, которых при компиляции проекта фактически нет. В связи с этим вопрос: можно ли использовать дефайны в макросе? Или можно ли в зависимости от дефайна подключать соответствующий файл констрейна?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.