2015-10-16 51 views
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 

2nd - 下面是我对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 

3 - 我不明白的试验台和接线一切都在一起。我看过这两个链接,这两个链接有两种不同的方式。 Link 1Link 2。我试图复制链接2,但似乎无法让它工作。帮帮我?

+0

'S [4]'超出范围。或者展开's'或者以不同的方式管理最后的进行。 – Greg

+0

好吧,我明白了。而不是s [4]会不会认为我应该在最后再做一些类似co [2]的事情? –

回答

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参见

+0

好吧,我会试试这个。首先,“Link2”只是我发现的一个,那不是我的代码。我试图复制它。其次,您提供的链接,模块加法器和模块FullAdder是两个单独的文件是否正确?他们没有合并成一个大文件,如链接所示?所以基本上你有3个文件,一个叫Adder,一个叫FullAdder,另一个叫TestBench? –

+0

我有三个模块。其中两个在一个文件中,并且测试台在一个单独的文件中。如果需要,可以将三个模块放在同一个文件中,或者每个模块一个文件 –