Вивадо отправить сообщение, в то время как bistreaming, Может кто-нибудь помочь мне понять это? - PullRequest
0 голосов
/ 13 мая 2019

У меня проблема с бистримом.Проект заключается в создании часов с рабочим циклом 1: 2.Нет проблем во время синтеза и реализации.Я попробовал несколько способов решить это.Но они не работали хорошо.

module clock_div(clk, clk_out);
input clk;
output reg clk_out;

integer count1, count2;
reg clk_div;

always@(posedge clk)
begin
    count1 <= count1 + 1;
    if(count1 == 16666667)
    begin
        count1 <= 0;
        clk_div <= ~clk_div;
    end
end


always@(clk_div)
begin
    count2 <= count2 + 1;
    if(count2 == 1)
    begin
        clk_out <= ~clk_out;
    end
    else if(count2 == 3)
    begin
        count2 <= 0;
        clk_out <= ~clk_out;
    end
end
endmodule

сообщение, которое дал вивадо, выглядит следующим образом

    [DRC 23-20] Rule violation (LUTLP-1) Combinatorial Loop - 231 LUT 
    cells form a combinatorial loop. 
    This can create a race condition. 
    Timing analysis may not be accurate. 
    The preferred resolution is to modify the design to remove 
    combinatorial logic loops. 
    To allow bitstream creation for designs with combinatorial logic loops 
    (not recommended), use this command: set_property SEVERITY {Warning} 
    [get_drc_checks LUTLP-1]. 
    NOTE: When using the Vivado Runs infrastructure (e.g. launch_runs Tcl 
    command), add this command to a .tcl file and add that file as a pre- 
    hook for write_bitstream step for the implementation run. 
    clk_out_reg_i_3, clk_out_reg_i_4, clk_out_reg_i_5, clk_out_reg_i_7, 
    clk_out_reg_i_8, clk_out_reg_i_10, clk_out_reg_i_11, clk_out_reg_i_12, 
    clk_out_reg_i_13, clk_out_reg_i_14, clk_out_reg_i_15, 
    clk_out_reg_i_16, clk_out_reg_i_17, clk_out_reg_i_20, clk_out_reg_i_21 
    (the first 15 of 231 listed).

Буду признателен, если кто-нибудь сможет мне помочь.

1 Ответ

0 голосов
/ 13 мая 2019

Это неправильно:

always@(clk_div) // <<== WRONG!!!! 
begin
    count2 <= count2 + 1;
    if(count2 == 1)
    begin
        clk_out <= ~clk_out;
    end
    else if(count2 == 3)
    begin
        count2 <= 0;
        clk_out <= ~clk_out;
    end
end

Вы используете неполный список чувствительности. Это дает несоответствие между моделированием и синтезом. Для всего кода, который вы хотите синтезировать, используйте полный список чувствительности или еще проще: always@( * )

Если вы используете это в разделе выше, вы обнаружите, что ваша симуляция больше не работает. Это попадет в бесконечный цикл. Это именно тот комбинаторный цикл, на который жалуется инструмент.

Чтобы решить эту проблему, вы должны поместить весь код в верхнюю часть:

always@(posedge clk)
begin
    count1 <= count1 + 1;
    if(count1 == 16666667)
    begin
        count1 <= 0;
        // Here you should make your 2:1 clock(s!) 
        // I leave that as an exercise to you
    end
end

Проблема:
При делении на 16666667 вы получите не 2: 1, а 33333334: 1. Если вы не хотели 2: 1 часов между clk_div и clk_out, но clk_div не выходит. В этом случае сделайте оба clk_div и clk_out в отмеченном выше разделе

...