(Angenommen, Mux4Way
wurde bereits implementiert)
/**
* 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]);
}
Wie Sie sehen können, sieht dieser Code ziemlich unelegant aus. Wie kann ich mit diesem sich wiederholenden Code umgehen? Ich bin neu bei HDL, also entschuldige ich mich für diese triviale Frage. Gibt es das Konzept von Loops (oder so ähnlich) in HDL?
In Verilog verwenden Sie ein Generieren wie:
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
Der beste Weg, einen Mux zu implementieren, ist die Verwendung des Array-Subscript-Operators (wir müssen keinen größeren Mux mit kleineren erstellen, der HDL-Synthesizer erledigt dies für uns). Der SystemVerilog-Code würde wie folgt aussehen:
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;
*/
uint128_t