Uncle_igor 0 July 21, 2021 Posted July 21, 2021 (edited) · Report post Всем добрый день, я новичок в 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 Симуляция с ожидаемым результатом: Edited July 21, 2021 by Uncle_igor Добавление сворачивания к блокам кода Quote Share this post Link to post Share on other sites More sharing options...
Nick_K 0 July 21, 2021 Posted July 21, 2021 · Report post Что такое "Мультиплексор со справедливым обслуживанием"? Я знаю только обычный мультиплексор. И у Вас тут сплошная комбинаторика. Никакой клоковой нет, всё работает асинхронно и полюбому не обконстрейнено. Конечно появляется дикая гонка сигналов и на выходе получается сплошная каша. Вы бы хоть обвязку в виде регистров сделали, я не знаю... Новичёк - оно и видно, но хоть где-то читали про Flip-flop, структуру проекта, тайминг констрейны и вообще как делаются проекты на ПЛИС? Quote Share this post Link to post Share on other sites More sharing options...
Uncle_igor 0 July 21, 2021 Posted July 21, 2021 · Report post Я в разработке совсем недавно, начал читать эту книгу, Цитата David Harris, Sarah Harris. «Digital Design and Computer Architecture» Ошибся в описании, не мультиплексор со справедливым обслуживанием, а контроллер мультиплексоров, который должен управлять мультиплексорами в соответствии с очередью. С клоком я делал все ок, все работает, там понятно, хотелось попробовать именно асинхронную реализацию. "Обвязка в виде регистров" - имеется ввиду промежуточные регистры чтобы убрать комбинационную петлю ? Quote Share this post Link to post Share on other sites More sharing options...
RobFPGA 10 July 21, 2021 Posted July 21, 2021 · Report post Приветствую! 3 minutes ago, Uncle_igor said: С клоком я делал все ок, все работает, там понятно, хотелось попробовать именно асинхронную реализацию. Асинхронную реализацию сделать не получится так как в чисто комбинаторной схеме нет сохранения состояния. Соответственно вы не можете "накапливать" число запросов, и помнить какие каналы когда обслуживались. Можно будет лишь делать арбитраж по тем данным которые приходят снаружи такой схемы - например по номеру канала. Удачи! Rob. Quote Share this post Link to post Share on other sites More sharing options...
blackfin 4 July 21, 2021 Posted July 21, 2021 · Report post 53 minutes ago, Uncle_igor said: ... контроллер мультиплексоров ... со справедливым обслуживанием. Это называется Round-Robin Arbiter Quote Share this post Link to post Share on other sites More sharing options...
Uncle_igor 0 July 21, 2021 Posted July 21, 2021 · Report post 7 минут назад, blackfin сказал: Это называется Round-Robin Arbiter Больше спасибо, как раз то что я и пытался изобрести, пойду изучать как это делать правильно, спасибо за подсказку) 50 минут назад, RobFPGA сказал: Приветствую! Асинхронную реализацию сделать не получится так как в чисто комбинаторной схеме нет сохранения состояния. Соответственно вы не можете "накапливать" число запросов, и помнить какие каналы когда обслуживались. Можно будет лишь делать арбитраж по тем данным которые приходят снаружи такой схемы - например по номеру канала. Удачи! Rob. Благодарю за пояснения. Правильно ли я понимаю, что если в проекте используется логика со сохранением состояния, то нужно использовать синхронную схему? Quote Share this post Link to post Share on other sites More sharing options...
Nick_K 0 July 21, 2021 Posted July 21, 2021 · Report post 1 hour ago, Uncle_igor said: "Обвязка в виде регистров" - имеется ввиду промежуточные регистры чтобы убрать комбинационную петлю ? Не совсем. Я говорил, что для работы схемы понадобится скорее всего какой-то набор регистров снаружи, чтобы поддерживать чёткое состояние, а не городить всё на чистой комбинаторике. 32 minutes ago, Uncle_igor said: Правильно ли я понимаю, что если в проекте используется логика со сохранением состояния, то нужно использовать синхронную схему? И да и нет. Опять же, если жля обвязки взять регистры - то сама схема внутри может быть любая. Но если Вы пытаетесь сохранять значения и потом их использовать (как в автоматах Мура) то без элементов памяти не обойтись (флопы или регистры) Quote Share this post Link to post Share on other sites More sharing options...
Uncle_igor 0 July 21, 2021 Posted July 21, 2021 · Report post 1 час назад, Nick_K сказал: Не совсем. Я говорил, что для работы схемы понадобится скорее всего какой-то набор регистров снаружи, чтобы поддерживать чёткое состояние, а не городить всё на чистой комбинаторике. И да и нет. Опять же, если жля обвязки взять регистры - то сама схема внутри может быть любая. Но если Вы пытаетесь сохранять значения и потом их использовать (как в автоматах Мура) то без элементов памяти не обойтись (флопы или регистры) Понял, спасибо ) Quote Share this post Link to post Share on other sites More sharing options...