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

 
 
 
Reply to this topicStart new topic
> TimeQuest, вопросы новичка
Sprite
сообщение May 31 2018, 13:32
Сообщение #1


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

Группа: Участник
Сообщений: 159
Регистрация: 11-05-08
Пользователь №: 37 414



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

Изучаю 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.
Заранее спасибо!
Go to the top of the page
 
+Quote Post
_Anatoliy
сообщение Jun 1 2018, 04:01
Сообщение #2


Утомлённый солнцем
******

Группа: Свой
Сообщений: 2 603
Регистрация: 15-07-06
Из: г.Донецк
Пользователь №: 18 832



Цитата(Sprite @ May 31 2018, 16:32) *

У вас частоты не кратные, надо бы зафальспасить переходы в этих доменах. Ну и о синхронизаторах не забывать.
Go to the top of the page
 
+Quote Post
Flip-fl0p
сообщение Jun 1 2018, 05:45
Сообщение #3


В поисках себя...
****

Группа: Свой
Сообщений: 657
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140



Цитата(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
Go to the top of the page
 
+Quote Post
Sprite
сообщение Jun 1 2018, 10:13
Сообщение #4


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

Группа: Участник
Сообщений: 159
Регистрация: 11-05-08
Пользователь №: 37 414



_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 нужно задавать в констрейнах?
Go to the top of the page
 
+Quote Post
Flip-fl0p
сообщение Jun 1 2018, 10:15
Сообщение #5


В поисках себя...
****

Группа: Свой
Сообщений: 657
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140



Цитата(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
Go to the top of the page
 
+Quote Post
Sprite
сообщение Jun 4 2018, 09:12
Сообщение #6


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

Группа: Участник
Сообщений: 159
Регистрация: 11-05-08
Пользователь №: 37 414



Спасибо, ознакомлюсь!
В тестбенче, в зависимости от дефайна, включаются или не включаются в проект некоторые блоки, в частности pll, но файл констрейна один, поэтому при комментировании дефайна и компиляции проекта в квартусе выскакивают несколько десятков варнингов касательно настроек pll, которых при компиляции проекта фактически нет. В связи с этим вопрос: можно ли использовать дефайны в макросе? Или можно ли в зависимости от дефайна подключать соответствующий файл констрейна?
Go to the top of the page
 
+Quote Post

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

 


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


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