2014-05-21 3 views
3

이 게시물은 FFT와 관련된 이전 게시물과 관련이 있습니다.Verilog에서의 FFT 구현 : 중첩 for 루프를 사용한 오류

FFT implemetation in Verilog: Assigning Wire input to Register type array

난 FFT 버터 플라이 모듈 두번째 스테이지의 입력에 첫 번째 스테이지의 출력을 지정할. 나는 두 번째 단계의 입력에 따라 첫 번째 단계의 출력을 다시 주문해야한다. 다음은 스와핑을 구현하는 코드입니다.

[email protected] (posedge y_ndd[0] or posedge J) 
begin 

if(J==1'b1) 
begin 
    for (idx=0; idx<N/2; idx=idx+1) 
    begin 
     IN[2*idx] <= X[idx*2*X_WDTH+: 2*X_WDTH]; 
     IN[2*idx+1] <= X[(idx+N/2)*2*X_WDTH+: 2*X_WDTH]; 
    end 
end 

else 
begin 
    level=level+1; 
    modulecount=0; 
    for(jj=0;jj<N;jj=jj+(2**(level+1))) 
     begin 
     for (jx=jj; jx<jj+(2**level); jx=jx+1)//jj+(2**level) 
     begin 
      IN[modulecount] <=OUT[jx]; 
      IN[modulecount+1] <=OUT[jx+(2**level)]; 
      modulecount=modulecount+1; 
     end 
     end 
end 

end 

이렇게 합성하면 2 개의 오류가 발생합니다.

ERROR:Xst:891 - "Network.v" line 161: For Statement is only supported when the new step evaluation is constant increment or decrement of the loop variable. 
ERROR:Xst:2634 - "Network.v" line 161: For loop stop condition should depend on loop variable or be static. 

비등 증분 및 비 정적 정지 코드를 사용할 수 없습니까?

그렇다면 어떻게 처리할까요?

도움을 주시면 감사하겠습니다. 미리 감사드립니다.

+0

그러면 장치에서 이동하고 연결을 변경하는 전선이 필요합니까? – N8TRO

+0

IN은 레지스터 유형이고 OUT은 와이어 유형입니다. IN은 버터 플라이 모듈의 입력이고 OUT은 모듈의 출력입니다. 내가 언급 한 위 링크의 메인 모듈 소스 코드. – Jey

+0

모든 레벨에서 IN 값을 변경하고 싶습니다. 따라서 모든 단계에서 버터 플라이 모듈의 입력은 다양해야합니다. – Jey

답변

3

합성 도구는 루프를 풀어서 회로를 합성합니다. 따라서 일정한 횟수만큼 반복하는 루프 만이 컴파일/생성 시간에 상수를 알 수 있습니다.

중지 값을 알 수없는 경우 최대 반복 횟수를 가정하여 중지 조건으로 사용할 수 있습니다. 그러면 루프 내부 조건문 원래 정지 조건을 추가

 for (jx=jj; jx < MAX_LOOP_ITERATION; jx=jx+1)//jj+(2**level) 
     begin 
      if (jx<jj+(2**level)) // <---------- Add stop condition here 
      begin 
      IN[modulecount] <=OUT[jx]; 
      IN[modulecount+1] <=OUT[jx+(2**level)]; 
      modulecount=modulecount+1; 
      end 
     end 

을 N이 일정하지 않으면, 외부 루프는 또한 유사한 조건문을 사용하여 고정한다. 또한 증분 값을 수정하고 매번 상수 값을 추가해야합니다. 조건문을 사용하여 확인하십시오. jj==jj+(2**(level+1))

분명히, 최대 개수가 최악의 지연과 최소 클록주기를 증가시킬 수 있으므로주의해야합니다.

+0

for 루프를 해결하기위한 for 문 사이에 또 ​​하나의 if 문이 필요하다. For 문은 새로운 단계 평가는 루프 변수의 증가 또는 감소가 일정합니다. "_ – Greg

+0

@ 그렉 : 나는 내부 루프 만보고있었습니다. 외부 루프에 대한 대답을 향상 시켰습니다. – Ari

+0

감사합니다. Ari. 도움이됩니다. – Jey

1
//ll,level,K has to be declare. 
[email protected] (posedge y_ndd[0] or posedge J) 
    begin 

    if(J==1'b1) 
     begin 
     for (idx=0; idx<N/2; idx=idx+1) 
      begin 
      IN[2*idx] <= X[idx*2*X_WDTH+: 2*X_WDTH]; 
      IN[2*idx+1] <= X[(idx+N/2)*2*X_WDTH+: 2*X_WDTH]; 
     end 
    end  
    else 
     begin 
     ll=ll+1; 
     modulecount=0; 
     for(level=0;level<K;level=level+1) //K time you need to execute 
      begin 
      if(ll==level) 
       begin 
       for(jj=0;jj<N;jj=jj+(2**(level+1))) 
        begin 
        for (jx=jj; jx<jj+(2**level); jx=jx+1) 
         begin 
         IN[modulecount] <=OUT[jx]; 
         IN[modulecount+1] <=OUT[jx+(2**level)]; 
         modulecount=modulecount+1; 
        end 
       end 
      end 
     end 
      //ll=ll+1; 
    end 
end 

시도해 볼 수 있습니다. 그것은 작동해야합니다. 그러나 문제는 바깥 고리가 K 번 실행됩니다.

+0

감사합니다. Jothy. 실제로 작동합니다. – Jey