2015-01-22 8 views
2

선택기와 산술 시프트를 함께 사용하고 싶습니다. 그러나이 코드를 구현하지 못하면 결과는 논리적으로 바뀝니다.Verilog에서 arithmetic shift & selector를 사용하는 방법은 무엇입니까?

module multiplier(x1, x2, x1x2); 
input [15:0] x1, x2; 
output [15:0] x1x2; 
assign x1x2 = 
x2[13]? ($signed(x1)>>>4'd1) : 16'b0000000000000000; 
endmodule 

이 코드와 마찬가지로 선택자없이 산술 연산이 성공적으로 완료됩니다.

module multiplier(x1, x2, x1x2); 
input [15:0] x1, x2; 
output [15:0] x1x2; 
assign x1x2 = $signed(x1)>>>4'd1; 
endmodule 

선택기와 산술 시프트를 함께 사용하는 방법은 무엇입니까?

+0

리터럴 16'b0이 부호가 없다는 사실과 관련이있을 수 있습니다. 서명 된 리터럴로 만들면 작동합니까? (16'sb0) – Unn

+0

정답이있는 경우 회색 눈금을 클릭하여 수락 할 수 있다면 도움이 될 것입니다. 감사합니다. – Morgan

답변

2

Verilog는 선택 사항이있을 때 거의 항상 서명되지 않은 코드를 선택합니다. 선택기 로직을 ​​사용하면 Verilog에서 선택할 수 있습니다.

는 몇 가지 경우의 차이 솔루션 :

  • 를 사용하여 두 줄 : 대신 괄호의
    wire [15:0] x1_shift = $signed(x1)>>>4'd1; 
    assign x1x2 = x2[13] ? x1_shift : 16'b0;
  • 사용 곱슬 :
    assign x1x2 = x2[13]? { $signed(x1)>>>4'd1 } : 16'b0;
  • 하드 코딩 전환 :

    assign x1x2 = x2[13] ? {x1[15],x1[15:1]} : 16'b0;
  • 모든 조건에 서명 : (U

    assign x1x2 = x2[13] ? 16'($signed(x1)>>>4'd1) : 16'b0; // SV only, not Verilog

작동 예 here : nn은 지적 16'b0는 SystemVerilog를 가진

assign x1x2 = x2[13] ? ($signed(x1)>>>4'd1) : $signed(16'b0); // least recommenced
  • 당신은 또한 크기 캐스팅을 수행 할 수 있습니다) 부호이다.