Многобитовые ворота - PullRequest
0 голосов
/ 03 мая 2020

Я хотел бы знать, как я мог бы go об использовании AND, OR и других вентилей для многобитовых входов. Я пытался построить MUX 2: 1, но я получил эту ошибку:

Expression width 2 does not match width 1 of logic gate array port 1.

Вот код

module mux_21 #(parameter width = 1) (
    input [width-1:0] d0, d1,
    input s,
    output [width-1:0] y
);
    wire [width-1:0] ns, y1, y2;
    not  g1 (ns, s);
    and  g2 (y1, d0, ns);
    and  g3 (y2, d1, s);
    or   g4 (y, y1, y2);
endmodule

1 Ответ

0 голосов
/ 05 мая 2020

Примитивные ворота всегда одноразрядные. Вам необходимо создать экземпляр для каждой комбинации битов.

Самый распространенный способ - сгенерировать для -l oop. Генерация логики c проходит через этапы c, развернутые на этапе разработки компиляции.

genvar gidx;
wire ns;
wire [width-1:0] y1, y2;
not  g1 (ns, s);
generate
  for(gidx=0; gidx<width; gidx=gidx+1) begin : mux
    and  g2 (y1[gidx], d0[gidx], ns );
    and  g3 (y2[gidx], d1[gidx], s );
    or   g4 (y[gidx], y1[gidx], y2[gidx] );
  end
endgenerate

Вы также можете создать диапазон экземпляров. Эта функция существует дольше, чем конструкция генерирования, но используется реже, и я замечаю, что некоторые синтезаторы ее не поддерживают (например, Yosys 0.9 на EDAplayground ).

wire ns;
wire [width-1:0] y1, y2;
not  g1 (ns, s);
and  g2 [width-1:0] (y1, d0, ns);
and  g3 [width-1:0] (y2, d1, s);
or   g4 [width-1:0] (y, y1, y2);
...