【问题标题】:Implementing a 2n-bit comparator using cascaded 2-bit comparators使用级联 2 位比较器实现 2n 位比较器
【发布时间】:2017-02-25 13:30:35
【问题描述】:

到目前为止,我有这个用于 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

我认为我需要使用 generate 语句,因为我需要使它适用于任何参数 n 但我不知道如何使用 generate 因为我看过的所有示例都只有一个输出并且我有三个(即也是下一个比较器的输入!啊!)

感谢您的所有帮助!

【问题讨论】:

    标签: logic verilog digital-logic


    【解决方案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 允许您这样做)。我已经删除了代码中存在的众多中间结果。这使代码更易于理解,因为您不必跟踪所有这些临时线路。

    然后我在 EDA Playground 上使用 Icarus Verilog 模拟了这个模块。链接在这里 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
    

    最后一个使用twobitcomparators的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 Playground https://www.edaplayground.com/x/2fbr 上找到 小型测试平台的波形也可在https://www.edaplayground.com/w/x/27X

    获得

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-24
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 2013-12-29
      相关资源
      最近更新 更多