usando la instrucción generar en verilog

0

Estoy usando anidados para bucles usando el módulo de generación para crear múltiples instancias de submódulos en verilog Esto es para encontrar determinantes 4x4. Generé los submódulos con entradas proporcionadas en consecuencia, pero quiero almacenar las salidas en el registro matricial en serie desde (1 a 6), ya que ejecuta 6 iteraciones en tempu [1: 6] y tempd [1: 6], pero generar no permite hazlo He intentado todas las posibilidades

    module det_4x4_v2(    
         input signed [15:0] a11,a12,a13,a14,a21,a22,a23,a24,a31,a32,a33,a34,a41,a42,a43,a44,
         output signed [15:0] out
        );       
     wire signed [15:0]  v1[1:4];   
     wire signed [15:0]  v2[1:4];
     wire signed [15:0]  v3[1:4];
     wire signed [15:0]  v4[1:4];   
     wire signed [15:0] tempu[1:6];
     wire signed [15:0] tempd[1:6];

    assign v1[1]=a11;
    assign v1[2]=a12;
    assign v1[3]=a13;
    assign v1[4]=a14;

    assign v2[1]=a21;
    assign v2[2]=a22;
    assign v2[3]=a23;
    assign v2[4]=a24;

    assign v3[1]=a31;
    assign v3[2]=a32;
    assign v3[3]=a33;
    assign v3[4]=a34;

    assign v4[1]=a41;
    assign v4[2]=a42;
    assign v4[3]=a43;
    assign v4[4]=a44;

    genvar i,j,count;

    generate

       //localparam count=0;

      //for(count=1;count<7;count=count+1)

    for(j=1;j<4;j=j+1) 

    begin:gen_det2x2_sub1

          //localparam count=0;

     for(i=j+1;i<5;i=i+1)

         begin:gen_det2x2_sub2

         det_2x2 m1(v1[j],v1[i],v2[j],v2[i],tempu[count+1]);
         det_2x2 m2(v3[j],v3[i],v4[j],v4[i],tempd[count+1]);

         end
    end      
    endgenerate      




assign out = ((tempu[1]*tempd[6])-(tempu[2]*tempd[5])+(tempu[3]*tempd[4])+
              (tempu[4]*tempd[3])-(tempu[5]*tempd[2])+(tempu[6]*tempd[1]));  
                            // above equation want to implement-------(1)

    endmodule


/*    det_2x2 m1(v1[1],v1[2],v2[1],v2[2],tempu[1]);  //finally want to generate 
      det_2x2 m1(v1[1],v1[3],v2[1],v2[3],tempu[2]);   // these modules
      det_2x2 m1(v1[1],v1[4],v2[1],v2[4],tempu[3]);
      det_2x2 m1(v1[2],v1[3],v2[2],v2[3],tempu[4]);
      det_2x2 m1(v1[2],v1[4],v2[2],v2[4],tempu[5]);
      det_2x2 m1(v1[3],v1[4],v2[3],v2[4],tempu[6]);

      det_2x2 m2(v3[j],v3[i],v4[j],v4[i],tempd[count]); // same way as above m1 
                                                                   module


*/    

module det_2x2( 
 input signed [15:0] a11,a12,a21,a22 ,
 output  signed [15:0] out
    );

 wire signed [15:0] temp;

 assign temp = (a11*a22)-(a12*a21);

 assign out = temp ;    

endmodule

el signo de cada término en la ecuación 1 depende de (-1) potencia (i + j) en cada iteración y debería multiplicarme con 'tempu o tempd' en la iteración particular.

puedo implementar estos manualmente (instatia manualmente y escribir la ecuación (1) manualmente) pero es difícil cuando se hace para matrices de orden superior donde para (8x8) se necesitan 70 módulos para la creación de instancias.

por favor, ayúdame a asignar los registros temp, tempd indexados continuamente para los bucles anidados anteriores.

gracias

    
pregunta chago

1 respuesta

0

No se puede usar una variable 'generada' 'libre', por lo que la única solución que puedo encontrar es expresar el índice de tempu y tempd en términos de i y j. Así es como tu j, yo voy:

[j,i] = [1,2] [1,3], [1,4]   required Index:  1, 2, 3
        [2,3] [2,4]                           4, 5
        [3,4]                                 6

Lo mejor que se me ocurre es:

det_2x2 m1(v1[j],v1[i],v2[j],v2[i],tempu[ j==1? i-1 : j==2 ? i+1 : 6]);
det_2x2 m2(v3[j],v3[i],v4[j],v4[i],tempd[ j==1? i-1 : j==2 ? i+1 : 6]);

Pero es torpe y muy específico para este código. Tan pronto como el límite superior del bucle for cambie, dejará de ser válido.

Pasa una verificación rápida de sintaxis en Vivado, pero no puedo verificarla completamente porque no tengo det_2x2.

    
respondido por el Oldfart

Lea otras preguntas en las etiquetas