5 votos

Generar puerta con un parametrizadas número de entradas

Estoy tratando de generar un multi-puerta de entrada para que las entradas se pueden seleccionar cuando el diseño se elabora.

Permítanme darles un ejemplo que (con suerte) de hacer esto más claro:

module selectable_xor(input [7:0] in, output out);

parameter [7:0] SELECT = 8'b10010100;

// this should be generated for the default value of SELECT:
assign out = in[7] ^ in[4] ^ in[2]

endmodule

Así, out debe ser la salida de una puerta XOR que tiene los bits de in como datos de entrada para que el bit correspondiente en SELECT está configurado.

Estoy intentando algo como la siguiente:

generate
  genvar gen_i;
  assign out = 1'b0;

  for (gen_i = 0; gen_i < 8; gen_i = gen_i + 1)
    if (SELECT[gen_i])
      assign out = out ^ in[gen_i];
endgenerate

Pero esto produce valores no definidos por la out de la señal.

Hay una buena manera de generar una puerta con un número variable de entradas en Verilog?

PS: Sobre el caso de uso: estoy tratando de implementar un LFSR para que el polinomio es un parámetro.

Edit: El consenso parece ser que me debe utilizar la siguiente expresión equivalente y la confianza que el sintetizador para optimizarlo para el circuito que quiero:

assign out = ^(in & SELECT);

Aunque me hacen confiar en que cualquier sintetizador decente va a ser capaz de hacer esto, todavía me gustaría saber si hay una manera en Verilog que en realidad el código de este circuito de mí mismo.

Considere la posibilidad de que, en lugar de la XOR-puerta de arriba, yo quería código de una puerta. La expresión equivalente es:

assign out = |(in & SELECT);

Ok, eso es prácticamente el mismo que para el XOR-gate. Para una Y la puerta, sin embargo, la expresión es diferente:

assign out = &(in | ~SELECT);

Mi punto es que para cada tipo de puerta, voy a tener que venir para arriba con una diferente expresión equivalente. Prefiero tener una forma general en el código de una puerta para que las entradas pueden ser parametrizadas porque entonces puedo utilizar la misma técnica para cualquier tipo de puerta.

Edit 2: Ya que mi recompensa expira mañana, voy a editar esta pregunta una vez más para que lo golpee. Este es un comentario que he dejado para explicar lo que quiero que espero sea más visible en la cuestión del cuerpo:

Lo que yo quiero no tiene nada que ver con los recursos físicos. Cuando hablo acerca de "puertas", me refiero a la Verilog concepto. Quiero ser capaz de definir una puerta con entradas en función de algún parámetro. Más específicamente, me quiero esta puerta para tener in[i] como una entrada fib SELECT[i] está configurado. Yo no quiero una expresión equivalente que puede ser optimizado para la puerta que yo quiero. Como he dicho antes, esta expresión equivalente podría como bien ser implementado como 8 Y puertas y 8 entradas XOR-puerta porque eso es lo que realmente está codificado. Espero que esto te aclare las cosas :-)

5voto

jns Puntos 449

Trate de

assign out = ^(in & parameter);

El y selecciona los bits que son 1 en el parámetro y, a continuación, ^ se XOR de todos ellos juntos. Los bits que están a 0 en el parámetro será ignorado.

2voto

Rob Lachlan Puntos 7880

Si he entendido bien su pregunta, creo que el siguiente módulo hace lo que quiere. Usted puede simplemente especificar la puerta de su operador (^,&,|, etc) y nada más. Además de que sólo la deseada asignaciones se generan (que yo creo que lo que están buscando).

`timescale 1 ns / 1 ps

module selectable_gate(input [7:0] in, output out);

parameter [7:0] SELECT = 8'b10010100;

function integer count_ones;
  input [7:0] v;
  integer ret;
  integer i;
  begin
    ret = 0;
    for(i=0;i<8;i=i+1) begin
      if (v[i]) begin
        ret = ret+1;
      end
    end
    count_ones = ret;
  end
endfunction

function integer nth_one;
  input integer n;
  input [7:0] v;
  integer i,ret,cnt;
  begin
    ret = -1;
    cnt = 0;
    for(i=0;i<8;i=i+1) begin
      if (v[i]) begin
        if (cnt == n) begin
          ret = i;
        end
        cnt = cnt+1;
      end
    end    
    nth_one = ret;
  end
endfunction

localparam integer w = count_ones(SELECT);
wire [w-1:0] y;

generate
  genvar i;
  for(i=0 ; i<w ; i=i+1) begin
    assign y[i] = in[nth_one(i,SELECT)];
  end
endgenerate

assign out = ^y; // specify gate here (e.g. ^y, &y, |y, etc)

endmodule;  

El anterior módulo para el valor predeterminado SELECT = 8'b10010100 debe terminar generado como:

assign y[0] = in[2];
assign y[1] = in[4];
assign y[2] = in[7];
assign out  = ^y;

Que es lo mismo, xor(in[2],in[4],in[7]).

Desde genvars siempre se desenrolla como constantes dentro de la genera, el truco es encontrar constantes que permiten las condiciones adecuadas para que la generan, y el uso de funciones para cualquier variable temporal de la manipulación necesaria para calcular.

1voto

rmstmppr Puntos 18

El siguiente es equivalente a lo que quiero:

assign out = ^(in & SELECT);

Y me di cuenta de que Xilinx ISE sintetiza esta en un 3-entrada XOR-gate para el valor predeterminado de SELECT que es exactamente lo que quiero.

Sin embargo, dado que este bien podría ser sintetizado en 8 Y puertas y uno de 8 entradas XOR-gate, todavía estoy muy interesado en otras respuestas. Me gustaría tener una forma de este código en Verilog en lugar de tener que depender de la herramienta de síntesis.

0voto

Peter Green Puntos 1888
generate
  genvar gen_i;
  assign out = 1'b0;

  for (gen_i = 0; gen_i < 8; gen_i = gen_i + 1)
    if (SELECT[gen_i])
      assign out = out ^ in[gen_i];
endgenerate

El problema con este código es que tiene varios asignar declaraciones va a salir. Creo que el siguiente debería funcionar.

wire [8:0] tmp;
generate
  genvar gen_i;
  assign tmp[0] = 1'b0;

  for (gen_i = 0; gen_i < 8; gen_i = gen_i + 1)
    if (SELECT[gen_i])
      assign tmp[i+1] = temp[i] ^ in[gen_i];
    else
      assign tmp[i+1] = temp[i]
endgenerate
assign out = tmp[8]

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X