Кодировщик приоритетов Verilog

Опубликовано: 16 Сентября, 2022

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

Например, энкодер 8:3 имеет 8 входных линий и 3 выходные линии, 4:2 энкодер имеет 4 входные линии и 2 выходные линии и так далее.

Кодер с приоритетом 8:3 имеет семь входных линий, т. е. от i0 до i7, и три выходные линии y2, y1 и y0. В 8:3 Priority Encoder i7 имеет самый высокий приоритет, а i0 — самый низкий.

Таблица истинности:

Вход

Выход

en i7 i6 i5 i4 i3 i2 i1 i0 у2 у1 у0
0 Икс Икс Икс Икс Икс Икс Икс Икс г г г
1 0 0 0 0 0 0 0 1 0 0 0
1 0 0 0 0 0 0 1 Икс 0 0 1
1 0 0 0 0 0 1 Икс Икс 0 1 0
1 0 0 0 0 1 Икс Икс Икс 0 1 1
1 0 0 0 1 Икс Икс Икс Икс 1 0 0
1 0 0 1 Икс Икс Икс Икс Икс 1 0 1
1 0 1 Икс Икс Икс Икс Икс Икс 1 1 0
1 1 Икс Икс Икс Икс Икс Икс Икс 1 1 1

Логический символ:

Реализуйте кодировщик приоритетов в коде Verilog:

Большая часть программирования связана с разработкой и дизайном программного обеспечения, но Verilog HDL — это язык описания аппаратного обеспечения, который используется для разработки дизайна электроники. Verilog предоставляет разработчикам возможность разрабатывать устройства на основе различных уровней абстракции, включая: уровень шлюза, поток данных, уровень коммутатора и поведенческое моделирование.

Моделирование поведения:

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

Блок дизайна: моделирование поведения

module priorityencoder_83(en,i,y);
  // declare
  input en;
  input [7:0]i;
  // store and declare output values
  output reg [2:0]y;
  always @(en,i)
  begin
    if(en==1)
      begin
        // priority encoder
        // if condition to chose 
        // output based on priority. 
        if(i[7]==1) y=3"b111;
        else if(i[6]==1) y=3"b110;
        else if(i[5]==1) y=3"b101;
        else if(i[4]==1) y=3"b100;
        else if(i[3]==1) y=3"b011;
        else if(i[2]==1) y=3"b010;
        else if(i[1]==1) y=3"b001;
        else
        y=3"b000;
      end
     // if enable is zero, there is
     // an high impedance value. 
    else y=3"bzzz;
  end
endmodule

Тестовый стенд: поведение

Testbench — это блок моделирования, который используется для предоставления входных данных блоку проектирования. Лучший способ написать Testbench — это иметь хорошее представление о таблице истинности. Как только у вас будет готовая таблица истинности, укажите входные значения внутри тестового стенда.

module tb;
  reg [7:0]i;
  reg en;
  wire [2:0]y;
  
  // instantiate the model: creating 
  // instance for block diagram 
  priorityenoder_83 dut(en,i,y);
  initial
    begin
      // monitor is used to display the information. 
      $monitor("en=%b i=%b y=%b",en,i,y);
      // since en and i are input values, 
      // provide values to en and i. 
      en=1; i=128;#5
      en=1; i=64;#5
      en=1; i=32;#5
      en=1; i=16;#5
      en=1; i=8;#5
      en=1; i=4;#5
      en=1; i=2;#5
      en=1; i=0;#5
      en=0;i=8"bx;#5
      $finish;
    end
endmodule

Выход:

Моделирование потока данных:

В моделировании потока данных мы определяем выходные данные, т. е. net, путем присвоения входных значений, т. е. reg, с использованием назначенных ключевых слов. Чтобы написать моделирование потока данных и моделирование на уровне шлюза, нам нужна логическая схема для формирования соединений.

Вот логическая схема кодера с приоритетом 8:3.

Блок дизайна: поток данных

module priorityenoder83_dataflow(en,i,y);
    // declare port list via input and output
    input en;
    input [7:0]i;
    output [2:0]y;

    // check the logic diagram and assign the outputs
    assign y[2]=i[4] | i[5] | i[6] | i[7] &en;
    assign y[1]=i[2] | i[3] | i[6] | i[7] &en;
    assign y[0]=i[1] | i[3] | i[5] | i[7] &en;

endmodule

Тестовый стенд: поток данных

module tb;
  reg en;
  reg [7:0]i;
  wire [2:0]y;

  // instantiate the model: creating
  // instance for block diagram
  priorityenoder83_dataflow dut(en,i,y);
  initial
    begin
      // monitor is used to display the information.
      $monitor("en=%b i=%b y=%b",en,i,y);
      
      // since en and i are input values,
      // provide values to en and i.
      en=1;i=128;#5
      en=1;i=64;#5
      en=1;i=32;#5
      en=1;i=16;#5
      en=1;i=8;#5
      en=1;i=4;#5
      en=1;i=2;#5
      en=1;i=1;#5
      en=0;i=8"bx;#5
      $finish;
    end
endmodule

Выход:

Моделирование уровня ворот:

В моделировании на уровне вентилей мы используем логические вентили Digital, используемые в цифровой электронике.

Синтаксис:

logicgate object(out,in1,in2);

Пример:

and a1(out,a,b);

Блок дизайна: уровень ворот

module priorityenoder83_gate(en,i,y);
    // declare port list via input and output
    input en;
    input [7:0]i;
    output [2:0]y;

    wire temp1,temp2,temp3; // temp is used to apply 
                            // enable for the or gates
    // check the logic diagram and use 
    // logic gates to compute outputs
    or o1(temp1,i[4],i[5],i[6],i[7]);
    or o2(temp2,i[2],i[3],i[6],i[7]);
    or o3(temp3,i[1],i[3],i[5],i[7]);

    and a1(y[2],temp1,en);
    and a2(y[1],temp2,en);
    and a3(y[0],temp3,en);

endmodule

Тестовый стенд: уровень ворот

module tb;
  reg en;
  reg [7:0]i;
  wire [2:0]y;

  // instantiate the model: creating 
  // instance for block diagram
  priorityenoder83_gate dut(en,i,y);
  initial
    begin
      // monitor is used to display
      // the information.
      $monitor("en=%b i=%b y=%b",en,i,y);
      // since en and i are input values,
      // provide values to en and i.
      en=1;i=128;#5
      en=1;i=64;#5
      en=1;i=32;#5
      en=1;i=16;#5
      en=1;i=8;#5
      en=1;i=4;#5
      en=1;i=2;#5
      en=1;i=1;#5
      en=0;i=8"bx;#5
      $finish;
    end
endmodule

Выход:

Применение приоритетного кодировщика:

  • Роботизированные транспортные средства
  • Системы мониторинга здоровья в больницах