1

我有一个在 Verilog 中描述的基本 8 位 ALU。我正在尝试实现该设计,但收到错误消息:

错误:NgdBuild:809 - 输出焊盘网络“商<1>”具有非法负载:块 Mmux_opcode[2]_GND_1_o_wide_mux_8_OUT81 上的引脚 I3,类型为 LUT6

该设计执行以下操作:加法、减法、乘法、除法、AND、OR、XOR 和 XNOR。有趣的是,Xilinx XST 无法合成除法器,除非被除数除以 2(基本上是右移)。因此,为了解决这个问题,我使用了 Xilinx Core Generator 生成的 CORE IP 组件。它需要一个时钟(没有时钟启用或同步清除,并在大约 20 个时钟周期后输出正确的商和余数。核心本身可以在核心生成器程序的数学函数下找到。无论如何,这是我的代码:

`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

这不是答案,但我认为这些提示可能会改进您的代码。

由于我没有您的Divider8模块,因此我无法编译您的代码,除非我注释掉该divider实例。似乎错误消息与该实例有关。

对于许多综合工具initial,模块是不可综合的。由于我不使用 xilinx,我无法评论它的支持。也许您可以删除该initial块。

最好使用非阻塞赋值 ( <=) 来合成时序逻辑。例如:

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

您可以将常量重新编码为:

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

您是否在您的 coregen 项目中选择了“使用 IO 焊盘创建网表包装器”选项?从错误来看,Divider8 内核有一个 OBUF 或类似的输出缓冲器来驱动商输出。OBUF 只能驱动离开 FPGA 的信号。

另一个注意事项,尽管这与 ngdbuild 错误无关:通常在顺序块中使用非阻塞分配(“always @(posedge clk)”),例如“OUT <= A + B”。对此的简短解释是,它推迟更新 OUT 信号,直到当前时间的所有其他事件都已处理完毕,这避免了模拟器中的竞争条件。

于 2011-03-17T17:58:41.060 回答