Tratar con matrices en HDL

1

(Supongamos que Mux4Way ya se ha implementado)

/**
 * 4-way 16-bit multiplexor:
 * out = a if sel == 00
 *       b if sel == 01
 *       c if sel == 10
 *       d if sel == 11
 */

CHIP Mux4Way16 {
    IN a[16], b[16], c[16], d[16], sel[2];
    OUT out[16];

    PARTS:
    // Put your code here:
    Mux4Way(a=a[0],b=b[0],c=c[0],d=d[0],sel=sel,out=out[0]);
    Mux4Way(a=a[1],b=b[1],c=c[1],d=d[0],sel=sel,out=out[1]);
    Mux4Way(a=a[2],b=b[2],c=c[2],d=d[0],sel=sel,out=out[2]);
    Mux4Way(a=a[3],b=b[3],c=c[3],d=d[0],sel=sel,out=out[3]);
    Mux4Way(a=a[4],b=b[4],c=c[4],d=d[0],sel=sel,out=out[4]);
    Mux4Way(a=a[5],b=b[5],c=c[5],d=d[0],sel=sel,out=out[5]);
    Mux4Way(a=a[6],b=b[6],c=c[6],d=d[0],sel=sel,out=out[6]);
    Mux4Way(a=a[7],b=b[7],c=c[7],d=d[0],sel=sel,out=out[7]);
    Mux4Way(a=a[8],b=b[8],c=c[8],d=d[0],sel=sel,out=out[8]);
    Mux4Way(a=a[9],b=b[9],c=c[9],d=d[0],sel=sel,out=out[9]);
    Mux4Way(a=a[10],b=b[10],c=c[10],d=d[0],sel=sel,out=out[10]);
    Mux4Way(a=a[11],b=b[11],c=c[11],d=d[0],sel=sel,out=out[11]);
    Mux4Way(a=a[12],b=b[12],c=c[12],d=d[0],sel=sel,out=out[12]);
    Mux4Way(a=a[13],b=b[13],c=c[13],d=d[0],sel=sel,out=out[13]);
    Mux4Way(a=a[14],b=b[14],c=c[14],d=d[0],sel=sel,out=out[14]);
    Mux4Way(a=a[15],b=b[15],c=c[15],d=d[0],sel=sel,out=out[15]);
}

Como puede ver, este código parece bastante poco elegante. ¿Cómo puedo lidiar con este código repetitivo? Soy nuevo en HDL, así que me disculpo por esta pregunta trivial. ¿Existe el concepto de bucles (o algo parecido) en HDL?

    
pregunta Fine Man

2 respuestas

1

En verilog usas un generar como:

   genvar i;

   generate

     for (i = 0; i < 16 ; i = i + 1) begin: muxes
          Mux4Way m(.a(a[i]),.b(b[i]),.c(c[i]),.d(d[i]),.sel(sel),.out(out[i]));
     end

  endgenerate
    
respondido por el Taniwha
0

La mejor manera de implementar un mux es usar el operador de matriz-subíndice (no necesitamos construir un mux más grande usando los más pequeños, el sintetizador HDL hace esto por nosotros). El código de SystemVerilog se vería así:

logic  [1:0] select;     // Two bit array index
logic [15:0] in[3:0];    // Four 16-bit numbers
logic [15:0] out;        // 16-bit output

always_comb out = in[sel];

/* If the array "in" is not available, you can create it as:

   always_comb in[0] = a;
   always_comb in[1] = b;
   ...
   always_comb in[3] = d;
*/
    
respondido por el nav

Lea otras preguntas en las etiquetas