Реализация 2n-разрядного компаратора с использованием каскадных 2-разрядных компараторов

#logic #verilog #digital-logic

#Логические #verilog #цифровая логика

Вопрос:

Пока у меня есть этот код для 2-разрядного компаратора.

 module twobitcomparator(xgtyin,xety,xltyin,x1,x0,y1,y0,xgty,xety,xlty);
//I/O
output xgty, xety, xlty; //xgty - x>y, xlty - x<y, xety - x=y
input x1, x0, y1, y0, xgtyin, xetyin, xltyin;

//specify circuit behavior
assign r = (xgyin);
assign s = (xlyin);
assign t = (xetyin);//not sure if I need an xetyin

assign a = (x1amp;~y1);
assign b = (x1amp;x0amp;~y0);
assign c = (x0amp;~y1amp;~y0);
assign xgty = (a|b|c|r);//X>Y

assign d = (~x0amp;~y0);
assign e = (x0amp;y0);
assign f = (x1amp;y1);
assign g = (~x1amp;~y1);
assign xety = ((d|e)amp;(f|g));//X=Y

assign h = (~x1amp;~x0amp;y0);
assign i = (~x1amp;y1);
assign j = (~x0amp;y1amp;y0);
assign xlty = (h|i|j|s);//X<Y

endmodule
 

Хорошо ли это выглядит? Я написал для него тестовый стенд и посмотрел на волну, и результаты были правильными для входных данных, но я не уверен, что это самый эффективный способ.

Что касается каскадирования, я знаю, что результат компаратора с наивысшим битом (если это неравенство) просто нужно будет отправить через остальные компараторы, и это будет конечный результат. Если они равны, то мне просто нужно найти компаратор с наивысшим битом, где есть неравенство, и это должно быть каскадировано, как я уже упоминал.

Я застрял на том, чтобы заставить их работать каскадно, я очень новичок в Verilog и понятия не имею, как мне перенести результат каждого компаратора в следующий. Вот моя попытка.

 module ncompare#( parameter n = 2)(input [2*n-1:0] xgyin, xlyin,
input [2*n-1:0] x1, x0, y1, y0,
output [2*n-1:0] xgy, xey, xly,
output xqyout);
wire xqyin;
assign xqyin = 1'b0;

twobitcomparator s1(.xgyin(xgyin[xqyin]), .xlyin(xlyin[xqyin]),
.x1(x1[2*n-1]), .x0(x0[2*n-2]), .y1(y1[2*n-1]), .y0(y0[2*n-2]),
.xgy(xgy[ripple0]), .xey(xey[ripple1]), .xly(xly[ripple2]));

twobitcomparator s0(.xgyin(xgyin[ripple0]), .xlyin(xlyin[ripple2]),
.x1(x1[1]), .x0(x0[0]), .y1(y1[1]), .y0(y0[0]),
.xgy(xgy[ripple3]), .xey(xey[ripple4]), .xly(xly[ripple5]));

endmodule
 

Я думаю, мне нужно использовать оператор generate, так как мне нужно заставить его работать для любого параметра n, но я понятия не имею, как использовать generate, поскольку все примеры, которые я рассмотрел, имеют только один вывод, а у меня их три (которые также являются входами следующего компаратора! Ага!)

Спасибо за любую помощь!

Ответ №1:

2-разрядный модуль компаратора может быть переписан как

 module twobitcomparator(xgtyin,xltyin,x,y,xgty,xlty,xety);

  output xgty, xety, xlty;          
  input  xgtyin, xltyin;
  input [1:0] x,y; 

  assign xgty = xgtyin | (~xltyin amp; ((x[1] > y[1]) | ((x[1] == y[1]) amp; (x[0] > y[0]))));
  assign xlty = xltyin | (~xgtyin amp; ((x[1] < y[1]) | ((x[1] == y[1]) amp; (x[0] < y[0]))));

  assign xety = ~(xlty | xgty);

endmodule
 

Я обработал двухбитовый ввод как шину вместо того, чтобы рассматривать их как отдельные биты (Verilog позволяет вам это делать). Я урезал многочисленные промежуточные результаты, которые присутствовали в вашем коде. Это упрощает понимание кода, поскольку вам не нужно отслеживать все эти временные провода.

Затем я смоделировал этот модуль с помощью Icarus Verilog на EDA Playground. Ссылка здесь https://www.edaplayground.com/x/5KRL

Четырехразрядный компаратор, который использует эти два битовых компаратора, может быть записан следующим образом.

 module fourbitcomparator(xgtyin,xltyin,x,y,xgty,xlty,xety);
  output xgty, xety, xlty;          
  input  xgtyin, xltyin;
  input [3:0] x,y; 

  wire xgty_1,xlty_1,xety_1;

  twobitcomparator u_1 (
    .xgtyin(xgtyin),
    .xltyin(xltyin),
    .x(x[3:2]),
    .y(y[3:2]),
    .xgty(xgty_1),
    .xlty(xlty_1),
    .xety(xety_1)
  );

  twobitcomparator u_0 (
    .xgtyin(xgty_1),
    .xltyin(xlty_1),
    .x(x[1:0]),
    .y(y[1:0]),
    .xgty(xgty),
    .xlty(xlty),
    .xety(xety)
  );

endmodule
 

Наконец, 2n-разрядный компаратор, использующий twobitcomparators, можно обобщить следующим образом

 module twoN_bitcomparator #(
  parameter N = 2
)(
  input xgtyin,
  input xltyin,
  input [(2*N-1):0]x,
  input [(2*N-1):0]y,
  output xgty,
  output xlty,
  output xety
);

  wire [N:0] xgty_w,xlty_w,xety_w;

  assign xgty_w[N] = xgtyin;
  assign xlty_w[N] = xltyin;

  generate
    genvar i;
    for (i=0;i<=(N-1);i=i 1)
      begin:TWOBITGEN
        twobitcomparator u_1 (
          .xgtyin(xgty_w[i 1]),
          .xltyin(xlty_w[i 1]),
          .x(x[(2*i 1) : (2*i)]),
          .y(y[(2*i 1) : (2*i)]),
          .xgty(xgty_w[i]),
          .xlty(xlty_w[i]),
          .xety(xety_w[i])
        );
      end
  endgenerate

  assign xgty = xgty_w[0];
  assign xlty = xlty_w[0];
  assign xety = xety_w[0];

endmodule
 

Моделирование этого обобщенного модуля также доступно на EDA playground по адресу https://www.edaplayground.com/x/2fbr
Форма сигнала для небольшого тестового стенда также доступна по адресу https://www.edaplayground.com/w/x/27X