2009-04-18 64 views
1

我有一個簡單的verilog程序,增加一個32位計數器,使用$ sformat將數字轉換爲ASCII字符串,然後使用FTDI FT245RL一次將字符串推送到主機1字節。爲什麼XST優化我的寄存器,我該如何阻止它?

不幸的是,賽靈思XST不斷優化掉字符串寄存器向量。我嘗試了各種初始化和訪問例程,但沒有成功。我似乎無法關閉優化,並且我在網上找到的所有示例都與我的初始化例程相差甚微。我究竟做錯了什麼?對於應用 從文件 '3s100e.nph' 在 環境/opt/Xilinx/10.1/ISE 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/Latch str_0 具有恆定值0。在優化 的過程中,該FF/Latch將被修整爲 。

警告:XST:1896 - 由於其它 FF /鎖存修整,FF /鎖存str_1 具有0在塊 恆定值。在優化 的過程中,該FF/Latch將被修整爲 。

警告:XST:1896 - 由於其它 FF /鎖存修整,FF /鎖存str_2 具有0在塊 恆定值。在優化 的過程中,該FF/Latch將被修整爲 。

回答

5

$ sformat任務不太可能是可合成的 - 考慮編譯器需要生成哪些硬件來實現此功能!這意味着你的'str'寄存器永遠不會被更新,所以編譯器認爲它可以優化它。考慮一個BCD計數器,也許是一個將BCD碼轉換爲ASCII碼的查找表。

AFAIK'初始'區塊不可合成。要初始化觸發器,請使用復位信號。回憶需要像你一樣的'for'循環,但是隻有在重置之後纔會觸發。

+0

好吧!我最初並不瞭解你說的一半,但我花了最後幾分鐘查找BCD是什麼,它看起來完全像我想要的。我只需要弄清楚現在如何做查找表。我懷疑$ sformat,但編譯器沒有抱怨,它在模擬中完美運行,但我想現在我知道了。謝謝! – MrEvil 2009-04-18 18:15:21

相關問題