Verilog-код для определения выхода на основе приоритета - PullRequest
0 голосов
/ 11 декабря 2018

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

module demux0(
input clock,
input reset,
input [43:0]in,
output reg [43:0]out0,
output reg [43:0]out1
);

always @(posedge clock)
    begin
        if(reset)
            begin
                out0<=0;
                out1<=0;
            end
        else if(in[3:0]==4'b0000 && in[13:4]==10'b0000000001) //so nested if else to gain the priority
            begin
                out1<=in; //so the packet with the highest priority goes to the output
                if(in[3:0]==4'b0000 && in[13:4]==10'b0000000010) //check the second priority packet
                    begin
                        out1<=in;
                        if(in[3:0]==4'b0000 && in[13:4]==10'b0000000100)
                            begin
                                out1<=in;
                                if(in[3:0]==4'b0000 && in[13:4]==10'b0000001000)
                                    begin
                                        out1<=in;
                                    end
                            end
                    end
            end
        else
            begin
                out0<=in;
            end
    end
endmodule

Итак, вот демультиплексор, который выбирает вывод 1, если входные биты в [3: 0] и в [13: 4] совпадают, иначе вывод 0выбран.Но проблема с этим кодом состоит в том, что кольцо синхронизировано, поэтому, если за один такт я получу свой пакет с наивысшим приоритетом, который составляет 10'b0000000001, и после 3 тактов я получу свой второй по приоритету пакет, который здесь равен 10'b0000000010, тогда мойВложенный, если еще цикл не собирается выполняться.Может кто-нибудь сказать мне, как мне это сделать?

1 Ответ

0 голосов
/ 14 декабря 2018

Я думаю, что вы можете изменить код следующим образом:

always(posedge clock)
  if (reset) begin
    out0 <= 0;
    out1 <= 0;
  end
  else
    if ({in[3:0], in[13:4]} == 14'b0000_0000000001)
      out1<=in;
    else if ({in[3:0], in[13:4]} == 14'b0000_0000000010)
      out1<=in;
    else if ({in[3:0], in[13:4]} == 14'b0000_0000000100)
      out1<=in;
    else if ({in[3:0], in[13:4]} == 14'b0000_0000001000)
      out1<=in;
    else
      out0<=in;

или заменить, если / иначе, на регистр

always(posedge clock)
  if (reset) begin
    out0 <= 0;
    out1 <= 0;
  end
  else
    case ({in[3:0], in[13:4]})
      14'b0000_0000000001: out1<=in;
      14'b0000_0000000010: out1<=in;
      14'b0000_0000000100: out1<=in;
      14'b0000_0000001000: out1<=in;
      default: out0<=in;
    enscase
...