Frage

Ich habe einen in Verilog beschriebenen grundlegenden 8-Bit-Alu. Ich versuche, das Design zu implementieren, aber ich erhalte Fehlermeldungen:

Fehler: ngdbuild: 809 - Ausgabepadnetz 'Quotient <1>' hat eine illegale Last: Pin I3 auf Block mmux_opcode [2] _gnd_1_o_wide_mux_8_out81 mit Typ LUT6

Das Design führt den folgenden Vorgang, Addition, Subtraktion, Multiplikation, Teilung und, OR, XOR und XNOR durch. Das Interessante daran ist die Tatsache, dass Xilinx Xst einen Teiler nicht synthesen kann, wenn die Dividende nicht durch den Faktor 2 geteilt wird (im Grunde genommen rechts verschieben). Um sich darum zu kümmern, habe ich eine Kern -IP -Komponente verwendet, die vom Xilinx -Kerngenerator generiert wurde. Es nimmt eine einzelne Uhr ein (keine Uhr aktiviert oder synchron klare Uhr und gibt nach etwa 20 Uhr den richtigen Quotienten und den Rest nach etwa 20 Taktzyklen aus. Der Kern selbst kann im Kerngeneratorprogramm in mathematischen Funktionen gefunden werden. Wie auch immer, hier ist mein Code:

`timescale 1ns / 1ps
module ALU8(A,B,opcode,clk,OUT);

// I/O
// We have two 16-bit inputs
input [7:0] A,B;
// The opcode determines our next operation
input [2:0] opcode;
// The processor clock
input clk;
// A 32-bit output
output [15:0] OUT;

// The inputs are wires
wire [7:0] A,B;
wire [2:0] opcode;

// The output is a register
reg [15:0] OUT;

// The quotient and remainder for tyhe divider
wire [7:0] quotient,remainder;
// Declare an internal dividing unit
Divider8 divider(.rfd(), .clk(clk), .dividend(A), .quotient(quotient), .divisor(B), .fractional(remainder));

// Define operation codes, there's only 9 so far
parameter   ADD = 3'b000;
parameter   SUB = 3'b001;
parameter   MUL = 3'b010;
parameter   DIV = 3'b011;
parameter   AND = 3'b100;
parameter   OR  = 3'b101;
parameter   XOR = 3'b110;
parameter   XNOR    = 3'b111;

// On the rising-edge of the clock
always @(posedge clk)
begin
    // The output is determined by the operation
    // Think of it as a MUX
    // A MUX8 will be added in later
    case(opcode)
        ADD: OUT <= A + B;
        SUB: OUT <= A - B;
        MUL: OUT <= A * B;
        DIV: OUT <= {quotient,remainder};
        AND: OUT <= A & B;
        OR:  OUT <= A | B;
        XOR: OUT <= A ^ B;
        XNOR: OUT <= A ~^ B;
        default: OUT <= 16'b0000000000000000;
    endcase
end
endmodule

Offensichtlich sind mein Code schrecklich und meine Kommentare wahrscheinlich falsch, aber ich bin nur ein Anfänger mit Verilog. Ich habe jedoch vor, diesen Code stark zu verbessern und mehr Operationen für mich zum Üben hinzuzufügen. Das Modul selbst syntheset erfolgreich und simuliert korrekt, aber ich kann es in keiner FPGA implementieren. Weiß jemand, ob es ein Problem mit dem Code oder Xilinx ISE (was wie gewohnt voller Fehler ist) oder vielleicht die Projekteinstellungen vorhanden ist?

Bearbeiten: Ich habe ein paar Änderungen am Code vorgenommen, um die Ratschläge der Antworten widerzuspiegeln.

War es hilfreich?

Lösung

Haben Sie die Option "NetList -Wrapper mit IO -Pads erstellen" in Ihrem Corgen -Projekt ausgewählt? Aus dem Fehler klingt es so, als ob der Divider8 -Kern einen OBUF oder einen ähnlichen Ausgangspuffer aufweist, der die Quotientenausgabe antreibt. OBUF kann nur ein Signal treiben, das das FPGA verlässt.

Ein weiterer Hinweis, obwohl dies nicht mit dem NGDBuild-Fehler zusammenhängt: Normalerweise werden nicht blockierende Zuordnungen in sequentiellen Blöcken verwendet ("immer @(poedge clk)"), z. "Aus" Out <= a + b ". Die kurze Erklärung dafür ist, dass es die Aktualisierung des Out -Signals bis zur Verarbeitung aller anderen Ereignisse vertieft, was die Rennbedingungen im Simulator vermeidet.

Andere Tipps

Dies ist keine Antwort, aber ich denke, diese Tipps könnten Ihren Code verbessern.

Da habe ich nicht deine Divider8 Modul, ich kann Ihren Code nicht kompilieren, es sei denn, ich komme das aus divider Beispiel. Es scheint, als ob die Fehlermeldung mit dieser Instanz zusammenhängt.

Für viele Synthesewerkzeuge initial Blöcke sind nicht synthetisierbar. Da ich Xilinx nicht verwende, kann ich seine Unterstützung nicht kommentieren. Vielleicht könnten Sie das einfach löschen initial Block.

Es ist besser, nicht blockierende Aufgaben zu verwenden (<=) zur Synthese der sequentiellen Logik. Zum Beispiel:

case(opcode)
    ADD: OUT <= A + B;
    SUB: OUT <= A - B;

Sie könnten Ihre Konstante neu codieren wie:

    default: OUT = {16{1'b0}};
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top