2011-09-22 3 views
1

Verilog를 처음 사용했습니다.추가 처리를 위해 Verilog에서 와이어 값 변환

나는 정수로 와이어 값을 변환하는 코드를 작성했습니다 :

wire [31:0] w1; 
integer k; 
always @ (w1) k = w1; 

출처 : converting a wire value to an integer in verilog

지금, 다음 부분에 대해 내가 오류를 얻을!

wire [63:0] w2; // Suppose it contains some value 
wire [63:0] w3; 
assign w3[k-1:0] = w2[k-1:0]; // ERROR in this line 

ERROR : k is not a constant. 

이 문제를 어떻게 해결할 수 있습니까?

+1

여기서 무엇을하려고하는지 잘 모르겠습니다. 다양한 수의 LSB를'w2'에서'w3'으로 복사하려고합니까? – Marty

+0

예. 와이어 w1은 값을 제공하는 입력입니다. 이 값은 와이어 w2의 LSB 수를 나타냅니다. 이렇게 할 수 있습니까? – arpmon

답변

1

Verilog에서는 해당 부분이 (벡터의 일부를 선택하려면 [msb:lsb]과 같은 코드를) 선택해야합니다. 가변 크기의 비트 그룹에 액세스하려면 더 복잡한 것이 필요합니다. 여기에 한 가지 방법은 다음과

여기에 기술 (64 개)들 뒤에 64 개의 0들의 벡터를 구성하는 변수만큼 그 벡터를 시프트하고 적격으로 벡터의 일부분을 사용하는

wire [63:0] src; 
wire [6:0] k; 

wire [127:0] mask = { { 64 { 1'b0 } }, { 64 { 1'b1 } } } << k; 

wire [63:0] dest; 

assign dest = mask[127:64] & src; 
마스크를 사용하여 src에서 dest으로 전송되는 비트를 제어합니다.

귀하의 예에서는 도움이되지 않지만 알고 있어야하는 관련 개념 : Verilog-2001은 "색인 된 부품 선택"을 도입했습니다. 인덱싱 된 부분 선택은 기본 인덱스와 너비를 지정합니다. 너비는 일정해야하지만 기본 인덱스는 일정 할 필요가 없습니다. 인덱싱 된 파트 선택에 대한 구문은 vec[base+:width] 또는 vec[base-:width]입니다.

0

Verilog 2001의 부품 선택 연산자는 원하는 것을 달성하는 데 유용 할 수 있습니다.

기본적으로 Verilog는 시작 색인을 가변적으로 허용하지만 할당의 폭은 일정해야합니다. "+ :"연산자는 인덱스 값에서 위쪽으로 계수하고 "- :"에서는 반대 값을 나타냅니다.

같은 것을 할 수 있습니다. w3 [k-1 - : 8] = w2 [k-1 - : 8]을 할당 할 수 있습니다. // 여기서 8 비트는 아래쪽으로 복사됩니다.

아래 문서에서 "+ :"로 검색하십시오. 일반적으로 가변 부주의 http://www.sutherland-hdl.com/papers/2001-Wescon-tutorial_using_Verilog-2001_part1.pdf

단어, Verilog를 불량으로 간주 선택한다.

관련 문제