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

TimeQuest, вопросы новичка

Доброго всем времени суток!

 

Изучаю 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). В общем виде это выглядит вот так:

timequest1.png

 

В двух словах: сигнал с выхода 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 выдает слаки:

timequest1_err.png

 

Прошу знающих людей объяснить на что ругается TimeQuest.

Заранее спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У вас частоты не кратные, надо бы зафальспасить переходы в этих доменах. Ну и о синхронизаторах не забывать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Прошу знающих людей объяснить на что ругается 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

_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 нужно задавать в констрейнах?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
_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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, ознакомлюсь!

В тестбенче, в зависимости от дефайна, включаются или не включаются в проект некоторые блоки, в частности pll, но файл констрейна один, поэтому при комментировании дефайна и компиляции проекта в квартусе выскакивают несколько десятков варнингов касательно настроек pll, которых при компиляции проекта фактически нет. В связи с этим вопрос: можно ли использовать дефайны в макросе? Или можно ли в зависимости от дефайна подключать соответствующий файл констрейна?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация