Verilog 四位加法器
有人能解释一下我做错了什么吗。我不知道我是不是不明白这个概念或是什么。我已经看了两个很好的例子,它们都提供了完整的代码,但可能是我接线错误或其他什么 我已经创建了一个名为Adder的文件,下面是我的代码。这工作完全正常,我已经用它创建/运行了一个测试台文件,所以我知道这完全符合预期。然而,我是否应该以某种方式将我的全加程序文件或全加程序文件的测试台连接到加法器文件?这些文件是完全独立的,并且从未连接过吗Verilog 四位加法器,verilog,xilinx-ise,Verilog,Xilinx Ise,有人能解释一下我做错了什么吗。我不知道我是不是不明白这个概念或是什么。我已经看了两个很好的例子,它们都提供了完整的代码,但可能是我接线错误或其他什么 我已经创建了一个名为Adder的文件,下面是我的代码。这工作完全正常,我已经用它创建/运行了一个测试台文件,所以我知道这完全符合预期。然而,我是否应该以某种方式将我的全加程序文件或全加程序文件的测试台连接到加法器文件?这些文件是完全独立的,并且从未连接过吗 module Adder (a,b,ci,co,s); input a,b,ci;
module Adder (a,b,ci,co,s);
input a,b,ci;
output co,s;
assign s=a^b^ci;
assign co=(a&b)|(a&ci)|(b&ci);
endmodule
下面是我的完整加法器文件代码。我不确定这是否正确,但请告诉我在哪里可以进行可能的更改。我假设我创建的测试台将链接到此FullAdder文件?这个文件的语法检查正常,所以可能是测试台给我带来了问题
module FullAdder(a,b,ci,s);
input [3:0] a,b;
input ci;
output [3:0] s;
wire [2:0] co; // Is the wire correct here? I created this off something I saw.
Adder ADD1(a[0],b[0],ci,s[0],co[0]);
Adder ADD2(a[1],b[1],co[0],s[1],co[1]);
Adder ADD3(a[2],b[2],co[1],s[2],co[2]);
Adder ADD4(a[3],b[3],co[2],s[3],s[4]);
endmodule
第三-我不明白测试台和所有接线都在一起。我已经研究了这两个链接,它们有两种不同的方法。
. 我试图复制链接2,但似乎无法使其工作。帮忙
Adder ADD4(a[3],b[3],carry[2],s[3],s[4]);
此实例化假设s是一个向量,其中一个元素位于位置4,但您对s的定义是[3:0]
,因此4不是一个有效位置。换成
output [4:0] s;
desiderabel使用Verilog 2001模块定义样式(类似于ANSI C)。您的模块如下所示:
module FullAdder (
input wire [3:0] a,
input wire [3:0] b,
input wire ci,
output wire [4:0] s
);
wire [2:0] co;
Adder ADD1(a[0],b[0],ci,s[0],co[0]);
Adder ADD2(a[1],b[1],co[0],s[1],co[1]);
Adder ADD3(a[2],b[2],co[1],s[2],co[2]);
Adder ADD4(a[3],b[3],co[2],s[3],s[4]);
endmodule
// Code your testbench here
module test_bench;
// Inputs
reg [3:0] p;
reg [3:0] q;
reg ci;
// Outputs
wire [4:0] r;
// Instantiate the Unit Under Test (UUT)
FullAdder uut (
.a(p),
.b(q),
.ci(ci),
.s(r)
);
initial begin
ci = 1'b0;
repeat (2) begin
p = 4'b0000;
repeat (16) begin
q = 4'b0000;
repeat (16) begin
#10;
$display ("%b + %b + %b = %b", p, q, ci, r);
if (r != (p+q+ci)) begin
$display ("ERROR!. Expected %b", p+q+ci);
$finish;
end
#10;
q = q + 1;
end
#10;
p = p + 1;
end
#10;
ci = !ci;
end
$display ("EVERYTHING OK!");
$finish;
end
endmodule
关于您的测试台(链接2),您错误地说出了一些名称:1位地址的名称称为“加法器”,而不是“加法器”。更改定义或实例名称。端口的名称是a、b、cin和s,而不是p、q、ci和r。最后这些是您将连接到端口的信号(导线)
由于这个加法器有一组有限的输入,我建议做一个详尽的测试台。因此,与其探测a、b和cin的两个样本值,不如尝试所有可能性,并检查结果是否符合预期。大概是这样的:
module FullAdder (
input wire [3:0] a,
input wire [3:0] b,
input wire ci,
output wire [4:0] s
);
wire [2:0] co;
Adder ADD1(a[0],b[0],ci,s[0],co[0]);
Adder ADD2(a[1],b[1],co[0],s[1],co[1]);
Adder ADD3(a[2],b[2],co[1],s[2],co[2]);
Adder ADD4(a[3],b[3],co[2],s[3],s[4]);
endmodule
// Code your testbench here
module test_bench;
// Inputs
reg [3:0] p;
reg [3:0] q;
reg ci;
// Outputs
wire [4:0] r;
// Instantiate the Unit Under Test (UUT)
FullAdder uut (
.a(p),
.b(q),
.ci(ci),
.s(r)
);
initial begin
ci = 1'b0;
repeat (2) begin
p = 4'b0000;
repeat (16) begin
q = 4'b0000;
repeat (16) begin
#10;
$display ("%b + %b + %b = %b", p, q, ci, r);
if (r != (p+q+ci)) begin
$display ("ERROR!. Expected %b", p+q+ci);
$finish;
end
#10;
q = q + 1;
end
#10;
p = p + 1;
end
#10;
ci = !ci;
end
$display ("EVERYTHING OK!");
$finish;
end
endmodule
请参见
s[4]
超出范围。展开s
或以不同的方式管理最后一次执行。好的,我明白了。你认为我应该在最后再做一次类似于co[2]的事情吗?好的,我会试试这个。首先,“Link2”只是我找到的一个,不是我的代码。我试图复制它。其次,您提供的链接,模块加法器和模块全加法器是两个独立的文件,对吗?它们没有合并到一个大文件中,如链接所示?基本上你有3个文件,一个叫做加法器,一个叫做全加法器,还有一个叫做测试台,我有三个模块。其中两个在一个文件中,测试台在一个单独的文件中。如果需要,可以将三个模块放在同一个文件中,或者每个模块放一个文件