2009-04-18 8 views
1

私は32ビットカウンタをインクリメントし、$ sformatを使ってASCII文字列に変換した後、FTDI FT245RLを使って文字列をホストマシンに1バイトずつプッシュします。XSTでレジスタを最適化するのはなぜですか?また、どうすれば停止できますか?

残念ながら、ザイリンクス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 は、ブロック の定数値が0です。このFF /ラッチは、 の処理中に がトリムされます。

警告:XSTで:1896 - により他の にFF /ラッチトリミング、FF /ラッチstr_1が ブロック0の一定値を有します。このFF /ラッチは、 の処理中に がトリムされます。

警告:XSTで:1896 - により他の にFF /ラッチトリミング、FF /ラッチがstr_2 ブロック0の一定値を有します。このFF /ラッチは、 の処理中に がトリムされます。

答えて

5

$ sformatタスクは合成可能ではありません - コンパイラがこの機能を実装するために必要なハードウェアを考慮してください。これは、あなたの 'str'レジスタが決して更新されないことを意味するので、コンパイラはそれを最適化できると考えています。 BCDカウンタと、BCDコードをASCIIコードに変換するルックアップテーブルを考えてみましょう。

AFAIKの「初期」ブロックは合成できません。フロップを初期化するには、リセット信号を使用します。メモリはあなたのように 'for'ループを必要としますが、リセット後にのみトリガします。

+0

大丈夫です!私は最初、あなたが言ったことの半分を理解していませんでしたが、BCDが何であるかを調べるのに最後の2〜3分を費やしました。私はちょうど今ルックアップテーブルを行う方法を把握する必要があります。私は$ sformatを疑っていましたが、コンパイラは不平を言っておらず、シミュレーションでは完全に機能しましたが、私は今知っていると思います。ありがとう! – MrEvil

+1

ルックアップテーブルは簡単です。それらは 'case'ステートメントです! シミュレーションでは、何でもできます。コードをプログラムとして扱います。あなたが合成したいものについては、あなたはハードウェアを記述していることに留意しなければなりません。 – Marty

関連する問題