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

Пока у меня есть этот код для 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 = (x1&~y1);
assign b = (x1&x0&~y0);
assign c = (x0&~y1&~y0);
assign xgty = (a|b|c|r);//X>Y

assign d = (~x0&~y0);
assign e = (x0&y0);
assign f = (x1&y1);
assign g = (~x1&~y1);
assign xety = ((d|e)&(f|g));//X=Y

assign h = (~x1&~x0&y0);
assign i = (~x1&y1);
assign j = (~x0&y1&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

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

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


person Daniel    schedule 16.10.2016    source источник


Ответы (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 & ((x[1] > y[1]) | ((x[1] == y[1]) & (x[0] > y[0]))));
  assign xlty = xltyin | (~xgtyin & ((x[1] < y[1]) | ((x[1] == y[1]) & (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-битный компаратор, использующий двухбитовые компараторы, можно обобщить следующим образом.

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 по адресу https://www.edaplayground.com/x/2fbr Форма волны для небольшого тестового стенда также доступна по адресу https://www.edaplayground.com/w/x/27X

person Prashant    schedule 17.10.2016