4-Port-12-Bit-Mux verbraucht 48 Makrozellen!

Ich programmiere auf dem Coolrunner II cpld. Ihm gehen die Ressourcen aus, also habe ich mich entschieden, meinen eigenen 12-Bit-Mux mit 4 Ports zu implementieren. Nach der Implementierung finde ich, dass es über 40 Makrozellen verwendet. Gibt es eine Möglichkeit, diese Zahl zu reduzieren? Ich habe bereits versucht, die Optimierungstechniken mit ISE XST zu verwenden, aber es hat die Anzahl nicht verringert. Hier ist mein Code

module mux_2to1_gates(a,b,sel,y);
input a,b,sel;
output y;

wire sel,a_sel,b_sel;

not U_inv (inv_sel,sel);
and U_anda (asel,a,inv_sel),
     U_andb (bsel,b,sel);
or U_or (y,asel,bsel);

endmodule    

module mux_four_to_one(a,b,c,d,sel,y);
input a,b,c,d;
input [1:0] sel;
output y;
integer i; 

wire mux_1,mux_2;

mux_2to1_gates U_mux1 (a,b,sel[0],mux_1),
                    U_mux2 (c,d,sel[0],mux_2),
                    U_mux3 (mux_1,mux_2,sel[1],y);

endmodule

module muxing( selecting, d1,d2,d3,d4, q );

input[1:0] selecting;
input[11:0] d1;
input[11:0] d2;
input[11:0] d3;
input[11:0] d4;
output[11:0] q;

genvar i;

generate 
    for(i=0; i < 12; i= i+1) begin: test
        mux_four_to_one named (d1[i],d2[i],d3[i],d4[i],selecting,q[i]);
    end
endgenerate



endmodule
@EugenSch. Danke für die Rückmeldung. Fügen Sie Ihren Code als Antwort hinzu und ich akzeptiere ihn. Ich fange an zu glauben, dass es die umgebende Logik ist, die den enormen Anstieg der Verwendung von Makrozellen verursacht, also werde ich eine andere Frage dazu stellen. Vielen Dank für Ihre Hilfe!

Antworten (1)

Anstatt den Mux als Logik auf Gate-Ebene zu implementieren, was den Synthesizer verwirren könnte, versuchen Sie, eine Verhaltens- oder RTL-Beschreibung zu verwenden, die es dem Synthesizer ermöglicht, den Weg zur optimalen Implementierung zu wählen. Ich bin mir ziemlich sicher, dass das Gerät einige eingebaute Makrozellen hat, um einen solchen Mux mit minimalen Ressourcen zu implementieren, die Sie nicht kennen, aber die Software ist es. Sie können beispielsweise den folgenden Code verwenden, um den 12-Bit-4-zu-1-MUX abzuleiten:

module muxing( selecting, d1,d2,d3,d4, q );

input[1:0] selecting;
input[11:0] d1;
input[11:0] d2;
input[11:0] d3;
input[11:0] d4;
output[11:0] q;

wire [11:0] d[3:0];

assign d[0] = d1;
assign d[1] = d2;
assign d[2] = d3;
assign d[3] = d4;

assign q = d[selecting];

endmodule

Nebenbei bemerkt - beide Implementierungen, die in der Frage angegebene und die vorgeschlagene, führten beim Testen auf meinem Computer (Xilinx ISE 14.1) zu einer Verwendung von 12 Makrozellen.