2017-02-10 2 views
-1

저는 매 클럭 단위로 16 비트 출력에 부호가있는 8 비트 입력을 추가하고 재설정 신호를 수신 할 때 재설정해야하는 Verilog 프로그램에서 작업 해 왔습니다. 추가 부분은 잘 작동하고 음수 1 값을 추가하는 경우에도 작동하지만 그보다 적은 수의 경우 시뮬레이션에서 이상한 결과가 나타납니다. 내가 Verilog를 마지막으로 사용한 이후로 약 1 년이 지났으며, 내가 생각할 수있는 모든 것을 시도했지만, 문제가 무엇인지는 불확실하다.Verilog Signed Addition Subtraction 오류

module varcount (clk, reset, in, out); 
input clk, reset; 
input [7:0] in; 
output reg [15:0] out; 
reg [15:0] temp; 
reg [15:0]count; 
parameter X=1000000; 
always @ (posedge clk) 
    begin 
    if (in[7] == 1) 
    begin 
    temp = 16'b00000000000000001 + !in; 
    count = count - temp; 
    if (reset) 
    begin 
     count = 0; 
     out = 0; 
    end 
    out = count; 
end 
    else 
    begin 
     count = count + in; 
     if (reset) 
     begin 
      count = 0; 
      out = 0; 
     end 
     out = count; 
    end 
end 
endmodule 

여기 내 시뮬레이션 입력입니다 :

enter image description here

을 그리고 여기 얻을 출력의 여기에 내가 코드로 멀리있는거야.

enter image description here

그것은 내 프로그램에서 직선 순방향 오류 것 같아,하지만 난 그것을 식별 할 수 없습니다.

+2

에 오신 것을 환영에 StackOverflow에. 코드를 제대로 들여 쓰기가 어렵 기 때문에 코드를 읽기가 어렵습니다. 또한 실제 결과 대 올바른 결과가 될 것으로 예상되는 것을 표시하지 않습니다. –

답변

0

문제는 논리적 인 부정 (negate) 인 in과 비트 부정 (bitwise negation)을 비교하는 것입니다.

귀하의 코드는 크게

  • 가의 Verilog-2001 스타일 포트 선언

를 들어를 사용 signed 데이터 유형

  • 를 사용하여 최고 수준의
  • reset 조건 분기를 이동하여 간단하게 할 수있다 예 :

    module varcount (input clk, reset, 
          wire signed [7:0] in, 
        output reg signed [15:0] out); 
    always @ (posedge clk) 
          if (reset) 
           out = 0; 
          else 
           out = out + in; 
    endmodule 
    
  • +0

    부호없는 배열에서 부호있는 배열로 변환 할 수있는 방법이 있습니까? – StandardIssue

    +0

    새로운 질문으로 새로운 예제를 사용해보십시오. –

    0

    나는 코드에서 볼 : 당신이의 보수를 계산하기 위해 노력하고 같은

    temp = 16'b00000000000000001 + !in; 
    count = count - temp; 
    

    온도가 보인다. !은 논리적 NOT입니다. 당신은 조금 현명한 반전을 위해 ~을 원할 것입니다.

    은 그래서 당신은 할 수 :

    sum <= a + (~b +1'b1); 
    

    또는

    sum <= a - b; 
    

    -b == (~b +1'b1)