Question

J'ai un 8 bits de base ALU décrit dans Verilog. Je suis en train de mettre en œuvre la conception, mais je reçois des messages d'erreur:

ERROR: NgdBuild: 809 - Tapis de sortie net 'quotient <1>' a une charge illégale: I3 broches sur le bloc Mmux_opcode [2] _GND_1_o_wide_mux_8_OUT81 de type LUT6

La conception fait l'opération suivante, addition, soustraction, multiplication, division, AND, OR, XOR et XNOR. La chose intéressante à ce sujet est le fait que Xilinx XST ne peut pas la synthèse d'un diviseur à moins que le dividende est divisé par un facteur 2 (décalage essentiellement à droite). Donc, pour prendre soin de ce que j'ai utilisé une composante de base IP généré par Xilinx de base du générateur. Il prend en une seule horloge (pas de validation d'horloge ou synchrone claire et émet le bon quotient et le reste après environ 20 ou si les cycles d'horloge Le noyau lui-même se trouve sous les fonctions mathématiques dans le programme de base du générateur Quoi qu'il en soit, voici mon 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

Il est évident que mon code terrible et mes commentaires sont probablement erronées, mais je suis un débutant avec Verilog. Cependant, je le plan sur l'amélioration de ce code et en ajoutant beaucoup plus d'opérations pour moi à la pratique. Le module lui-même fait avec succès la synthèse et correctement simulent, mais je suis incapable de le mettre en œuvre sur un FPGA. savoir Anyone s'il y a un problème avec le code ou Xilinx ISE (qui est plein de bugs, comme d'habitude), ou peut-être les paramètres du projet?

EDIT:. Je l'ai fait quelques modifications au code, afin de tenir compte des conseils fournis par les réponses

Était-ce utile?

La solution

Avez-vous le « Créer emballage netlist avec des tampons IO » option sélectionnée dans votre projet Coregen? De l'erreur il semble que le noyau Divider8 possède un tampon de sortie OBUF ou similaire entraînant la sortie de quotient. OBUF ne peut conduire un signal qui quitte le FPGA.

Une autre note, bien que cela ne soit pas liée à l'erreur ngdbuild: normalement les affectations non bloquants sont utilisés dans des blocs séquentiels ( « toujours @ (posedge clk) »), par exemple "OUT <= A + B". L'explication courte est que la mise à jour, il remet le signal OUT jusqu'à ce que tous les autres événements pour l'heure actuelle ont été traitées, ce qui évite les conditions de course dans le simulateur.

Autres conseils

Ce n'est pas une réponse, mais je pense que ces conseils pourraient améliorer votre code.

Depuis que je n'ai pas votre module Divider8, je ne peux pas compiler votre code, à moins que je commente sur l'instance de divider. Il semble que le message d'erreur est liée à cette instance.

Pour de nombreux outils de synthèse de blocs initial ne sont pas synthétisable. Comme je ne l'utilise Xilinx, je ne peux pas commenter sur son support. Peut-être que vous pouvez simplement supprimer le bloc initial.

Il est préférable d'utiliser des affectations non-blocage (<=) pour la synthèse logique séquentielle. Par exemple:

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

Vous pourriez recoder votre constante:

    default: OUT = {16{1'b0}};
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top