Jump to content

    
Uncle_igor

Mux контроллер со справедливым обслуживанием

Recommended Posts

Всем добрый день, я новичок в FPGA.  В проектах использую Verilog.  Появилась задача сделать mux со справедливым обслуживанием. На входе 3 однобитных (С потенциальным расширением) сигнала, на выходе управляющая (3bit).

На входы в различных комбинациях могут приходить "Запросы". На выходе должен быть сформирована управляющая последовательность для mux и переключаться в соответствии с тем в какой очереди поступили сигналы.

У меня получилось написать вариацию, симуляция проходит предсказуемо, но после синтеза лезут warning о комбинационных петлях. Подскажите пожалуйста как решить эти варнинги и правильный ли вообще подход к решению задачи.

PS Так же я знаю что есть проблема с переполнением счетчика, пока не понимаю как правильно сделать защиту(кроме заведомо большого размера счетчика).

Код модуля:

Скрытый текст

 


`timescale 1ns / 1ps

module mux_control(
    input i_Invite0, i_Invite1, i_Invite2,
    output [2:0] o_Select        
);
   
    reg [7:0] counts [2:0];
    reg [2:0] a=0, b=0, res=0;

    initial begin
        counts[0]=0;
        counts[1]=0;
        counts[2]=0;
    end

    always @(i_Invite0, i_Invite1, i_Invite2) begin
        if (i_Invite0) counts[0]=counts[0]+1;
        else counts[0]=0;
        
        if (i_Invite1) counts[1]=counts[1]+1;
        else counts[1]=0;
        
        if (i_Invite2) counts[2]=counts[2]+1;
        else counts[2]=0;        
        
        if ((counts[0] > counts[1]) || (counts[0] == counts[1])) a=0;
        else a=1;
        
        if ((counts[2] > counts[1]) || (counts[2] == counts[1])) b=2;
        else b=1;
        
        if ((counts[a] > counts[b]) || (counts[a] == counts[b])) res=a+1;
        else res=b+1;
        
        if ({i_Invite0, i_Invite1, i_Invite2} == 0) res=0;
    
    end
    
    assign o_Select = res;

endmodule

testbench:

Скрытый текст

`timescale 1ns / 1ps

module testbench_mux_contorl();
    
    reg clk=1;
    integer count=0;
    reg invite1=0, invite2=0, invite3=0;
    wire [2:0] o_Select;
        
    always begin
        #1 clk=~clk;
        #1 count = count + 1;
      
        case (count)
           
            1:  begin 
                    invite1=0;
                    invite2=1;
                    invite3=0;
                end
            2:  begin 
                    invite1=1;
                    invite2=0;
                    invite3=0;
                    
                end
            3:  begin 
                    invite1=0;
                    invite2=0;
                    invite3=1;
                    
                end
            4:  begin 
                    invite1=1;
                    invite2=1;
                    invite3=1;
                end
            6:  begin 
                    invite1=1;
                    invite2=1;
                    invite3=0;
                end
            8:  begin 
                    invite1=1;
                    invite2=1;
                    invite3=0;
                    
                end
            10:  begin 
                    invite1=1;
                    invite2=0;
                    invite3=1;
                    
                end

            11:  begin 
                    invite1=0;
                    invite2=0;
                    invite3=1;
                    
                end
            12:  begin 
                    invite1=0;
                    invite2=0;
                    invite3=0;
                    
                end
            13:  begin 
                    invite1=1;
                    invite2=1;
                    invite3=1;
                    
                end

        endcase
       
    end
    
    mux_control mux_control(
        .i_Invite0(invite1),
        .i_Invite1(invite2),
        .i_Invite2(invite3),
        .o_Select(o_Select)
    );

endmodule

 

 

Симуляция с ожидаемым результатом:

mux.jpg

Edited by Uncle_igor
Добавление сворачивания к блокам кода

Share this post


Link to post
Share on other sites

Что такое "Мультиплексор со справедливым обслуживанием"? Я знаю только обычный мультиплексор. И у Вас тут сплошная комбинаторика. Никакой клоковой нет, всё работает асинхронно и полюбому не обконстрейнено. Конечно появляется дикая гонка сигналов и на выходе получается сплошная каша. Вы бы хоть обвязку в виде регистров сделали, я не знаю...

Новичёк - оно и видно, но хоть где-то читали про Flip-flop, структуру проекта, тайминг констрейны и вообще как делаются проекты на ПЛИС?

Share this post


Link to post
Share on other sites

Я в разработке совсем недавно, начал читать эту книгу,

Цитата

 

Ошибся в описании, не мультиплексор со справедливым обслуживанием, а контроллер мультиплексоров, который должен управлять мультиплексорами в соответствии с очередью.

С клоком я делал все ок, все работает, там понятно, хотелось попробовать именно асинхронную реализацию.

"Обвязка в виде регистров" - имеется ввиду промежуточные регистры чтобы убрать комбинационную петлю ?

 

Share this post


Link to post
Share on other sites

Приветствую!

3 minutes ago, Uncle_igor said:

С клоком я делал все ок, все работает, там понятно, хотелось попробовать именно асинхронную реализацию.

Асинхронную  реализацию  сделать не получится  так как в чисто комбинаторной схеме  нет сохранения состояния.  Соответственно  вы не можете "накапливать" число запросов, и помнить какие каналы когда обслуживались.  Можно будет лишь  делать арбитраж по тем данным  которые приходят снаружи такой схемы - например  по номеру  канала.   

 

Удачи! Rob.

Share this post


Link to post
Share on other sites
7 минут назад, blackfin сказал:

Это называется Round-Robin Arbiter

Больше спасибо, как раз то что я и пытался изобрести, пойду изучать как это делать правильно, спасибо за подсказку)

50 минут назад, RobFPGA сказал:

Приветствую!

Асинхронную  реализацию  сделать не получится  так как в чисто комбинаторной схеме  нет сохранения состояния.  Соответственно  вы не можете "накапливать" число запросов, и помнить какие каналы когда обслуживались.  Можно будет лишь  делать арбитраж по тем данным  которые приходят снаружи такой схемы - например  по номеру  канала.   

 

Удачи! Rob.

Благодарю за пояснения.

Правильно ли я понимаю, что если в проекте используется логика со сохранением состояния, то нужно использовать синхронную схему?

Share this post


Link to post
Share on other sites
1 hour ago, Uncle_igor said:

"Обвязка в виде регистров" - имеется ввиду промежуточные регистры чтобы убрать комбинационную петлю ?

Не совсем. Я говорил, что для работы схемы понадобится скорее всего какой-то набор регистров снаружи, чтобы поддерживать чёткое состояние, а не городить всё на чистой комбинаторике.

32 minutes ago, Uncle_igor said:

Правильно ли я понимаю, что если в проекте используется логика со сохранением состояния, то нужно использовать синхронную схему?

И да и нет. Опять же, если жля обвязки взять регистры - то сама схема внутри может быть любая. Но если Вы пытаетесь сохранять значения и потом их использовать (как в автоматах Мура) то без элементов памяти не обойтись (флопы или регистры)

Share this post


Link to post
Share on other sites
1 час назад, Nick_K сказал:

Не совсем. Я говорил, что для работы схемы понадобится скорее всего какой-то набор регистров снаружи, чтобы поддерживать чёткое состояние, а не городить всё на чистой комбинаторике.

И да и нет. Опять же, если жля обвязки взять регистры - то сама схема внутри может быть любая. Но если Вы пытаетесь сохранять значения и потом их использовать (как в автоматах Мура) то без элементов памяти не обойтись (флопы или регистры)

Понял, спасибо )

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.