4

9 本のワイヤーの配列がある場合、9 本のうち 1 本だけが高い場合に新しいワイヤーを作成する簡単な方法はありますか? 私は私ができることを知っています

wire[8:0] data;
wire exactlyOneActive;
assign exactlyOneActive = (data[0] & !data[1] & !data[2] ...) | 
                          (!data[0] & data[1] & !data[2] ...) |
                          (!data[0] & !data[1] & data[2] ...) |
                          ...etc

でも、うん、そうでしょ?特に、9 本のワイヤーはおそらくある時点で 25 本になるからです。これを行うためのより良い方法はありgenerateますか?それも合成可能でなければなりません。

4

6 に答える 6

6
assign zeroOrOnehot     = ~|(data & (data-1));
assign atLeastOneBitSet = |data;
assign exactlyOneActive = zeroOrOnehot & atLeastOneBitSet;  

よろしく - Cliff Cummings - Verilog & SystemVerilog Guru

于 2012-06-27T22:20:02.800 に答える
4

これはかなり効率的な設計になるはずです。

wire[8:0] data;
wire exactly_one_active;

//Total is log2_ceiling of data bits wide
// Remove binary weighting
wire  [3:0] total = data[8] + data[7] ... + data[0]; 

assign exactly_one_active = (total == 4'b1);
于 2012-06-22T13:23:38.170 に答える
2

私はこのようなものがうまくいくはずだと思います。forループは、次のように、一定のループカウンターがある限り、合成可能です。

#define N 8

wire [N:0] data;

reg [N:0] uniqueActive;

always @(data) begin
   for (i=0 ; i < N; i = i+1 ) begin
      uniqueActive[i] = (data == 1<<i);
   end
end

assign exactlyOneActive = (uniqueActive != 0);
于 2012-06-20T00:56:31.973 に答える
1

他のすべてのソリューションには、O(N ^ 2)ゲートが必要です。次のパターンに注意してください

(a#b#c#d#e#f#g#h) & (a&b # c&d # e&f # g&h) & (a&b&c&d # e&f&g&h)

集約xor、各ペアのxor、4の各グループのxor、8の各グループのxor(図示せず)などをテストすると、O(N log(N))ゲートで正解が得られます。 。(真理値表ジェネレーターでロジックを検証できます)。ただし、Verilogでこれを簡潔に記述する方法はわかりません。

于 2012-06-29T19:36:50.560 に答える
1

これがO(N)ゲートソリューションです

wire[8:0] wires;
wire isOneHot;
wire[8:-1] moreThanOne;
wire[8:-1] atLeastOne;

genvar i;
generate
    for (i=0; i<9; i=i+1) begin :b1
        assign atLeastOne[i] = atLeastOne[i-1] | wires[i];
        assign moreThanOne[i] = moreThanOne[i-1] | atLeastOne[i-1] & wires[i];
    end
    assign isOneHot = atLeastOne[8] & !moreThanOne[8];
endgenerate
于 2012-06-30T16:03:43.760 に答える
-2

ロジックの観点から考えてください。何が必要ですか? 2 本のワイヤがあるとします。1 本が高いかどうかを知りたいとします...それは and ではなく、or ではありません...待って、それは xor です (排他的 or ... どちらか一方ですが、両方ではありません) .

あなたが望むのは:正確にOneActive = data [0] ^ data [1] ^ data [2] ^ ...を割り当てる

おそらく、以下は有効です: data ^ 1b'0 (xor すべてのビットと 1 つのゼロ ビット)

于 2012-06-29T05:32:35.440 に答える