1

Verilogで説明されている基本的な8ビットALUがあります。デザインを実装しようとしていますが、エラーメッセージが表示されます。

エラー:NgdBuild:809-出力パッドネット「商<1>」に不正な負荷があります:タイプLUT6のブロックMmux_opcode[2]_GND_1_o_wide_mux_8_OUT81のピンI3

デザインは、次の演算、加算、減算、乗算、除算、AND、OR、XOR、およびXNORを実行します。興味深いのは、ザイリンクスXSTは、被除数を2倍(基本的に右にシフト)で除算しない限り、分周器を合成できないという事実です。そのため、これを処理するために、ザイリンクスコアジェネレーターによって生成されたCOREIPコンポーネントを使用しました。単一のクロックを受け取り(クロックイネーブルまたは同期クリアなしで、約20クロックサイクル後に正しい商と剰余を出力します。コア自体は、Core Generatorプログラムの数学関数の下にあります。とにかく、私のコードは次のとおりです。

`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

明らかに私のコードはひどく、私のコメントはおそらく間違っていますが、私はVerilogの初心者にすぎません。ただし、このコードを大幅に改善し、練習用の操作を追加する予定です。モジュール自体は正常に合成およびシミュレーションできますが、FPGAに実装できません。コード、またはXilinx ISE(いつものようにバグでいっぱいです)、またはおそらくプロジェクト設定に問題があるかどうか誰かが知っていますか?

編集:回答によって提供されたアドバイスを反映するために、コードにいくつかの変更を加えました。

4

2 に答える 2

1

coregen プロジェクトで [Create netlist wrapper with IO pad] オプションが選択されていますか? エラーから、Divider8 コアに商出力を駆動する OBUF または同様の出力バッファがあるように聞こえます。OBUF は、FPGA を出る信号のみを駆動できます。

これは ngdbuild エラーとは関係ありませんが、もう 1 つ注意してください。通常、非ブロッキング代入は連続ブロック (「常に @(posedge clk)」) で使用されます (「OUT <= A + B」など)。これの簡単な説明は、現在の時間の他のすべてのイベントが処理されるまで OUT シグナルの更新を延期することです。これにより、シミュレーターでの競合状態が回避されます。

于 2011-03-17T17:58:41.060 に答える
1

これは答えではありませんが、これらのヒントがコードを改善する可能性があると思います。

私はあなたのモジュールを持っていないので、インスタンスDivider8をコメントアウトしない限り、あなたのコードをコンパイルできません。dividerエラーメッセージはそのインスタンスに関連しているようです。

多くの合成ツールinitialでは、ブロックは合成できません。私はザイリンクスを使用していないので、そのサポートについてコメントすることはできません。initialおそらく、ブロックを削除するだけです。

<=シーケンシャル ロジックの合成には、ノンブロッキング代入 ( ) を使用することをお勧めします。例えば:

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

定数を次のように再コーディングできます。

    default: OUT = {16{1'b0}};
于 2011-03-16T20:04:52.830 に答える