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

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

Всем добрый день, я новичок в 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

Изменено пользователем Uncle_igor
Добавление сворачивания к блокам кода

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


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

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

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

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


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

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

Цитата

 

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

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

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

 

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


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

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

3 minutes ago, Uncle_igor said:

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

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

 

Удачи! Rob.

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


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

53 minutes ago, Uncle_igor said:

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

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

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


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

7 минут назад, blackfin сказал:

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

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

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

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

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

 

Удачи! Rob.

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

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

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


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

1 hour ago, Uncle_igor said:

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

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

32 minutes ago, Uncle_igor said:

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

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

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


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

1 час назад, Nick_K сказал:

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

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

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

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...