2016-10-16 9 views
0

これまでのところ、このコードは2ビットコンパレータ用です。カスケード接続された2ビットコンパレータを使用した2nビットコンパレータの実装

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に動作させるために必要があるため発生するステートメントを使用する必要があると思うが、私はどのように私は見てきたすべての例は、一つの出力とIを持っているので生成に使用する見当もつかない3つある(これも次のコンパレータの入力です!)

ありがとうございました!

答えて

1

2ビット比較器モジュールは、私が代わりに個々のビット(Verilogのは、あなたがそれを行うことを可能にする)としてそれらを処理するバスとして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 

のように書き換えることができます。あなたのコードに存在する多数の中間結果を整理しました。これにより、これらの一時的な配線をすべて把握する必要がないため、コードを理解しやすくなります。

私はこのモジュールを、EDA PlaygroundのIcarus Verilogを使ってシミュレートしました。リンクはここにあります https://www.edaplayground.com/x/5KRL

これらの2つの比較器を使用するコンパレータは、次のように記述することができます。 https://www.edaplayground.com/x/2fbr 波形で

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の遊び場で利用可能であるような小さなテストベンチでもあるため

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ビット比較器は、一般化することができます入手可能なhttps://www.edaplayground.com/w/x/27X

関連する問題