문제

Verilog에서 4 비트 가산기 서브 트레이터를 설계하려고합니다. 이것은 내가 Verilog에서 작성한 두 번째 일 뿐이며 아직 올바른 구문을 모두 모릅니다. 이것은 내가 지금까지 가지고있는 모듈입니다.

module Question3(carryin, X, Y, Z, S, carryout, overflow);
    parameter n = 4;
    input carryin, Z;
    input [n-1:0]X, Y;
    output reg [n-1:0]S;
    output reg carryout, overflow;

    if(Z==0)
    begin
        Y = not(y) + 4'b0001;
    end

    always @(X, Y, carryin)
        begin
            {carryout, S} = X + Y + carryin;
            overflow = carryout ^ X[n-1]^Y[n-1]^S[n-1];
        end

endmodule

내 컴파일러 (xilinx 10.1)는 "IF 근처의 구문 오류"를 계속 말합니다. 나는 y를 인수로 간주하는 사례를 사용하는 것을 포함하여 다양한 전환 방법을 시도한 다음 가능한 모든 4 비트 조합을 확인하고 2의 보완으로 변환합니다.

z는 가산기가 뺄셈인지 추가하는지 여부를 결정하는 것입니다. 그것이 0이라면, 뺄셈을 의미하고 y를 2의 보완으로 변환하고 싶다면 정기적으로 추가하십시오. 나는 가산기의 나머지 부분이 정확하다고 확신합니다. 나는 내가 변환하려는 부분에 무엇이 잘못되었는지 모른다.

도움이 되었습니까?

해결책

reg [n-1:0] Y_compl;

always @( Z, Y, X, carryin ) begin
  Y_ = ( ~Y + 4'b0001 );
  if ( Z == 1'b0 ) begin
    {carryout, S} = X + Y_compl + carryin;
    overflow = carryout ^ X[n-1] ^ Y_compl[n-1] ^ S[n-1];
  end
  else begin
    {carryout, S} = X + Y + carryin;
    overflow = carryout ^ X[n-1] ^ Y[n-1] ^ S[n-1];
  end

end

몇 가지 중요한 요점.

  1. IF 문을 항상 블록 안에 넣으십시오. 항상 두 개의 블록을 사용하지 않으면 시뮬레이터에서 레이스 조건을 만듭니다.
  2. 나는 새로운 변수 인 Y_를 만들었습니다. y를 사용하는 것은 할당의 왼쪽에서 입력을 기억하십시오.
  3. 비트 반전 연산자 '~'를 사용하여 '원시가 아닌 경우'대신 y를 반전시키는 것이 좋습니다. 합성 도구는 이러한 방식으로 코드를 최적화 할 수있는 더 많은 자유가 있습니다.
  4. 올바른 결과를 두 번 확인하면 가산기를 만든 후 시간이 오래 걸렸습니다.

다른 팁

"y = not (y) + 4'b0001"에서 소문자 "y"를 사용하고 있습니다. "

또한 필요한 것보다 더 많은 추가 기능을 사용하고 있습니다. xy는 (x)+y가 아님과 동일합니다.

IF 문을 초기 블록 내에 넣으십시오
http://www.asic-world.com/verilog/vbehave1.html

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top