2009-04-18 3 views
1

나는 32 비트 카운터를 증가시키고 $ sformat을 사용하여 숫자를 ASCII 문자열로 변환 한 다음 FTDI FT245RL을 사용하여 문자열을 호스트 컴퓨터에 1 바이트 씩 푸시하는 간단한 Verilog 프로그램을 가지고있다.XST가 내 레지스터를 최적화하지 못하는 이유는 무엇입니까? 어떻게 중지합니까?

불행히도 Xilinx XST는 문자열 레지스터 벡터를 최적화합니다. 나는 성공적이지 못한 다양한 초기화 및 액세스 루틴을 시도해 보았다. 최적화를 해제 할 수없는 것처럼 보였습니다. 온라인에서 찾은 모든 예제는 초기화 루틴과 거의 다릅니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 환경 /opt/Xilinx/10.1/ISE에서 파일 '3s100e.nph'에서 응용 프로그램 Rf_Device에 대한

module counter(CK12, TXE_, WR, RD_, LED, USBD); 

    input CK12; 
    input TXE_; 
    output WR; 
    output RD_; 
    output [7:0] LED; 
    inout [7:0] USBD; 

    reg [31:0] count = 0; 

    reg [7:0] k; 
    reg wrf = 0; 
    reg rd = 1; 
    reg [7:0] lbyte = 8'b00000000; 

    reg td    = 1; 
    parameter MEM_SIZE = 88; 
    parameter STR_SIZE = 11; 
    reg [MEM_SIZE - 1:0] str; 
    reg [7:0] strpos = 8'b00000000; 

    initial 
    begin 
     for (k = 0; k < MEM_SIZE; k = k + 1) 
      begin 
      str[k] = 0; 
      end 
    end 

    always @(posedge CK12) 
    begin 
     if (TXE_ == 0 && wrf == 1) 
      begin 
      count = count + 1; 
      wrf   = 0; 
      end 


     else if (wrf == 0) // If we've already lowered the strobe, latch the data 
      begin 
      if(td) 
       begin 
        $sformat(str, "%0000000000d\n", count); 
        strpos = 0; 
        td  = 0; 
       end 

      str  = str << 8; 
      wrf   = 1; 
      strpos  = strpos + 1;  

      if(strpos == STR_SIZE) 
       td  = 1; 

      end  
    end 

    assign RD_    = rd; 
    assign WR    = wrf; 
    assign USBD   = str[87:80]; 
    assign LED    = count[31:24]; 

endmodule 

로드 장치. 경고 : Xst : 1293 - FF/래치 str_0 블록의 상수 값은 입니다. 이 FF/래치는 프로세스 동안 최적화 된 입니다.

WARNING : XST : 1,896 - 인해 다른 으로 FF/래치 트리밍 FF/래치 str_1 블록 0의 정수 값을 갖는다. 이 FF/래치는 프로세스 동안 최적화 된 입니다.

WARNING : XST : 1,896 - 인해 다른 으로 FF/래치 트리밍 FF/래치 str_2 블록 0의 정수 값을 갖는다. 이 FF/래치는 프로세스 동안 최적화 된 입니다.

답변

5

$ sformat 작업은 합성 가능하지 않습니다. 컴파일러가이 기능을 구현하기 위해 생성해야하는 하드웨어를 고려하십시오! 이것은 'str'레지스터가 결코 업데이트되지 않는다는 것을 의미하므로 컴파일러는이를 최적화 할 수 있다고 생각합니다. BCD 카운터와 ASCII 코드로 BCD 코드를 변환하는 룩업 테이블을 고려해보십시오.

AFAIK '초기'블록은 합성 할 수 없습니다. 플립을 초기화하려면 리셋 신호를 사용하십시오. 추억에는 'for'루프가 필요하지만 리셋 후에 만 ​​트리거됩니다.

+0

좋아! 나는 처음에 당신이 말한 것의 절반을 이해하지 못했지만, BCD가 무엇인지를 찾는 데 지난 몇 분을 보냈습니다. 그리고 그것은 제가 원하는 것과 똑같이 보입니다. 이제 조회 테이블을 수행하는 방법을 알아야합니다. 나는 $ sformat을 의심했지만 컴파일러는 불평하지 않고 시뮬레이션에서 완벽하게 작동했다. 그러나 나는 지금 알고 있다고 생각한다. 감사! – MrEvil

+1

조회 테이블은 쉽습니다 - 그들은'case' 문장입니다! 시뮬레이션에서, 당신은 무엇이든 할 수 있습니다 - 그것은 코드를 프로그램으로 다룰 것입니다. 합성을 원한다면 프로그래밍과 같이 하드웨어를 기술한다는 것을 명심해야합니다. – Marty

관련 문제