1

32ビットカウンターをインクリメントし、$ sformatを使用して数値をASCII文字列に変換し、FTDIFT245RLを使用して文字列を一度に1バイトずつホストマシンにプッシュする単純なVerilogプログラムがあります。

残念ながら、ザイリンクスXSTは文字列レジスタベクトルを最適化し続けています。さまざまな初期化およびアクセスルーチンをいじってみましたが、成功しませんでした。最適化をオフにできないようです。オンラインで見つけたすべての例は、初期化ルーチンとほとんど変わりません。私は何が間違っているのですか?

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 

環境/opt/Xilinx/10.1/ISEのファイル「3s100e.nph」からアプリケーションRf_Deviceのデバイスをロードしています。警告:Xst:1293-FF /ラッチstr_0のブロックでは、定数値が0です。このFF/ラッチは、最適化プロセス中にトリミングされます。

警告:Xst:1896-他のFF /ラッチトリミングのため、FF/ラッチstr_1のブロックでは定数値が0になります。このFF/ラッチは、最適化プロセス中にトリミングされます。

警告:Xst:1896-他のFF /ラッチトリミングのため、FF/ラッチstr_2のブロックでは定数値が0になります。このFF/ラッチは、最適化プロセス中にトリミングされます。

4

1 に答える 1

6

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

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

于 2009-04-18T17:56:56.587 に答える