0

有人可以向我解释我做错了什么。我不知道我是不是不明白这个概念还是什么。我看过两个可靠的例子,它们都提供了完整的代码,但也许我的接线错误或其他什么。

1st - 我创建了一个名为 Adder 的文件,下面是我的代码。这工作得很好,我已经创建/运行了一个测试台文件,所以我知道这完全符合预期。但是,我是否应该以某种方式将我的 FullAdder 文件或 FullAdder 文件的测试台连接到 Adder 文件?这些是完全独立的文件并且从不连接吗?

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 文件的代码。我不确定这是否正确,但请告诉我可以在哪里进行可能的更改。我假设我创建的测试台将链接到这个 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

第三 - 我不了解测试台并将所有东西连接在一起。我查看了这两个链接,它们有两种不同的方法。 链接 1 链接 2。我试图复制链接 2,但似乎无法使其正常工作。帮助?

4

1 回答 1

0
Adder ADD4(a[3],b[3],carry[2],s[3],s[4]);

此实例假设 s 是一个向量,其中一个元素位于位置 4,但您对 s 的定义是,[3:0]因此 4 不是有效位置。将其更改为

output [4:0] s;

最好使用 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

关于您的测试台(链接 2),您拼错了一些名称:1 位地址的名称称为“加法器”,而不是“加法器”。更改定义或实例名称。端口的名称是 a、b、cin 和 s,而不是 p、q、ci 和 r。最后这些是您将连接到端口的信号(电线)。

由于这个加法器的输入有限,我建议做一个详尽的测试台。因此,不要探查 a、b 和 cin 的两个样本值,而是尝试所有可能性,并检查结果是否是预期的。像这样的东西:

// 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

http://www.edaplayground.com/x/HR5

于 2015-10-16T22:18:49.517 回答