2017-04-14 192 views
0

(编辑)我正在verilog算术项目和我卡在符号扩展部分(假设这是问题)。我有4位输入A,B,应该有8位输出。对于一些进程(总和,子...)我需要使用符号扩展来使8位输出。所以对于算术的主体,我有这个代码。这是代码的一半。我不包括半部分cuz它只是长..verilog算术(符号扩展)编辑

module arithmetic(A, B, AN0, DP, sum, sub, mult, div, comp, shiftLeft, 
shiftRight, signExtend); 

    input signed [3:0] A, B; 

    output [7:0] sum, sub, mult, div, comp, shiftLeft, shiftRight, 
    signExtend; 

    output AN0, DP; 

    //sum 
    reg [4:0] qsum; 
    [email protected] (A, B) 
     qsum = A+B; 

    assign sum = {{3{qsum[4]}},qsum}; 

    //sub 
    reg [4:0] qsub; 

    [email protected] (A, B) 
     qsub = A-B; 

    assign sub = {{3{qsub[4]}},qsub}; 

    //mult 
    reg [7:0] qmult; 
    [email protected] (A, B) 
     qmult = A * B; 

    assign mult = qmult; 

,当我检查我的模拟,它没有任何价值,但Z,并且多个X。它甚至不显示任何输入值。为什么会这样?谢谢

(编辑)这是我的测试平台代码。有8个操作(总和,减,乘,除法,比较器,shiftleft,shiftright,符号扩展)

module lap3_top_tb(); 
reg signed [3:0] A, B; 
reg [2:0] Operation; 
wire [7:0] Result; 
wire DP, AN0; 

lab3_top ulap3_top(
    .A(A), 
    .B(B), 
    .Operation(Operation), 
    .Result(Result), 
    .DP(DP), 
    .AN0(AN0) 
); 

initial begin 
    A = 6; B = 7; Operation = 0; 
    #20; 
    A = -6; B = -7; Operation = 0; 
    #20;  
    A = 6; B = 7; Operation = 1; 
    #20; 
    A = -6; B = -7; Operation = 1; 
    #20; 
    A = 6; B = 7; Operation = 2; 
    #20; 
    A = -6; B = 7; Operation = 2; 
    #20; 
    A = 7; B = 4; Operation = 3; 
    #20; 
    A = 7; B = 0; Operation = 3; 
    #20; 
    A = 6; B = 7; Operation = 4; 
    #20; 
    A = -6; B = -7; Operation = 4; 
    #20; 
    A = 1; B = 6; Operation = 5; 
    #20; 
    A = 1; B = -6; Operation = 5; 
    #20; 
    A = 1; B = 6; Operation = 6; 
    #20; 
    A = 1; B = -6; Operation = 6; 
    #20; 
    A = 6; B = 0; Operation = 7; 
    #20; 
    A = -5; B = 0; Operation = 7; 
    #20; 
end 

endmodule 

的lap3_top文件在这里。 (mux_8_1会选择直通结果输出和缩小。如果你需要的代码,让我知道!但我想MUX正常工作)

module lap3_top(A, B, Operation, Result, AN0, DP); 
    input signed [3:0] A, B; 
    input [2:0] Operation; 
    output AN0, DP; 

    output [7:0] Result; 
    wire a, b, c, d, e, f, g, h; 

    arithmetic uarithmetic(
    .A(A), 
    .B(B), 
    .AN0(AN0), 
    .DP(DP), 
    .sum(a), 
    .sub(b), 
    .mult(c), 
    .div(d), 
    .comp(e), 
    .shiftLeft(f), 
    .shiftRight(g), 
    .signExtend(h) 
    ); 

    mux_8_1 umux8_1(
    .A(a), 
    .B(b), 
    .C(c), 
    .D(d), 
    .E(e), 
    .F(f), 
    .G(g), 
    .H(h), 
    .Operation(Operation), 
    .Result(Result) 
    ); 

endmodule 

非常感谢你的家伙!

+1

你好杰克,你能分享一些你的测试台代码吗? –

+0

你还可以发布你的'lab3_top'模块,看看'testbench'到'sum'模块的所有连接吗? – Roman

回答

0

我尝试模仿你的代码,发现代码中的以下错误:当你测试台模块中实例化顶层模块使用lab3_top ulap3_top(...);b 3_top模块的名称,但模块,你想有另一个名字module lap3_top(...); la p 3_top。

我改了名字,并一切正常(上波形可以看到ZZ状态, 因为我的代码和几个操作都没有说明不mux_8_1模块)enter image description here

附:顺便说一句,我想你在添加这个标签时使用Vivado。如果是这样,有一个提示如何检查这样的错误(在模块和实例化中有不同的名称,或者当模块中有一些错误时,它不能在库中编译)。如果将所有模块扩展为层次结构,则会发现?登录模块出现错误。 enter image description here

+0

哇..我花了很多时间在这个错误..谢谢! – Jake

+0

不客气! – Roman

+0

@Jake我还添加了更多信息,我希望在未来的Vivado工作中可以帮助您 – Roman