Wie verwende ich Multiplikatoren, um einen einfachen Addierer zu erzeugen?

Ich versuche, eine Altera-Schaltung mit so wenig Logikelementen wie möglich zu synthetisieren. Außerdem zählen eingebettete Multiplikatoren nicht zu Logikelementen, also sollte ich sie verwenden. Funktional sieht die Schaltung soweit korrekt aus. Das folgende Modul verwendet jedoch eine große Menge an Logikelementen. Es verwendet 24 Logikelemente und ich bin mir nicht sicher, warum, da es 8 + ein paar kombinatorische Gatter für den Fallblock verwenden sollte.

Ich vermute den Addierer, bin mir aber nicht 100% sicher. Wenn mein Verdacht jedoch richtig ist, ist es möglich, Multiplikatoren als einfachen Addierer zu verwenden?

module alu #(parameter N = 8)
(
    output logic [N-1:0] alu_res,
    input [N-1:0] a,
    input [N-1:0] b,
    input [1:0] op,
    input clk
);       

wire [7:0] dataa, datab;
wire [15:0] result;

// instantiate embedded 8-bit signed multiplier
mult mult8bit (.*);

// assign multiplier operands
assign dataa = a;
assign datab = b;

always_comb
    unique case (op)
        // LW
        2'b00:  alu_res = 8'b0;
        // ADD
        2'b01:  alu_res = a + b;
        // MUL
        2'b10:  alu_res = result[2*N-2:N-1]; // a is a fraction
        // MOV
        2'b11:  alu_res = a;
    endcase

endmodule
Dies ist eine migrierte Frage von stackoverflow.com/questions/22304059/…
Ihr vorhandenes Design verwendet 16 Logikelemente, um den 8-Bit-4:1-Mux zu implementieren, der durch die caseAnweisung dargestellt wird, und 8 Logikelemente (in Verbindung mit dedizierter Übertragshardware), um zu implementieren a + b. Viel besser geht es wirklich nicht.
Ich kopiere meinen Kommentar von StackOverflow: " uniquefor synthese bedeutet parallel_caseand full_case. Probieren Sie es stattdessen mit priority(only full_case) aus. Probieren Sie es auch ohne ein Schlüsselwort vor der case-Anweisung."
Aus meiner Erfahrung parallel_caseerfordern tendenziell mehr Logikgatter, bieten aber einen schnelleren Datenpfad.
@Greg Danke Gregor. Ich werde es versuchen, obwohl die Lehrbücher, die ich gelesen habe, empfehlen, sie aus irgendeinem Grund zu vermeiden. Ich habe unique verwendet, weil es theoretisch zu weniger Hardware führen sollte.
@Greg Ich habe es sowohl mit Priorität als auch ohne Schlüsselwort versucht. Beide produzieren so ziemlich das Gleiche.
@DaveTweed Danke. Ich denke, ich muss herausfinden, wie ich das Alu irgendwie vereinfachen kann.
Stilpunkt: Wenn Sie verwendet haben, localparam [1:0] LW=2'b00, ADD=2'b01, MUL=2'b10...;finden Sie den Ausgabe-Mux-Code selbstdokumentierend (oder eine SV-Enumeration).

Antworten (1)

Verwenden Sie den Altera "Technology Map Viewer", wenn Sie genau sehen möchten, wie/wo diese 24 Elemente abgeleitet werden.

Ich bin mir nicht sicher, auf welche Technologie Sie abzielten. Für einen StratixV werden 16 Regs und 1 DSP-Slice verwendet, und wenn Sie es brauchen, erhalten Sie die nächste Registerstufe kostenlos vom Mux-Ausgang.

RTL-Viewer

RTL-Ansicht

Technologie-/RessourcenansichtGeben Sie hier die Bildbeschreibung ein

Sie können sehen, dass die Logikelemente eines pro Bit für den Ausgangs-Mux und eines pro Bit für den Addierer verwendet werden, wobei die DSP-Zelle hervorgehoben ist.

Möglicherweise können Sie das Ganze mithilfe der verschiedenen Modusbits (Voraddierer für a / b, Mult-Stufe auf x1 einstellen) in eine einzige SV-DSP-Zelle packen, um den Ausgangs-Mux zu vermeiden, aber das Ganze ist bei dieser Art strittig Gerät!