2017-04-14 22 views
0

(편집 됨) 나는 Verilog 산술 프로젝트에서 일하고 있는데, 나는 이것이 문제라고 가정하고 부호 연장 부분에 걸렸다. 나는 4 비트 입력 A, B를 가지고 있고 8 비트 출력을 가져야한다. 일부 프로세스 (합계, 하위 ...) 8 비트 출력을 만들기 위해 부호 확장을 사용해야합니다. 산수의 경우,이 코드를 가지고 있습니다. 이것은 코드의 절반입니다. 그냥 긴 사촌 난 ..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가 없습니다. 입력 값이 표시되지 않습니다. 왜 그런 일이 일어나는거야 ?? 감사합니다.

(편집 됨) 이것은 테스트 벤치 코드입니다. lap3_top 파일은 여기 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 

있다.

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 

당신에게 너무 많은 사람을 감사 (mux_8_1 당신이 코드를 필요로하는 경우, 알려주세요. 결과 통해 출력 밖으로을 선택할 것입니다!하지만 난 먹스가 잘 작동 생각)!

+1

Hello Jake, 테스트 벤치 코드를 공유 할 수 있습니까? –

+0

'testbench'에서'sum' 모듈까지의 모든 연결을 보여주는'lab3_top' 모듈을 게시 할 수 있습니까? – Roman

답변

0

나는 코드를 시뮬레이션하기 위해 시도하고 코드에서 다음과 같은 실수를 발견 : 당신은 테스트 벤치 모듈에서 상위 모듈을 인스턴스화 할 때 모듈의 lab3_top ulap3_top(...);B 3_top 이름을 사용하지만, 어떤 모듈은 다른 이름을 가지고 싶습니다 module lap3_top(...);la p 3_top. enter image description here

P.S. (I 코드 거의 작동하지 설명에하지 mux_8_1 모듈을 가지고 있기 때문에 당신이 을 ZZ 상태를 볼 수 파형)

나는 이름을 변경하고 모든 것이 잘 작동 그런데이 태그를 추가 할 때 Vivado를 사용한다고 가정합니다. 그리고 거기에는 힌트가 있습니다. 이런 식으로 오류를 검사하는 방법 (모듈에서 다른 이름을 사용하거나 인스턴스화시 또는 모듈에서 오류가 발생하여 라이브러리에서 컴파일 할 수없는 경우)이 있습니다. 모든 모듈을 계층 구조로 확장하면 오류가있는 곳에서 ? 로그인 모듈을 찾을 수 있습니다. enter image description here

+0

와우 .. 나는이 실수에 많은 시간을 보냈다. 고맙다 !! – Jake

+0

당신은 오신 것을 환영합니다! – Roman

+0

@Jake 또한 Vivado의 향후 작업에 도움이 될 수있는 정보를 추가했습니다. – Roman