我有一个在 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(像往常一样充满错误)或项目设置是否有问题?
编辑:我对代码进行了一些更改,以反映答案提供的建议。